Как сохранить xlsx с помощью openpyxl и получить правильную кодировку? [ненужные символы]

#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 в нем.