7

を使用して MS SQL サーバーに接続していますpyodbc.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はタプルで、これはインデックスの 1 つです。'Mee\xf9s Tilburg'したがって、文字を書き込むと\xf9 (ú)エラーが発生するか、MS Excel が処理できません。行をユニコード(unicode(row,'utf-8')またはu''.join(row))などにエンコードするさまざまな方法を試しましたが、何も機能しません。何かばかげたことを試みてエラーが発生するか、Excel ファイルでまだエラーが発生します。

何か案は?

4

2 に答える 2

5

結局、私は2つの解決策を見つけました:

最初のものは、カーソルによって指定された行をリストに変換し、リスト内の要素をデコードしていました:

for row in cursor:
    l = list(row)
    l[5] = l[5].decode('ISO-8859-1')
    (do this for all neccesary cols)
    ws.append(l)

Unicode への変換が必要な列が 6 つあり、行が 120,000 あったので、これは地獄だと思いましたが、実際にはすべてが非常に高速でした! 最終的に、SQL ステートメントのデータをユニコード ( cast(x as nvarchar) AS y) にキャストできる/すべきであることが明らかになり、置換が不要になりました。最初はこれについて考えませんでした。実際にはユニコードでデータを提供していると思ったからです。私の悪い。

于 2013-03-11T14:40:31.383 に答える
-1

encode()Unicode を文字列に変換するために使用できます。

l=[u'asd',u'qw',u'fdf',u'sad',u'sadasd']
l[4]=l[4].encode('utf8')
于 2015-12-11T10:13:39.753 に答える