Microsoft Office 编程

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() 用于快速生成样式,不过它能理解的颜色名称非常有限。

xlwt_color_map

XFStylePattern() 也可以生成样式, 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_rowworksheet.max_column 获取。

openpyxl 不能读取 Excel 中所有的对象,图片和图表将会丢失。