python excel:汉字的数据类型问题
这是我在这个论坛上的第一个问题。我是python的初学者 问题:我正在尝试从表中检索DB2(IBM I)数据并写入excel工作表(.xls)。为了得到数据,我使用pyodbc并将其写入excel,使用xlwt模块。 Col4具有中文字符。我知道col4 CCSID是935,pyodbc按原样从DB中检索数据,但当我将此值写入excel工作表时,它会抛出以下错误消息。下面是dset1中的数据(如果我打印)。如何在没有任何问题的情况下将其写入excel 0(十进制('6331840'),'RUBO','587','\x0e\xa3\x1a\x1a\x1a\x1a',十进制('175'),十进制('3716')) 1(十进制('6331841'),'RUBO','587','\x0e\xa3\x1a\x1a\x1a\x1a',十进制('24'),十进制('340')) 2(十进制('6331842'),'RUBO','587','\x0e\xa3\x1a\x1a\x1a\x1a',十进制('100'),十进制('1821')) 参考:python excel:汉字的数据类型问题,python,Python,这是我在这个论坛上的第一个问题。我是python的初学者 问题:我正在尝试从表中检索DB2(IBM I)数据并写入excel工作表(.xls)。为了得到数据,我使用pyodbc并将其写入excel,使用xlwt模块。 Col4具有中文字符。我知道col4 CCSID是935,pyodbc按原样从DB中检索数据,但当我将此值写入excel工作表时,它会抛出以下错误消息。下面是dset1中的数据(如果我打印)。如何在没有任何问题的情况下将其写入excel 0(十进制('6331840'),'RUBO
谢谢大家在这方面给了我一些指导您能从问题中消除Excel或ODBC吗?我的猜测是,问题是基于编码的,但很难判断哪部分有问题,只是它们不匹配。另外,“意外数据类型”的类型是什么?您是否能够更改字符的编码?CCSID 935不是标准Python库()所涵盖的编码之一,因此您必须为其找到或编写自定义编解码器。最终,
xlwt
需要输入Unicode对象或按声明编码的bytestring(它将使用Python的标准选择对其进行解码),因此在写入之前,您的基本路径应该是将bytestring中的col4值解码到Unicode对象中,dset
将是一个行列表,其中每一行都是一个类似元组的对象。您不能直接使用xlwt编写它们,这可能就是您遇到异常的原因。您需要一个嵌套for循环-for rownum,row in enumerate(dset1):for colnum,val in enumerate(row):sh.write(rownum,colnum,val)
。这与编码困难无关(这将是一个真正的问题),但仍然很重要。嵌套for循环中的另一个修改-rownum
需要从1开始,而不是从0开始,因为您要将标题写入第0行sh.write(rownum+1
可以这样做,或者直接跟踪它并在每个for循环中递增,就像您试图使用n
@Ulrich Eckhardt所做的那样,意外的数据类型字符串及其CCSID在DB2中为935
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)
con_string = "Driver={iSeries Access ODBC Driver};System=veet;Database=veet;UID=" + user_id + ";pwd=" + password + ";SSL=YES;unicode_results=True;CCSID=1386"