を使用して 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 ファイルでまだエラーが発生します。
何か案は?