将Unicode字符串写入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()
这个方法是有效的,至少在我遇到一个客户名字,比如说 "mún"
之前,一切都正常。我的代码没有出错,所有数据都写入了 Excel,没问题。直到我打开 Excel 文件时,出现了一个错误,提示文件损坏,需要修复。修复后,所有数据都丢失了。
我知道这个代码对那些名字普通的客户(只有 ASCII 字符)是有效的,但只要名字里有重音符号或其他特殊字符,Excel 文件就会损坏。
我尝试打印一行数据(包含一个复杂的客户名字)。结果是:
row
是一个元组,这里有一个索引: 'Mee\xf9s Tilburg'
。所以,要么是写入 \xf9 (ú)
这个字符导致了错误,要么是 MS Excel 无法处理这个字符。我尝试了多种方法将一行数据编码为 Unicode(比如 unicode(row,'utf-8')
或 u''.join(row)
等等),但都没有成功。要么我尝试的东西很傻,导致错误,要么 Excel 文件还是出错。
有没有什么想法?
2 个回答
你可以使用 encode()
来把unicode转换成字符串:
l=[u'asd',u'qw',u'fdf',u'sad',u'sadasd']
l[4]=l[4].encode('utf8')
最后我找到了两个解决方案:
第一个是把游标给的那一行数据转换成一个列表,然后把列表里的每个元素解码:
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),这样就不需要再做替换了。一开始我没想到这一点,因为我以为数据本身就是unicode格式的。真是我的失误。