これは、このフォーラムでの最初の質問です。私はpythonの初心者です。
質問: テーブルから DB2 (IBM I) データを取得し、Excel シート (.xls) に書き込もうとしています。データを取得するにはpyodbcを使用しており、Excelに書き込むにはxlwtモジュールを使用しています。Col4 は漢字を保持します。col4 CCSIDが935で、pyodbcがDBからデータをそのまま取得することはわかっていますが、この値をExcelシートに書き込むと、次のエラーメッセージがスローされます.以下は、印刷した場合のdset1からのデータです. これを問題なくExcelに書き込むにはどうすればよいですか?
0 (10 進数 ('6331840')、'ルボ'、'587'、'\x0e\xa3\x1a\x1a\x1a'、10 進数 ('175')、10 進数 ('3716')) 1 (10 進数 ('6331841) '), 'RUBO', '587 ', '\x0e\xa3\x1a\x1a\x1a', Decimal('24'), Decimal('340')) 2 (Decimal('6331842'), 'RUBO' , '587 ', '\x0e\xa3\x1a\x1a\x1a', Decimal('100'), Decimal('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)
問題の更新: 最終的に問題を解決しました。以下は、隠れたバグです。
con_string = "Driver={iSeries Access ODBC Driver};System=veet;Database=veet;UID=" + user_id + ";pwd=" + password + ";SSL=YES;unicode_results=True;CCSID=1386"
2 つ目は、以下のようにワークブックの開始時に xlwt を使用してこの値をデコードすることです。
本 = xlwt.Workbook(encoding="gb2312")
参照: http://docs.python.org/2/library/codecs.html#standard-encodings
これについていくつかの指示をくれてありがとう