将unicode字符串写入Excel 2007

Rym*_*Rym 7 python unicode excel pyodbc openpyxl

我正在使用连接到MS SQL服务器pyodbc.此外,我正在尝试使用写入Excel 2007/10 .xlsx文件openpyxl.

这是我的代码(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()
Run Code Online (Sandbox Code Playgroud)

这是有效的,至少直到我遇到一个客户,例如,名称:"mún".我的代码没有失败,一切都写入Excel,一切都很好.直到我实际打开Excel文件 - 这会导致错误,说明文件已损坏且需要修复.修复文件后,所有数据都将丢失.

我知道代码适用于具有常规名称(仅ASCII)的客户,只要有重音字符或Excel文件被破坏的任何内容.

我试图打印一行(有一个困难的客户名称).这是结果:

row是一个元组,这个索引之一:'Mee\xf9s Tilburg'所以要么写\xf9 (ú)字符会导致错误,要么MS Excel无法应对它.我已经尝试了将行编码为unicode(unicode(row,'utf-8')u''.join(row))等的各种方法,但没有任何作用.要么我尝试愚蠢的东西导致错误,或Excel文件仍然错误.

有任何想法吗?

Rym*_*Rym 5

最后我找到了两个解决方案:

第一个是将光标给出的行转换为列表,并解码列表中的元素:

for row in cursor:
    l = list(row)
    l[5] = l[5].decode('ISO-8859-1')
    (do this for all neccesary cols)
    ws.append(l)
Run Code Online (Sandbox Code Playgroud)

我认为这将是地狱,因为有6列需要转换为unicode,并且有120k行,但实际上一切都非常快!最后,很明显我可以/应该只将sql语句中的数据转换为unicode(cast(x as nvarchar)AS y),这使得替换成为不必要的.我没想到这首先是因为我认为它实际上是在unicode中提供数据.我的错.