Потихоньку осваиваем 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.