注册 登录

清河洛

office文件老版本转换为新版本

qingheluo2022-03-24清河洛785
office在2007版本之前使用的是专有二进制格式,其他程序是不能读取到其内容的,但是在2007版本之后使用了占用体积更小的新版格式新版的office格式文件本质上是一个ZIP文件,主要内容保存为XML格式,保存在一个扩展名改为docx|xlsx|ppts等的ZIP文件中新版格式的文件后缀改为ZIP后解压,可以看到解压出来的文件夹中多个文件夹,包含了文档的全部内容所以office的新旧版本操作完全不同,操作新旧版本的python库也不相同针对新版本openpyxl等库可以方便的进行操作,但是如果文档为旧版本,需要我们将旧版本转换为新版本格式我们可以使用的win32模块调用office的...

office在2007版本之前使用的是专有二进制格式,其他程序是不能读取到其内容的,但是在2007版本之后使用了占用体积更小的新版格式

新版的office格式文件本质上是一个ZIP文件,主要内容保存为XML格式,保存在一个扩展名改为docx|xlsx|ppts等的ZIP文件中

新版格式的文件后缀改为ZIP后解压,可以看到解压出来的文件夹中多个文件夹,包含了文档的全部内容

所以office的新旧版本操作完全不同,操作新旧版本的python库也不相同

针对新版本openpyxl等库可以方便的进行操作,但是如果文档为旧版本,需要我们将旧版本转换为新版本格式

我们可以使用的win32模块调用office的Application对象另存为新版格式

COM 是一种允许软件组件以二进制形式进行交互的接口标准,广泛应用于 Windows 系统中,包括许多内置的应用程序和服务

在 Python 中,win32com.client模块是用于与 Windows 平台上的 COM(Component Object Model)对象进行交互的强大工具

安装win32模块:pip install pywin32

引入模块:from win32com import client as wc

创建COM对象

win32com.client.Dispatch(ProgID)

win32com.client.gencache.EnsureDispatch(ProgID)

两个方法都可以用来创建COM对象,其中ProgID是字符串格式的COM组件的程序标识符,常见的程序标识符有:

word文档:     Word.Application
excel文档:     Excel.Application
ppt文档:       PowerPoint.Application
access数据库:  Access.Application
outlook邮件:   Outlook.Application
shell命令:    Shell.Application

这两个方法的区别是:

Dispatch()
    会在运行时在计算机中搜索并根据实际安装的COM组件创建COM对象
    python程序无法预知COM对象的方法和属性
    每次调用COM对象的方法或访问属性时,python都会实时解析COM对象
    当访问一个不存在的方法或属性时,也会有解析COM对象的过程
    运行效率较慢,适合于一次性调用少量的COM对象的方法和属性
    无法在代码编辑时使用代码提示功能

gencache.EnsureDispatch()
    win32.com.client模块已经提前缓存了常用的COM对象
    在创建对象时会首先检查已定义的COM对象中是否存在指定ProgID的COM对象
        如果存在,则直接返回该对象
        如果不存在,则根据实际安装的COM组件创建COM对象的本地缓存,然后使用该缓存创建COM对象
    由于COM对象已经预先定义,因此python程序可以明确的知道COM对象的方法和属性
    可以获得代码提示功能,可以快速调用COM对象的方法和属性
    运行效率较高,适合于频繁调用的COM对象的方法和属性

下面我们以Office为例,简单介绍一下win32com.client模块的使用,不同的COM对象方法和属性存在差异,具体使用方法请参考官方文档

Office的常用COM对象属性和方法的官方文档地址:https://learn.microsoft.com/zh-cn/office/vba/api/overview/

COM对象对象的常用方法和属性

方法:

Quit():退出应用程序

属性:

DefaultFilePath: str,获取或设置文件默认打开或保存的路径
Visible:  bool,获取或设置是否显示应用程序窗口界面,默认False
Caption:  str,获取或设置标题栏文字
WindowState:  int,获取或设置应用程序窗口状态,-4140为最小化(默认),-4143为正常,-4137为最大化
Left:  int,获取或设置应用程序窗口左边缘坐标
Top:  int,获取或设置应用程序窗口顶边缘坐标
Width:  int,获取或设置应用程序窗口宽度
Height:  int,获取或设置应用程序窗口高度
DisplayAlerts:  bool,获取或设置是否禁止显示警告信息,默认False
    如关闭未保存的文档提示是否保存,设置为True时不显示警告信息且不保存
    会影响SaveAS()方法,使用该方法另存为时,默认不显示警告信息
        当DisplayAlerts为False时,如果文件已存在,会自动覆盖原文件
        当DisplayAlerts为True时,如果文件已存在,不会覆盖原文件(不保存文件)

word
Documents:返回当前应用程序的文档集合对象
ActiveDocument:返回当前活动文档

