Python 解决中文写入Excel时抛异常的问题

  • Post category:Python

当我们使用Python将中文写入Excel表格时,有可能会遇到 UnicodeDecodeError 或编码格式错误的异常。这是因为Excel表格默认使用的编码类型是 ASCII,而中文等非 ASCII 字符需要使用其他编码格式来保存。

为了解决这个问题,我们需要做以下几步:

1. 安装第三方库 openpyxl

openpyxl是一个用于读写Excel文件的Python库,支持xlsx/xlsm/xltx/xltm等格式的文件。使用pip安装:

pip install openpyxl

2. 指定编码类型

在写入数据前,指定编码类型为 utf-8。例如:

import openpyxl

wb = openpyxl.Workbook()
ws = wb.active
ws.cell(row=1, column=1, value='你好') #写入中文字符
wb.save('test.xlsx', encoding='utf-8') #指定编码类型为 utf-8

3. 示例说明

示例1:

假如我们有以下的数据,要将它存储到一个Excel表格中:

data = [
    ('张三', '男', 28, '北京'),
    ('李四', '女', 25, '上海'),
    ('王五', '男', 32, '广州')
]

如果不指定编码类型,直接写入表格中,可能会抛出异常。

import openpyxl

wb = openpyxl.Workbook()
ws = wb.active
data = [
    ('张三', '男', 28, '北京'),
    ('李四', '女', 25, '上海'),
    ('王五', '男', 32, '广州')
]

for row in range(1,len(data)+1):
    for col in range(1,len(data[0])+1):
        ws.cell(row=row,column=col,value=data[row-1][col-1])
wb.save('test.xlsx')

在上述代码中,我们使用 openpyxl 的 Workbook 类来创建一个空的工作表。然后,我们使用 active 属性来获取并操作默认的工作表。迭代 data 中的每一个子元组,分别将它们写入Excel表格中的每一行,并在关闭文件前保存 workbook。

运行上述代码,会出现 UnicodeDecodeError 的异常。这是因为中文字符无法被默认的 ASCII 编码格式保存在Excel表格中。

现在,我们在上面这个代码的末尾,加上encoding参数,指定编码类型为 utf-8:

import openpyxl

wb = openpyxl.Workbook()
ws = wb.active
data = [
    ('张三', '男', 28, '北京'),
    ('李四', '女', 25, '上海'),
    ('王五', '男', 32, '广州')
]

for row in range(1,len(data)+1):
    for col in range(1,len(data[0])+1):
        ws.cell(row=row,column=col,value=data[row-1][col-1])
wb.save('test.xlsx', encoding='utf-8')

现在再次运行这段代码,我们可以成功地将 data 内容写入Excel表格。

示例2:

假如我们有一个包含中文字符的字符串,要将它保存到Excel表格的单元格中:

text = '世界,你好!'

如果直接写入表格中,会抛出类似下面这样的异常:

openpyxl.utils.exceptions.IllegalCharacterError: 'U+4E16' is not a valid character in Excel

因此,我们需要使用openpyxl中的utils模块中的函数来帮助我们进行转码并将它存储到Excel表格中。具体代码如下:

import openpyxl
from openpyxl.utils import get_column_letter

text = '世界,你好!'
wb = openpyxl.Workbook()
ws = wb.active
ws['A1'] = text.encode('utf-8')
wb.save('test.xlsx', encoding='utf-8')

在上述代码中,我们使用了 get_column_letter() 函数来获取Excel表中相应列的字母表示。接下来,我们将 text 字符串编码为 utf-8 格式,并将其存储在 A1 单元格中。

最后加上 encoding 参数,指定编码类型为 utf-8,就可以避免出现类似的异常了。