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

posted @ 2018-08-16 11:10  James·Sean  阅读(4775)  评论(1编辑  收藏  举报