【问题标题】:Writing unicode strings to Excel 2007将 unicode 字符串写入 Excel 2007
【发布时间】:2013-03-08 15:01:26
【问题描述】:

我正在使用pyodbc 连接到 MS SQL 服务器。此外,我正在尝试使用 openpyxl 写入 Excel 2007/10 .xlsx 文件。

这是我的代码(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 是一个元组,其中一个索引是:'Mee\xf9s Tilburg' 因此,写入 \xf9 (ú) 字符会导致错误,或者 MS Excel 无法处理它。我尝试了各种将行编码为 un​​icode(unicode(row,'utf-8')u''.join(row))等的方法,但没有任何效果。要么我尝试一些愚蠢的方法导致错误,要么 Excel 文件仍然错误。

有什么想法吗?

【问题讨论】:

  • 连接字符串可能看起来很奇怪,因为我也尝试过测试服务器的不同方式,这个实例是 pmssql。但我的问题不在于连接!
  • 与您的问题不完全相同,但您可能会在这里找到解决方案:stackoverflow.com/questions/9148221/…
  • 无法使用pyodbc 3.0.6openpyxl 1.6.1 进行复制。 mún 在光标中编码为u'm\xfan'
  • 奇怪,虽然没有 u,但我也得到了 'm\xfan',这导致了各种问题。将我的数据转换为 nvarchar 解决了这个问题(我现在只会看到 u'mún')。不过还是谢谢你看

标签: python excel unicode pyodbc openpyxl


【解决方案1】:

最后我找到了两个解决方案:

第一个是将光标给定的行转换为列表,并解码列表中的元素:

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

我认为这将是地狱,因为有 6 列需要转换为 unicode,并且有 120k 行,尽管实际上一切都进行得很快!最后很明显,我可以/应该将 sql 语句中的数据转换为 unicode ( cast(x as nvarchar) AS y),这使得替换变得不必要。起初我没有想到这一点,因为我认为它实际上是以 unicode 提供数据。我的错。

【讨论】:

  • 您的问题包含一个带有\xf9 的示例,它不是有效的UTF-8。太糟糕了,你花了这么长时间才意识到这一点。
【解决方案2】:

您可以使用encode()将unicode转换为字符串:

l=[u'asd',u'qw',u'fdf',u'sad',u'sadasd']
l[4]=l[4].encode('utf8')

【讨论】:

  • 它没有提供好的答案。请解释您的代码,并修正您的拼写错误
猜你喜欢
  • 2019-09-04
  • 1970-01-01
  • 2015-04-18
  • 2011-03-17
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
相关资源
最近更新 更多