将Unicodestring写入Excel 2007
我正在使用pyodbc
连接到MS SQL服务器。 此外,我正在尝试使用openpyxl
写入Excel 2007/10 .xlsx
文件。
这是我的代码(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()
这个工作 ,至less直到我遇到一个客户,例如,名字: "mún"
。 我的代码不会失败,一切写入Excel,一切都很好。 直到我真正打开Excel文件 – 这会导致错误,说该文件已损坏,需要修复。 修复文件时,所有数据都将丢失。
我知道代码适用于具有常规名称(仅ASCII)的客户,只要有重音字符或Excel文件被损坏的任何东西。
我试图打印一行(与一个困难的客户名称)。 这是结果:
row
是一个元组,并且这个索引之一: 'Mee\xf9s Tilburg'
因此,写入\xf9 (ú)
字符会导致错误,或者MS Excel无法应付它。 我尝试过用unicode( unicode(row,'utf-8')
或u''.join(row)
)等编码行的各种方式,尽pipe没有任何作用。 要么我尝试一些白痴导致错误,或Excel文件仍然错误。
有任何想法吗?
最后我发现了两个解决scheme:
首先是将光标给出的行转换为列表,并对列表中的元素进行解码:
for row in cursor: l = list(row) l[5] = l[5].decode('ISO-8859-1') (do this for all neccesary cols) ws.append(l)
我认为这将是地狱,因为有6列需要转换到Unicode,并有12万行,虽然一切都非常快实际! 最后很明显,我可以/只应该在sql语句中的数据转换为unicode(cast(x as nvarchar)AS y),这使得replace是不必要的。 起初我并没有想到这一点,因为我认为它实际上是以unicode提供数据。 我的错。
您可以使用encode()
将unicode转换为string:
l=[u'asd',u'qw',u'fdf',u'sad',u'sadasd'] l[4]=l[4].encode('utf8')