这是我在这个论坛上的第一个问题。我是python的初学者。
问题:我正在尝试从表中检索DB2(IBM I)数据并写入excel表(.xls)。为了获取数据,我使用pyodbc并写入excel,使用xlwt模块。 Col4拥有中国特色。我知道col4 CCSID是935并且pyodbc从数据库中检索数据,但是当我将此值写入excel表时,它会抛出以下错误消息。如果我打印它,则是来自dset1的数据。怎么把它写成excel而没有任何问题?
0(十进制('6331840'),'RUBO','587','\ x0e \ xa3 \ x1a \ x1a \ x1a',十进制('175'),十进制('3716')) 1(十进制('6331841'),'RUBO','587','\ x0e \ xa3 \ x1a \ x1a \ x1a',十进制('24'),十进制('340')) 2(十进制('6331842'),'RUBO','587','\ x0e \ xa3 \ x1a \ x1a \ x1a',十进制('100'),十进制('1821'))
File "C:\Python27\Tools\john\EOD_CMR report.py", line 82, in <module>
sh.write(n, i, val)
File "C:\Python27\lib\site-packages\xlwt\Worksheet.py", line 1030, in write
self.row(r).write(c, label, style)
File "C:\Python27\lib\site-packages\xlwt\Row.py", line 259, in write
raise Exception("Unexpected data type %r" % type(label))
Exception: Unexpected data type <type 'pyodbc.Row'>
import pyodbc
import os
import sys, traceback
import xlwt
#initiate excel
book = xlwt.Workbook()
sh = book.add_sheet('sheet1')
#get today date YYYYMMDD
now = datetime.datetime.now() # get today's date
today = str(now.year) + str(now.month).zfill(2) + str(now.day).zfill(2)
#SQL statement
sql1 = """SELECT col1, col2, col3, trim(col4)FROM lib.file WHERE date = %s""" % today
con_string = "Driver={iSeries Access ODBC Driver};System=veet;Database=veet;UID=" + user_id + ";pwd=" + password + ";SSL=YES;unicode_results=True"
cnxn = pyodbc.connect(con_string)
cur = cnxn.cursor()
# get the data
dset1 = cur.execute(sql1).fetchall()
cur.close()
# to write column name
x = ['Packlist', 'Carrier', 'Hub', 'City', 'Carton amount', 'DU']
n = 0
for i, hdr in enumerate(x):
sh.write(n,i,hdr)
for i, val in enumerate(dset1):
n+=1
sh.write(n, i, val)
name = today + 'xls'
book.save(name)
有关此问题的最新消息: 我终于解决了这个问题。下面是隐藏的bug .. 1.第一个技巧是在ODBC驱动程序本身中使用Microsoft unicode value = CCSID 1386对检索到的数据进行编码。
con_string = "Driver={iSeries Access ODBC Driver};System=veet;Database=veet;UID=" + user_id + ";pwd=" + password + ";SSL=YES;unicode_results=True;CCSID=1386"
第二个是在工作簿启动期间使用xlwt解码此值,如下所示。
book = xlwt.Workbook(encoding =“gb2312”)
参考:http://docs.python.org/2/library/codecs.html#standard-encodings
感谢所有人给我一些指示