excel
Workbooks:返回当前应用程序的文档集合对象
ActiveWorkbook:返回当前活动工作簿


PowerPoint
Presentations:返回当前应用程序的文档集合对象
ActivePresentation:返回当前活动演示文稿

创建程序对象

通过COM对象创建程序对象,一个程序对象可以包含其他程序对象,但所有程序对象都属于同一个COM对象

如在excel操作时,COM对象包含WorkBook对象,WorkBook对象包含Worksheet对象,Worksheet对象包含单元格对象图表对象、列对象、行对象等

所有对象都可以直接通过COM对象访问或创建,但是为了程序的可读性和可维护性,建议使用模块化的方式来组织程序对象

如Worksheet对象仅由WorkBook对象创建,而不直接由COM对象创建,后期Worksheet对象的获取和修改都应该通过创建它的WorkBook对象来实现

这样可以避免程序对象之间的耦合,使得程序更容易维护和扩展

常见COM对象的程序对象:

COM对象:Word.Application
    Documents:文档集合对象
    Document:文档对象
    Table :表格对象
    Chart :图表对象
    Shape :形状对象

COM对象:Excel.Application
    Workbooks:文档集合对象
    Workbook:文档对象
    Worksheet:工作表对象
    PivotTable:透视表对象
    Range:单元格对象
    Chart:图表对象
    Shape:形状对象

COM对象:PowerPoint.Application
    Presentations:文档集合对象
    Presentation:文档对象
    Slide:幻灯片对象
    Shape:形状对象

每个程序对象都有一个对应的复数形式的属性用来获取程序对象集合对象,如Documents,Workbooks,Shapes等

集合对象可以创建、获取、删除程序对象,并提供对程序对象的遍历、搜索、排序等操作

文档集合对象

文档集合对象通过COM对象的文档集合属性来获取,如

# 获取Word文档集合对象
word_com = win32com.client.gencache.EnsureDispatch("Word.Application")
word_docs = word_com.Documents

# 获取Excel文档集合对象
excel_com = win32com.client.gencache.EnsureDispatch("Excel.Application")
excel_wbs = excel_com.Workbooks

# 获取PowerPoint文档集合对象
ppt_com = win32com.client.gencache.EnsureDispatch("PowerPoint.Application")
ppt_prs = ppt_com.Presentations

文档集合对象的方法和属性:

方法:
Add()                :打开一个新的空白文档并返回新文档对象
Item(index or name)  :int or str:获取指定索引或名称的文档对象,索引从1开始
    为了简化代码,可以省略Item()方法,直接使用文档集合对象来获取:
    word_com.Documents(1)
    word_com.Documents[1]
    word_com.Documents('文档名称.docx')
    word_com.Documents['文档名称.docx']
    Item只能通过括号的方式调用,不能使用方括号

Open(Filename=str,ReadOnly=bool,Password=str,WriteResPassword=WriteResPassword)
    打开指定路径的文件并返回该文件对应的文档对象
    ReadOnly:bool,是否以只读方式打开文件,默认False
    Password:str,文件密码,默认为空
    WriteResPassword:str,文件写保护密码,默认为空
Close()              :关闭集合中所有文档,如果存在未保存的文档,会提示是否保存

属性:
Count :集合中对象的数量,只读属性

文档对象

文档对象通过COM对象的Item方法或直接通过文档集合对象来获取

文档对象的方法和属性:

方法:
Activate()          :激活文档
Save()              :保存文档,替换原文件
SaveAs(Filename=str,FileFormat=int,Password=str,WriteResPassword=str,EmbedTrueTypeFonts=False):另存为
    如果文件已存在会直接覆盖该文件且不提示是否覆盖
    Filename:str,保存的文件名
    FileFormat:int,文件格式
    Password:str,文件的打开密码
    WriteResPassword:str,文件的写保护密码
    EmbedTrueTypeFonts:bool,保存时是否嵌入字体,默认False
在word文档时使用SaveAs2()方法,参数和SaveAs()方法相同
Close(SaveChanges=False, Filename=None)  :关闭文档
    SaveChanges默认为False,如果文档已修改且未保存会提示是否保存,为True则不提示直接保存修改
    Filename如果提供则SaveChanges为True时以指定文档名称保存
Protect(Password=str): 设置文档打开密码
Unprotect(Password=str): 取消文档打开密码,需要提供正确的打开密码

属性:

Name :str,文档名称,为文档的不含路径的文件名
FullName :str,文档完整路径,只读属性
Saved :bool,默认False,文档是否已保存,设置为True则在关闭文档时不会提示是否保存且放弃所有修改
Password  :str,文档打开密码
WritePassword :str,文档的写保护密码
ReadOnlyRecommended :bool,默认False,文档是否为只读,只读文档不能保存

SaveAs方法中的FileFormat文件格式参数:

