我使用pyodbc
连接到MS SQL服务器。此外,我正在尝试使用.xlsx
写入Excel 2007/10 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()
此有效,至少在我遇到客户时,例如名称为"mún"
。我的代码没有失败,一切都写入Excel,一切都很好。直到我实际打开Excel文件 - 这会导致错误,说明文件已损坏且需要修复。修复文件后,所有数据都将丢失。
我知道代码适用于具有常规名称(仅限ASCII)的客户,只要有重音字符或Excel文件损坏的任何内容。
我试图打印一行(使用困难的商品名称)。这是结果:
row
是一个元组,这个索引之一:'Mee\xf9s Tilburg'
因此,编写\xf9 (ú)
字符会导致错误,或者MS Excel无法处理它。我已经尝试了将行编码为unicode(unicode(row,'utf-8')
或u''.join(row)
)等的各种方法,但没有任何作用。要么尝试愚蠢的事情导致错误,要么Excel文件仍然出错。
有什么想法吗?
答案 0 :(得分: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)
我认为这本来就是地狱,因为有6列需要转换为unicode,并且有120k行,但实际上一切都非常快!最后,很明显我可以/应该只将sql语句中的数据转换为unicode(cast(x as nvarchar)AS y),这使得替换成为不必要的。我没想到这首先是因为我认为它实际上是在unicode中提供数据。我的坏。
答案 1 :(得分:-1)
您可以使用encode()
将unicode转换为字符串:
l=[u'asd',u'qw',u'fdf',u'sad',u'sadasd']
l[4]=l[4].encode('utf8')