今天介绍一下文本数据的提取和转换, 这里主要实例的转换为 excel 文件 (.xlsx) 转换 world 文件(.doc/docx), 同时需要使用 win32api, 同 pywin32 库.
pandas 库我之前的博客里面都有详细的介绍和使用, 这里主要介绍下 win32 库.
PyWin32 是一个 Python 库, 可以为 Python 提供 Windows 扩展. 换句话说, 它允许您访问各种 Windows 功能 - 至少 Microsoft Office 的功能 - 而无需使用 Microsoft 的一种语言, 如 Visual Basic 或 C#.
win32com 模块的下载: https://sourceforge.net/projects/pywin32/files/pywin32/ (对应你的 windows 版本)
同时分享 Galal Aly's 博主: http://new.galalaly.me/2011/09/use-python-to-parse-microsoft-word-documents-using-pywin32-library/
Pywin32 库的一些概念:
1.PyWin32 是一个包装器, 它使您可以使用 Visual Basic for Applications(VBA)中提供的相同方法和属性, 但使用 Python 的语法.
2. 这是 Word 2007 开发人员参考 http://msdn.microsoft.com/en-us/library/bb244391(v=office.12).aspx , 有用的部分是对象模型参考 http://msdn.microsoft.com/en-us/library/bb244515(v=office.12).aspx . 我必须检查它们以了解可用的方法和属性, 因此它们非常重要.
3. 在任何参考资料中, 您都会找到一些用 VBA 编写的示例. 您所要做的就是将它们转换为 Python 的语法.
首先介绍下 win32com:
- # coding: UTF-8
- import win32com.client
- WordApp = win32com.client.Dispatch("Word.Application")
- WordApp.Visible = False
1. 因为你使用的是中国汉字, windows 中文本文档大多数都是汉子处理, 所以前提一定要加上# coding: UTF-8.
2. 引入 win32com 模块.
3. 打开 world 应用程序, python 操作 world 程序以便写入文件.
4. 是否在桌面打开 world 程序, 这里的 False 就是不需要打开, 反之为 True.
这里主要介绍 win32api 的一些属性, 主要为操作 world 文档所使用:
- # 新建空文档
- docx=WordApp.Documents.Add()
- # 打开指定文档
- docx = WordApp.Documents.Open(r'C:\Users\Administrator\Desktop\b.docx')
- # 保存到指定文档
- docx.SaveAs(r"c:\Users\Administrator\Desktop\c.doc") # 文档保存
- # 关闭文档, 需在保存文档之后
- docx.Close(-1)
这里需要特别注意的是, SaveAs 为另存文件, 即可以不需要创建文件, 另一个是打开指定文档, 这里如果你不需要存入一个文档的话, 就只需要打开一个文档存到另一个文档也可以, 这里可以 doc 可以转换 docx 文件.
但是, 如果你都要操作在你个 world 文件内, 那么就需要追加一个 docx 文件内:
- # 新建空文档
- docx=WordApp.Documents.Add()
- #打开指定文档, 进行操作
- docx = WordApp.Documents.Open(r'C:\Users\Administrator\Desktop\b.docx')
- #保存
- docx.Save
这里只需要 Save 即可, 原理就是打开一个指定的 world 文件, 将数据存入进去后保存即可.
这里关于 world 文件的保存和添加介绍完.
下面介绍些 world 文件的一些属性:
1, 页面属性:
- docx.PageSetup.PaperSize = 7 # 纸张大小, A3=6, A4=7
- docx.PageSetup.PageWidth = 8.7*28.35 # 纸张宽大小后 PaperSize 就不需要了
- docx.PageSetup.PageHeight = 13*28.35 # 纸张高大小
- docx.PageSetup.Orientation = 1 # 页面方向, 竖直 = 0, 水平 = 1
- docx.PageSetup.TopMargin = 2.45*28.35 # 页边距上 = 2.45cm,1cm=28.35pt
- docx.PageSetup.BottomMargin = 2.45*28.35 # 页边距下 = 2.45cm
- docx.PageSetup.LeftMargin =0.75*28.35 # 页边距左 = 0.75cm
- docx.PageSetup.RightMargin = 0.5*28.35 # 页边距右 = 0.5cm
2, 页面布局:
- sel = WordApp.Selection # 获取 Selection 对象
- sel.InsertBreak(8) # 插入分栏符 = 8, 分页符 = 7
- sel.Font.Name = "宋体" # 字体
- sel.Font.Size = 11 # 字大
- sel.Font.Bold = True # 粗体
- sel.Font.Italic = True # 斜体
- sel.Font.Underline = True # 下划线
- sel.ParagraphFormat.LineSpacing = 2*12 # 设置行距, 1 行 = 12 磅
- sel.ParagraphFormat.Alignment = 1 # 段落对齐, 0 = 左对齐, 1 = 居中, 2 = 右对齐
- sel.TypeText("aaa") # 插入文字
- sel.TypeParagraph() # 插入空行
- sel.TypeText("\n") #插入空白行
3, 表格:
- tab=docx.Tables.Add(sel.Range, 7, 2) # 增加一个 16 行 2 列的表格
- tab.Style = "网格型" # 显示表格边框
- tab.Columns(1).SetWidth(2.4*28.35, 0) #调整第一列宽
- tab.Columns(2).SetWidth(5.5*28.35, 0)
- tab.Rows.Alignment = 1 # 表格对齐, 0 = 左对齐, 1 = 居中, 2 = 右对齐
- tab.CellCellCellCell(1,1).Range.Text = "aaa" # 填充内容, 注意 Excel 中使用 wSheet.Cells(i,j)
- sel.MoveDown(5, 16) # 向下移动 2 行, 5 = 以行为单位
- line_cells = tab.columns[0].cells #第一列所有空格 0,1 代表第几列
- line_cells[0].Range.Text= 'N' #第一列第一个空格中添加 "N"
- line_cells[1].Range.Text = '号'.decode('utf-8')
- line_cells[2].Range.Text = '牌'.decode('utf-8')
- line_cells[3].Range.Text = '数量'.decode('utf-8')
- line_cells[4].Range.Text = '日期'.decode('utf-8')
- line_cells[5].Range.Text = '名称'.decode('utf-8')
- line_cells[6].Range.Text = '编号'.decode('utf-8')
贴上 Pandas 模块和 win32com 的完整代码(主要看分布):
- # coding: UTF-8
- import win32com.client
- import time
- import pandas as pd
- def parser():
- df = pd.read_excel('C:\\Users\\Administrator\\Desktop\\222.xlsx')
- pd.set_option('display.width',None)
- WordApp = win32com.client.Dispatch("Word.Application")
- #WordApp.Visible = False
- for i in xrange(0,len(df)):
- Pn = df.iloc[i,0].encode('utf-8')
- partno = df.iloc[i,1].encode('utf-8')
- manufacturer = df.iloc[i,2]
- quantity = str(int(df.iloc[i,3]))
- contractnum = df.iloc[i,4].encode('utf-8')
- #print type(contractnum)
- #print manufacturer
- doc=WordApp.Documents.Add()
- doc = WordApp.Documents.Open(r'C:\Users\Administrator\Desktop\b.docx')
- doc.PageSetup.PageWidth = 9*28.35
- doc.PageSetup.PageHeight = 13*28.35
- doc.PageSetup.LeftMargin = 0.6*28.35
- doc.PageSetup.RightMargin = 0.5*28.35
- sel = WordApp.Selection
- sel.Font.Name = "宋体"
- sel.Font.Size = 11
- sel.TypeText("\n")
- sel.TypeText("\n")
- sel.TypeText("\n")
- sel.TypeText("\n")
- sel.TypeText("\n")
- sel.TypeText("\n")
- sel.TypeText("\n")
- tab=doc.Tables.Add(sel.Range, 7, 2)
- #print type(tab.location)
- tab.Style = "网格型".decode('utf-8')
- tab.Columns(1).SetWidth(2.4*28.35, 0)
- tab.Columns(2).SetWidth(5.5*28.35, 0)
- line_cells = tab.columns[0].cells
- line_cells[0].Range.Text= 'N'
- line_cells[1].Range.Text = '号'.decode('utf-8')
- line_cells[2].Range.Text = '牌'.decode('utf-8')
- line_cells[3].Range.Text = '数量'.decode('utf-8')
- line_cells[4].Range.Text = '日期'.decode('utf-8')
- line_cells[5].Range.Text = '名称'.decode('utf-8')
- line_cells[6].Range.Text = '编号'.decode('utf-8')
- #print help(doc.SaveAs)
- doc.Save
- print 'Is oK!'
- #doc.SaveAs(r'C:\Users\Administrator\Desktop\b.docx')
- doc.Close()
- WordApp.Quit()
- if __name__ == '__main__':
- parser()
这里主要注意下下操作 world 程序和 for 循环的位置就可以了, 还有 close, 不然你的程序就会报错, 因为你打开一个 world 程序未关闭, 再次打开 windows 会提示未保存文档不可操作, 所以程序会报错!
来源: https://www.cnblogs.com/zhuPython/p/9486128.html