Python文本数据互相转换(pandas and win32com)
(工作之后,就让自己的身心都去休息吧)
今天介绍一下文本数据的提取和转换,这里主要实例的转换为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开发人员参考,有用的部分是对象模型参考。我必须检查它们以了解可用的方法和属性,因此它们非常重要。
3.在任何参考资料中,您都会找到一些用VBA编写的示例。您所要做的就是将它们转换为Python的语法。
首先介绍下win32com:
1 # coding: UTF-8 2 import win32com.client 3 WordApp = win32com.client.Dispatch("Word.Application") 4 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文件内:
1 #新建空文档 2 docx=WordApp.Documents.Add() 3 #打开指定文档,进行操作 4 docx = WordApp.Documents.Open(r'C:\Users\Administrator\Desktop\b.docx') 5 #保存 6 docx.Save
这里只需要Save即可,原理就是打开一个指定的world文件,将数据存入进去后保存即可。
这里关于world文件的保存和添加介绍完。
下面介绍些world文件的一些属性:
1、页面属性:
1 docx.PageSetup.PaperSize = 7 # 纸张大小, A3=6, A4=7 2 docx.PageSetup.PageWidth = 8.7*28.35 # 纸张宽大小后PaperSize 就不需要了 3 docx.PageSetup.PageHeight = 13*28.35 # 纸张高大小 4 docx.PageSetup.Orientation = 1 # 页面方向, 竖直=0, 水平=1 5 docx.PageSetup.TopMargin = 2.45*28.35 # 页边距上=2.45cm,1cm=28.35pt 6 docx.PageSetup.BottomMargin = 2.45*28.35 # 页边距下=2.45cm 7 docx.PageSetup.LeftMargin =0.75*28.35 # 页边距左=0.75cm 8 docx.PageSetup.RightMargin = 0.5*28.35 # 页边距右=0.5cm
2、页面布局:
1 sel = WordApp.Selection # 获取Selection对象 2 sel.InsertBreak(8) # 插入分栏符=8, 分页符=7 3 sel.Font.Name = "宋体" # 字体 4 sel.Font.Size = 11 # 字大 5 sel.Font.Bold = True # 粗体 6 sel.Font.Italic = True # 斜体 7 sel.Font.Underline = True # 下划线 8 sel.ParagraphFormat.LineSpacing = 2*12 # 设置行距,1行=12磅 9 sel.ParagraphFormat.Alignment = 1 # 段落对齐,0=左对齐,1=居中,2=右对齐 10 sel.TypeText("aaa") # 插入文字 11 sel.TypeParagraph() # 插入空行 12 sel.TypeText("\n") #插入空白行
3、表格:
1 tab=docx.Tables.Add(sel.Range, 7, 2) # 增加一个16行2列的表格 2 tab.Style = "网格型" # 显示表格边框 3 tab.Columns(1).SetWidth(2.4*28.35, 0) #调整第一列宽 4 tab.Columns(2).SetWidth(5.5*28.35, 0) 5 tab.Rows.Alignment = 1 # 表格对齐,0=左对齐,1=居中,2=右对齐 6 tab.CellCellCellCell(1,1).Range.Text = "aaa" # 填充内容,注意Excel中使用wSheet.Cells(i,j) 7 sel.MoveDown(5, 16) # 向下移动2行,5=以行为单位 8 line_cells = tab.columns[0].cells #第一列所有空格 0,1代表第几列 9 line_cells[0].Range.Text= 'N' #第一列第一个空格中添加“N” 10 line_cells[1].Range.Text = '号'.decode('utf-8') 11 line_cells[2].Range.Text = '牌'.decode('utf-8') 12 line_cells[3].Range.Text = '数量'.decode('utf-8') 13 line_cells[4].Range.Text = '日期'.decode('utf-8') 14 line_cells[5].Range.Text = '名称'.decode('utf-8') 15 line_cells[6].Range.Text = '编号'.decode('utf-8')
贴上Pandas模块和win32com的完整代码(主要看分布):
1 # coding: UTF-8 2 import win32com.client 3 import time 4 import pandas as pd 5 def parser(): 6 df = pd.read_excel('C:\\Users\\Administrator\\Desktop\\222.xlsx') 7 pd.set_option('display.width',None) 8 WordApp = win32com.client.Dispatch("Word.Application") 9 #WordApp.Visible = False 10 11 12 for i in xrange(0,len(df)): 13 Pn = df.iloc[i,0].encode('utf-8') 14 partno = df.iloc[i,1].encode('utf-8') 15 manufacturer = df.iloc[i,2] 16 quantity = str(int(df.iloc[i,3])) 17 contractnum = df.iloc[i,4].encode('utf-8') 18 #print type(contractnum) 19 #print manufacturer 20 doc=WordApp.Documents.Add() 21 doc = WordApp.Documents.Open(r'C:\Users\Administrator\Desktop\b.docx') 22 doc.PageSetup.PageWidth = 9*28.35 23 doc.PageSetup.PageHeight = 13*28.35 24 doc.PageSetup.LeftMargin = 0.6*28.35 25 doc.PageSetup.RightMargin = 0.5*28.35 26 27 sel = WordApp.Selection 28 sel.Font.Name = "宋体" 29 sel.Font.Size = 11 30 sel.TypeText("\n") 31 sel.TypeText("\n") 32 sel.TypeText("\n") 33 sel.TypeText("\n") 34 sel.TypeText("\n") 35 sel.TypeText("\n") 36 sel.TypeText("\n") 37 tab=doc.Tables.Add(sel.Range, 7, 2) 38 #print type(tab.location) 39 tab.Style = "网格型".decode('utf-8') 40 tab.Columns(1).SetWidth(2.4*28.35, 0) 41 tab.Columns(2).SetWidth(5.5*28.35, 0) 42 line_cells = tab.columns[0].cells 43 line_cells[0].Range.Text= 'N' 44 line_cells[1].Range.Text = '号'.decode('utf-8') 45 line_cells[2].Range.Text = '牌'.decode('utf-8') 46 line_cells[3].Range.Text = '数量'.decode('utf-8') 47 line_cells[4].Range.Text = '日期'.decode('utf-8') 48 line_cells[5].Range.Text = '名称'.decode('utf-8') 49 line_cells[6].Range.Text = '编号'.decode('utf-8') 50 #print help(doc.SaveAs) 51 doc.Save 52 print 'Is oK!' 53 #doc.SaveAs(r'C:\Users\Administrator\Desktop\b.docx') 54 doc.Close() 55 WordApp.Quit() 56 if __name__ == '__main__': 57 parser()
这里主要注意下下操作world程序和for循环的位置就可以了,还有close,不然你的程序就会报错,因为你打开一个world程序未关闭,再次打开windows会提示未保存文档不可操作,所以程序会报错!
更多技术信息添加群:607021567