word文档:
    2 :txt格式,windows系统编码
    3 :txt格式,保留换行符,windows系统编码
    7 :txt格式,Unicode编码

    6 :rtf富文本格式

    0 :doc格式,97-2003版本
    16:docx格式

    17:pdf格式
    8 :html格式

excel:
    -4158:txt格式,根据当前系统编码
    19:txt格式,使用mac系统编码
    20:txt格式,使用windows系统编码
    42:txt格式,使用Unicode编码

    6 :csv格式,根据当前系统编码
    22:csv格式,使用mac系统编码
    23:csv格式,使用windows系统编码
    62:csv格式,使用utf-8编码

    56:xls格式,97-2003版本
    51:xlsx格式

    44:html格式
    50:xlsb格式,二进制工作簿
    
    9 :dif格式,数据交换格式
    11:dbf格式,一种数据库
    55:xlam格式,加载宏
    60:ods格式,电子表格


ppt:
    1 :ppt格式,97-2003版本
    11、24、38:pptx格式
    36:pptx格式,每页都为一个图片

    5 :pot格式,97-2003模板
    6 :rtf格式
    7 :pps格式,97-2003放映
    
    16:将所有页面保存为gif格式的图片
    17:将所有页面保存为jpg格式的图片
    18:将所有页面保存为png格式的图片
    19:将所有页面保存为bmp格式的图片
    21:将所有页面保存为tif格式的图片
    23:将所有页面保存为emp格式的图片
        文件大小:emp略大bmp远大png略大tif略大jpg略大gif

    32:pdf格式
    33:xps文档
    34:xml文档
    35:odp格式演示文稿

EXCEL中无法通过SaveAs()保存为PDF格式,需要使用ExportAsFixedFormat()方法

该方法接受参数
Type    :int,要导出的文件格式,0表示PDF,1表示XPS
FileName 
Quality  :int,表格质量,0表示标准质量,1表示最低质量
IncludeDocProperties  :bool,是否保存文档属性信息
IgnorePrintAreas  :bool,是否忽略设置的打印区域
From     :int,开始发布的页码,默认第一页
To       :int,终止发布的页码,默认最后一页
OpenAfterPublish :bool,发布完成后是否打开,默认False

工作表对象

工作表集合对象

获取方式:通过COM对象或文档对象的Worksheets属性获取

COM对象的Worksheets获取的是所有发开的文档中的所有工作表的集合
文档对象的Worksheets获取的是当前文档中的所有工作表的集合

工作表集合对象的方法和属性

方法:
Add(Before=None, After=None)  :创建新的工作表并返回新工作表对象,默认在最后插入
    Before:obj,新创建的工作表将插入在Before工作表之前
    After:obj,新创建的工作表将插入在Before工作表之后
Item(index or name)  :int or str:获取指定索引或名称的工作表对象,索引从1开始
    为了简化代码,可以省略Item()方法,直接使用工作表集合对象来获取:
    wb.Worksheets(1)
    wb.Worksheets[1]
    wb.Worksheets('文档名称.docx')
    wb.Worksheets['文档名称.docx']
    Item只能通过括号的方式调用,不能使用方括号

属性:
Count :int,工作表集合对象中工作表的数量

工作表对象的方法和属性

方法:
Activate() :激活工作表
Copy(Before=None, After=None) :复制当前工作表并返回新工作表对象,默认在最后插入
    如果After指定的工作表处于隐藏状态,并且之后没有可见工作表,则新工作表将在最后一个可见工作表之后复制
Delete() : 删除当前工作表
    默认情况下将显示一个对话框,询问用户确认删除
    如果选择“取消”,Delete方法将返回False,如果选择“删除”则返回True。
    将COM.DisplayAlerts属性设置为False时删除工作表但不显示对话框
Move(Before=None, After=None) :移动当前工作表
    如果Before和After都为None,将在最后插入一个新的当前工作表复制
Calculate()  :计算工作表中的公式
    excel_com.Calculate()  :计算COM对象中所有的工作表中的公式
    wb.Worksheets(1).Calculate()  :计算指定工作表中的公式
    wb.Worksheets(1).Rows(2).Calculate()  : 计算指定工作表中的第2行中所有公式
Protect(Password=str)  : 设置工作表的保护密码
Unprotect(Password=str)  : 取消工作表的保护密码

属性:
Name :str,工作表名称
Index :int,工作表索引,从1开始,只读属性
Next   :obj,下一个工作表对象
Visible :bool,工作表是否可见,默认True

数据透视表对象

通过Worksheet对象的PivotTables属性获取该工作表中的透视表集合对象

获取数据透视表对象:透视表集合对象的Item(index or name)方法或者直接传入index或name获取

ws = wb.Worksheets("sheet_name")
pt = ws.PivotTables(1)

数据透视表对象数据更新:Update()方法



网址导航