Я подключаюсь к серверу MS SQL, используя pyodbc
. Кроме того, я пытаюсь написать файл Excel 2007/10 .xlsx
с помощью openpyxl
.Запись строк unicode в Excel 2007
Это мой код (Python 2.7):
import pyodbc
from openpyxl import Workbook
cnxn = pyodbc.connect(host = 'xxx',database='yyy',user='zzz',password='ppp')
cursor = cnxn.cursor()
sql = "SELECT TOP 10 [customer clientcode] AS Customer, \
[customer dchl] AS DChl, \
[customer name] AS Name, \
...
[name3] AS [name 3] \
FROM mydb \
WHERE [customer dchl] = '03' \
ORDER BY [customer id] ASC"
#load data
cursor.execute(sql)
#get colnames from openpyxl
columns = [column[0] for column in cursor.description]
#using optimized_write cause it will be about 120k rows of data
wb = Workbook(optimized_write = True, encoding='utf-8')
ws = wb.create_sheet()
ws.title = '03'
#append column names to header
ws.append(columns)
#append rows to
for row in cursor:
ws.append(row)
wb.save(filename = 'test.xlsx')
cnxn.close()
Этот работает, по крайней мере, вплоть до того момента, я сталкиваюсь клиента с, например, имя: "mún"
. Мой код не подводит, все пишет в Excel, и все в порядке. То есть до тех пор, пока я действительно не открою файл Excel, это вызывает ошибку, заявляя, что файл поврежден и нуждается в ремонте. После восстановления файла все данные будут потеряны.
Я знаю, что код работает для клиентов с обычными именами (только ASCII), это сразу же, когда есть символ с акцентом или что-либо, что файл Excel поврежден.
Я попытался напечатать один ряд (со сложным названием cust). Это результат:
row
является кортежем, и это один из показателей: 'Mee\xf9s Tilburg'
Так что либо писать \xf9 (ú)
характер вызывает ошибку, или MS Excel не может справиться с ней. Я пробовал различные способы кодирования строки в unicode (unicode(row,'utf-8')
или u''.join(row)
) и т. Д., Хотя ничего не работает. Либо я пробую что-то идиотское, приводящее к ошибке, либо файл Excel все еще ошибки.
Любые идеи?
Строка подключения может показаться странным, так как я пытался тестирование различных способов сервера, этот экземпляр он был pmssql. Но моя проблема не в подключении! – Rym
Не точный дубликат вашей проблемы, но вы можете найти решение здесь: http://stackoverflow.com/questions/9148221/reading-unicode-from-sqlite-db-using-python –
Невозможно воспроизвести с помощью 'pyodbc 3.0 .6' и 'openpyxl 1.6.1'. 'mún' закодирован как' u'm \ xfan'' в курсоре. – Bryan