2023-01-12 更新
对 Word 、 PowerPoint 、 Outlook 来说,编程可做的事非常有限,能玩出花的只有 Excel 。社区已有多个支持 Excel 的模块,著名的有 win32com 、 xlrd 、 xlwt 、 xlsxwriter 、 openpyxl 等。
1 win32com
pip install pypiwin32
2 xlrd
xlrd 能读能写。支持 xls 和 xlsx 。从 0 开始计数。
读的时候应该将单元格的类型 type 和数据 value 全读出来,然后根据类型处理数据。
- type = 2 ,表示浮点数。
- 表现为整数的浮点数,先判断它强制转换成整数后是否和原值相等,如果相等,再将它转换为整数,一般来说都是相等的。注意以 0 开头的特殊编码,如电话区号等,读出的值可能丢失开头的 0 。
- type = 3 ,表示日期。
- 必须用 xldate_as_tuple 转换,否则是可能有意义的浮点数。
- type = 4 ,表示真假。
- 真 1 假 0 。
合并单元格只有左上角的单元格能读出值,其余单元格均为空。这就要求我们事先知道哪些单元格被合并了。那么如何获得合并单元格的信息呢?
>>> workbook = xlrd.open_workbook(r'demo.xlsx', formatting_info=True)
>>> sheet1 = workbook.sheet_by_name('sheet1')
>>> sheet1.merged_cells
[(r1, r2, c1, c2), ......]
(r1, r2, c1, c2)
表示行 r1 和行 r2-1 、列 c1 和列 c2-1 之间的单元被合并了。
3 xlwt
xlwt 不能读只能写,不能向既有工作簿插入工作表。不支持 xlsx 。从 0 开始计数。最多 256 列 65535 行。样式颜色有限。
添加工作表的顺序直接决定最终工作表的排列。
向同一单元格写入内容时会抛出重写异常,可附加选项 cell_overwrite_ok=True
覆盖原值。
easyxf()
用于快速生成样式,不过它能理解的颜色名称非常有限。
XFStyle
和 Pattern()
也可以生成样式, pattern 是 style 的子集。
xlwt 的默认列宽是 2960 ,单位是字符 0 宽度的 1/256 ,即默认列宽为 11 个字符 0 的宽度,列宽值必须是整数。建议最后调整列宽。
4 xlutils
实际是在 xlrd.Book 和 xlwt.Workbook 之间建立了一个管道,管道传输过程中存在样式丢失(有待证实)。
5 xlsxwriter
xlsxwriter 不能读只能写,不能向既有工作簿插入工作表。据说能加图表。
6 openpyxl
openpyxl 能读能写。不支持 xls 。从 1 开始计数。
openpyxl 会默认创建一个数据表,表名就叫 Sheet
。
openpyxl 删除指定数据表有两种方法,一是 del workbook[sheet_name]
,二是 workbook.remove[workbook[sheet_name]]
。
get_highest_row()
和 get_highest_column()
这两个方法已经废弃,直接通过 worksheet.max_row
和 worksheet.max_column
获取。
openpyxl 不能读取 Excel 中所有的对象,图片和图表将会丢失。