#python #excel #encoding #sqlalchemy #openpyxl
#python #excel #кодирование #sqlalchemy #openpyxl
Вопрос:
Я получаю результаты из базы данных MYSQL и сохраняю данные в XLSX, используя библиотеку openpyxl. После сохранения и открытия файла все имена с любыми специальными символами, полными неправильных символов. Я полагаю, что это какая-то проблема с кодировкой, но я просто не могу найти способ установить кодировку при открытии или сохранении книги.
Я уже пытался использовать:
wb =Workbook(encoding='utf8')
Но затем я получаю сообщение об ошибке с неожиданным аргументом ключевого слова, и я понятия не имею, что еще я могу попробовать.
Часть кода, которая касается записи данных результата запроса в Excel, находится здесь:
wb = Workbook()
ws = wb.create_sheet(0)
ws.append(res.keys())
x = res.fetchall()
xlength = len(x)
ylength = len(x[0])
for i in range(xlength):
for k in range(ylength):
ws.cell(row=(i 2), column=(k 1)).value = x[i][k]
wb.save('Documents/python pigu_lt/reports/cache/{}'.format(query_type) ".xlsx")
Мой фактический результат:
'Vaikams ir kūdikiams'
И мой ожидаемый результат:
'Vaikams ir kūdikiams'
Кто-нибудь знает, как это сделать правильно?
Ответ №1:
Это имеет мало общего с openpyxl и все, что связано с MySQL и тем, как вы подключаетесь к нему. XLSX хранит данные в XML, который по умолчанию является UTF8, и поэтому способен представлять все символы Юникода. Вы должны проверить настройки для базы данных и убедиться, что она возвращает либо unicode, либо utf8.
Комментарии:
1. Я бы согласился.
Å«
является ли iso-8859-1 декодированием байтов 0xc5 0xab, именно так кодируется UTF-8ū
. Таким образом, подключение к БД, вероятно, настроено как iso-8859-1 или что-то подобное (или, что еще хуже, данные были искажены перед сохранением в БД). Также обратите внимание, что «utf8» в MySQL на самом деле не является utf8 (он обрабатывает только базовую многоязычную панель, вам нужен utf8mb4).2. Да, какая-то ерунда в формате utf8 -> latin-1, вероятно, происходит до того, как данные достигают openpyxl. Предположительно, драйвер по умолчанию использует Latin1. Как часто мы это видим? Только сегодня я получил сгенерированный PDF-файл с беспорядком utf8 — latin1 в нем.