通过Python库pyExcelerator/xlwt向Excel表格写入特殊字符
任务:
我使用一个叫做pyExcelerator的Python库(类似于xlwt)从csv文件生成格式化的Excel表格。我需要能够写出小于等于(≤)和大于等于(≥)的符号。
目前为止:
我可以将我的表格保存为UTF-8编码的csv文件,这样在我的文本编辑器中就能看到特殊字符。我在Python源代码中添加了以下一行:
#! /usr/bin/env python
# -*- coding: UTF-8 -*-
问题:
但是,在pyExcelerator的字体类中没有选择UTF-8作为字体的选项。唯一的选项是:
CHARSET_ANSI_LATIN = 0x00
CHARSET_SYS_DEFAULT = 0x01
CHARSET_SYMBOL = 0x02
CHARSET_APPLE_ROMAN = 0x4D
CHARSET_ANSI_JAP_SHIFT_JIS = 0x80
CHARSET_ANSI_KOR_HANGUL = 0x81
CHARSET_ANSI_KOR_JOHAB = 0x82
CHARSET_ANSI_CHINESE_GBK = 0x86
CHARSET_ANSI_CHINESE_BIG5 = 0x88
CHARSET_ANSI_GREEK = 0xA1
CHARSET_ANSI_TURKISH = 0xA2
CHARSET_ANSI_VIETNAMESE = 0xA3
CHARSET_ANSI_HEBREW = 0xB1
CHARSET_ANSI_ARABIC = 0xB2
CHARSET_ANSI_BALTIC = 0xBA
CHARSET_ANSI_CYRILLIC = 0xCC
CHARSET_ANSI_THAI = 0xDE
CHARSET_ANSI_LATIN_II = 0xEE
CHARSET_OEM_LATIN_I = 0xFF
这些字符集里有没有包含小于等于和大于等于的符号?如果有的话,具体是哪个?
与这些字符集对应的Python编码名称是什么?
有没有其他方法可以生成这些特殊字符?
3 个回答
(1) 回复:"""我可以把我的表格保存为UTF-8编码的csv文件,这样我就能在文本编辑器中查看特殊字符,只需要在我的Python源代码中添加以下两行:
#! /usr/bin/env python
# -*- coding: UTF-8 -*-
"""
能够以UTF-8编码写入文件,并不依赖于写这个文件的程序源代码使用什么编码!
(2) UTF-8是一种编码方式,不是字体。Excel中的字体记录里的那些字符集是过去的遗留物。根据我所知道的,没有xlwt的用户觉得需要使用默认以外的字符集。只要像Jason演示的那样,把unicode对象传给xlwt就可以了……如果你的系统上有合适的字体(看看能否在OpenOffice Calc中显示这些字符),那么就没问题。
(3) 有什么特别的原因选择使用pyExcelerator而不是xlwt吗?
这段内容是说,下面的方法可以帮助你用 UTF-8
字符来写文件,使用的是 pyexcelerator 或 xlwt 这个工具:
wb = xlwt.Workbook(**encoding='utf-8'**)
补充:
看起来这个方法在 pyexcelerator 上不太管用,但我还没有确认过。
你可能想得太复杂了。字体本身其实没什么关系,但字符编码可能会有影响。
不管怎样,我用xlwt这个工具写了个脚本,成功创建了一个Excel表格,里面有小于等于和大于等于的符号:
import xlwt
wb = xlwt.Workbook()
ws = wb.add_sheet('Test Sheet')
lte = u'\u2264'
gte = u'\u2265'
ws.write(0,0,lte+gte)
wb.save('foo.xls')
需要注意的是,-- coding: utf-8 -- 这一行其实不是必须的,因为特殊字符已经用它们的unicode数字编码了。一般来说,我建议尽量使用unicode。
你也可以使用utf-8,并直接在Python代码中输入这些字符。这样做和之前的方式基本一样,只是输入字符的方式不同:
#-*- coding: utf-8 -*-
import xlwt
wb = xlwt.Workbook()
ws = wb.add_sheet('Test Sheet')
lte = u'≤'
gte = u'≥'
ws.write(0,0,lte+gte)
wb.save('foo.xls')
不过要注意,你必须使用一个知道你在把Python代码保存为UTF-8的编辑器。如果你的编辑器用其他方式编码文件,那么当Python解释器加载这个文件时,特殊字符就会解析不正确。