openpyxl: проблема с кодировкой xlsx-файла при выводе на печать с помощью format

May 25, 2012 09:36

Потихоньку осваиваем openpyxl. Пока запнулся на следующей проблеме (которая, строго говоря, прямо к openpyxl) не относится.
Итак, имеем код:
>>> from openpyxl import load_workbook
>>> w = load_workbook(filename='base.xlsm', use_iterators=True) # Важно! Используем use_iterators, так как файл большой
>>> sh = w.get_active_sheet() # Вследствие использования use_iterators, сейчас sh - это IterableWorksheet
>>> for row in sh.iter_rows(range_string='A1:C4'):
>>>     for cell in row:
>>>         print '{0}{1}) {2}'.format(cell.column, cell.row, cell.internal_value)

В результате получаем ошибку:

Traceback (most recent call last):
File "", line 1, in
File "chsql.py", line 71, in make_sh
print '{0}{1}) {2}'.format(cell.column, cell.row, cell.internal_value)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)

Эта ошибка возникает, когда программа натыкается в ячейке на русский текст, то есть на кириллицу.

Пока имею в активе эти два поста:
1) http://habrahabr.ru/post/117236/
2) http://shum-beliy.livejournal.com/733.html

Рассчитываю, что второй пост мне поможет решить проблему, как и вообще навести в голове порядок с кодировками...

P.S. Есть еще эти ссылки: 3) http://www.linux.org.ru/forum/development/4004465 4) http://www.joelonsoftware.com/articles/Unicode.html

---------------------------------------------------
РЕШЕНИЕ

Все оказалось очень просто:

>>> for row in sh.iter_rows(range_string='A1:C4'): >>> for cell in row: >>> try: >>> print '{0}{1}) {2}'.format(cell.column, cell.row, cell.internal_value) >>> except: >>> print '{0}{1}) {2}'.format(cell.column, cell.row, cell.internal_value.encode('utf8')) И еще кое-что:
>>> from openpyxl import load_workbook >>> w = load_workbook(filename='filename.xlsx', use_iterators=True) >>> sh = w.get_sheet_by_name('название_страницы'.decode('utf8')) Ключ в операциях encode/decode. По крайней мере, это верно для комбинации Ubuntu/Python.

python

Previous post Next post
Up