2019-02-26 22:05:08 qq_40962646 阅读数 336

       最近在做一个用Python读取office系列文件的小型应用,说实话用Python对windows系统进行操作真的是一件痛苦的事情…
       尤其比较坑的是在Windows上,Python不支持mknod函数,这也就意味着你要创建一个非.txt文件的话你需要先创建一个.txt文件,再强制修改其后缀。
       现在来分享一下Python如何对word文件(.docx)进行读取?
       因为网上有很多用python创建.docx文件的方法了,这里就不多说,主要来讲讲对已有数据的.docx数据进行读取。首先必须说明的是,.docx其实把内容分得很细,一篇文章的并不是以段为单位的,而是以runs为单位的,即如果你一段文字中,前半部分加粗而后半部分未加粗,那么从段落读取字体属性(word.paragraphs[i].style.font,bold)就会变成None,我们必须进入到paragraphs的下一层进行读取,即word.paragraphs[i].runs[j].font,bold,才能读取到该段的某一部分文字是否加粗。
       我用的Python3.6,用到的包是python-docx 0.8.7 ,windows10系统, office需要2010及以上的版本。
       from docx import Document 将包导入
        word = Document(.docx文件路径)
        word.paragraphs[0].style.font.name 检测字体【paragraphs[0]即文章的第一段,但是由于段间距、段缩进、首行缩进等原因,len(word. paragraphs)会大于文章的段落数,这是因为出现了许多word.paragraphs[i].text为空的段落,这个自己debug一下就知道了】


        当一个段落中中文所使用的字体与英文所使用的字体不同时,我们需要使用另一种方法进行读取,这时候我们需要使用另一种方法——  word.paragraphs[i].runs[j].font.element.rPr.rFonts.attrib['{http://schemas.openxmlformats.org/wordprocessingml/2006/main}eastAsia'] (读取中文)
word.paragraphs[i].runs[j].font.element.rPr.rFonts.attrib['{http://schemas.openxmlformats.org/wordprocessingml/2006/main}hAnsi'] (读取英文)

在这里插入图片描述
先写到这里……后面慢慢更新
       
       
       
       

2018-10-17 12:10:03 qq_39591494 阅读数 517

Python操作Office之Word(总结)

多余的废话还是要说说:

本章学习Python操作office之word文档,对word文档进行相关的操作,在工作当中word文档还是很重要的,尤其是目前在运维工程师这个岗位,几乎都会去写文档,操作文档,部署文档等等…

print ("开始正题,废话结束!")

一、安装Python-docx

Python-docx是专门针对于word文档的一个模块,只能读取docx 不能读取doc文件。说白了,python就相当于windows操作系统,QQ就是跑在windows操作系统上的软件,QQ最大的作用是可以去聊天,说话。 在这里python-docx就相当于这里的qq 它主要的功能是对docx文件进行操作,管理等.(个人理解,非专业!)

1.1、安装Python-docx

1.1.1、使用虚拟环境安装python-docx

pip install python-docx # 安装命令

安装结束后,在此虚拟环境中运行Jupyter notebook

jupyter notebook

1.1.2、切换工作目录(使用 %cd命令)

%cd F:\python_test1\Python_office # 进入目录
%pwd  # 查看当前的工作目录
>>>'F:\\python_test1\\Python_office' # 输出结果

二、对word文档进行编辑

在对word文档编辑之前需要导入Document模块如下:

from docx import Document
Doc = Document() 
解释:from 从 docx这个文件中,导入一个叫Document的一个东西,Document是文档的意思,所以它是对word文档进行操作的一个玩意. 在下面Doc = Document() 可以理解为 Document就是一个类,这个操作也就是实例化的过程,生成对象为:Doc

那Document实例化了一个Object叫Doc 那么Doc肯定会有很多的方法,这些方法就是对word文档进行操作的方法如下:

Doc.add_heading("Python是什么东西???")
<docx.text.paragraph.Paragraph at 0x28033582e48>
# Doc.add_heading 意思是添加一个叫做heading的一个东西在这里heading指的是标题的意思,也就是添加一个标题叫做python是什么东西???运行完成后它会生成一个对象.

2.1、添加一个段落(paragraph)

Doc.add_paragraph("Python是一种面向对象的编程语言~~~") # 在这里paragraph指的就是一个段落的意思
<docx.text.paragraph.Paragraph at 0x280335a17b8>

2.2、添加多个段落(paragraph)

Doc.add_paragraph("Python 第三模块学习")
Doc.add_paragraph("Python 对word进行操作")

2.3、如何查看word文档?

写完之后我们需要查看首先需要保存 如下:

Doc.save("Python_word.docx")
# save:保存 为名字叫:Python_word.docx 的文件

三、如何添加一级标题,二级标题,三级标题…?

3.1、添加一级标题

Doc = Document()
Doc.add_heading("这是一级标题",level=1)
Doc.add_heading("这是二级标题",level=2)
Doc.add_heading("这是三级标题",level=3)
Doc.add_heading("这是四级标题",level=4)
Doc.save("标题.docx")

打开效果如下:

四、如何添加一个副级标题?

Doc.add_heading("这是一个一级标题",level=1)
Doc.add_paragraph("这是一个副标题","Subtitle")
Doc.save("副标题.docx")

打开效果如下:

五、查看已有的样式

5.1、查看paragraph有哪些样式

from docx.enum.style import WD_STYLE_TYPE

for i in Doc.styles:
    if i.type == WD_STYLE_TYPE.PARAGRAPH:
        print(i.name)
>>>
Normal
Heading 1
Heading 2
Heading 3
Heading 4
Heading 5
Heading 6
Heading 7
Heading 8
Heading 9
No Spacing
Title
Subtitle
List Paragraph
Body Text
Body Text 2
Body Text 3
List
List 2
List 3
List Bullet
List Bullet 2
List Bullet 3
List Number
List Number 2
List Number 3
List Continue
List Continue 2
List Continue 3
macro
Quote
Caption
Intense Quote
TOC Heading

5.2、查看文字有哪些样式

from docx.enum.style import WD_STYLE_TYPE

for i in Doc.styles:
    if i.type == WD_STYLE_TYPE.CHARACTER:
        print(i.name)
>>>
Default Paragraph Font
Heading 1 Char
Heading 2 Char
Heading 3 Char
Title Char
Subtitle Char
Body Text Char
Body Text 2 Char
Body Text 3 Char
Macro Text Char
Quote Char
Heading 4 Char
Heading 5 Char
Heading 6 Char
Heading 7 Char
Heading 8 Char
Heading 9 Char
Strong
Emphasis
Intense Quote Char
Subtle Emphasis
Intense Emphasis
Subtle Reference
Intense Reference
Book Title

个人练习案例:

Docx = Document()
Docx.add_heading("这是一个一级标题",level=1)
Docx.add_paragraph("这是一个副级标题","Title")
A = Docx.add_paragraph("我目前正在学习Python")
A.add_run("我学习的很快乐,啊哈哈哈哈哈,非常好 Good!!!")
Docx.add_heading("这是一个二级标题",level=2)
A = Docx.add_paragraph("这个是二级标题的内容呀")
B = A.add_run("二级标题里面的正文 继续添加!!!!!!!")
B.font.bold = True # 同时我要对这些正文进行加粗~~~~
B.font.size = (20)
Docx.add_heading("我爱学习Python以下就是python的logo呀",level=3)
Docx.add_picture("1.png")
Docx.add_table(rows=5, cols=5)
Docx.save("Python.docx")

在这里插入图片描述

2019-01-07 22:52:33 weixin_34122810 阅读数 441
  朋友的家人做生意,每日从各地分店处收集报表,然后回去汇总。由于不想用那种复杂的管理软件,就叫他写一个小工具。于是他找到了我,让我想想办法。

  Python是个令人惊奇的工具,而不仅仅是一种语言。对比老牌的Perl,看似Python不是那么的精通 —— 对比Perl超快的文本处理速度和广泛应用于Cgi程序的编写历史,以及目前大红大紫的Ruby在Web开发上的病毒式蔓延,而比起静态语言比如C\C++,虚拟机Java和C#来说,速度又成了问题。但是Python的实力可不容小视,NASA都用Python可不是吹的,况且,Python的学习难度比Perl小多了,刚学时让我找到了以前QBASIC的感觉。
  
  此程序具体要求如下:每日产生副表若干(如副表文件)。程序先核对附表的日期和销售点。如果销售点不同日期相同,便把不同副表的相同产品号的 “销售数量”栏相加,填入总表“销售数量”栏。将副表的“总利润”栏相加填入总表的“总利润”栏。其他副表信息复制到总表(备注除外,由用户自行处理)。表头的样式如下:

SubTableHead.PNG

TotalTableHead.PNG

  啊哈,很简单的表头。其中需要操作的是“销售数量”和“总利润”,也就是把相同时间的报表相加。但是这样有个严重问题!

必须要求,相同报表的产品名称、货号的顺序不能出错,各地要绝对统一,否则全部这样照样拷贝就会出错!

  让我们分析一下思路:时间是关键。时间决定了哪些报表需要分门别类,生成哪一天的统计总表。数据结构上,用什么呢?简单的list?不行,我尝试过。应该使用map容器,把日期作为key,储存的Value是个列表。程序先扫描所有的Excel文件获取日期,然后把相同日期报表的COM文档接口储存起来,实现了分门别类。最后遍历这个map容器,计算,生成每日的统计总表。代码如下,经过测试正常。

 1None.gifimport os;
 2None.gifimport sys;
 3None.gifimport time;
 4None.gifimport datetime;
 5None.gif#请先安装对应着你自己的Python版本的PythonWin32
 6None.gifimport win32com.client;
 7None.gif
 8None.gif
 9None.gifmapper = {};
10None.gif
11None.gifapp = win32com.client.Dispatch("Excel.Application");
12None.gifPipeOut = os.popen("dir *.xls /B");
13None.gifFileList = PipeOut.readlines();
14None.gifPipeOut = os.popen("cd");
15None.gifCurDic = PipeOut.readline();
16None.gifCurDic = CurDic[:-1+ "\\";#去处末尾的\n
17None.gifprint "当前工作目录为"+CurDic;
18None.gif
19None.gif    #读取每个文件的时间和储存相应的COM接口
20None.gif
21None.giffor filename in FileList:
22None.gif    filename = CurDic+filename[:-1];
23None.gif    print filename;
24None.gif    Doc = app.Workbooks.Open(filename);
25None.gif    Sheet = Doc.Sheets(1);
26None.gif    Time = Sheet.Cells(2,5);
27None.gif    print type(Time);
28None.gif    TimeKey = str(Time);
29None.gif    print TimeKey;
30None.gif    if mapper.has_key(TimeKey):
31None.gif        mapper[TimeKey].append(Sheet);
32None.gif    else :
33None.gif        mapper[TimeKey] = [];
34None.gif        mapper[TimeKey].append(Sheet);
35None.gif    #print mapper;
36None.gif
37None.gif
38None.gif    #生成新的统计总表
39None.gif    
40None.gif    #开始处理mapper 每次从一个自表中读取2x20个数据,然后和总表相加
41None.gifprint "-------------------------------------";
42None.gifProtetype = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
43None.gif= 0;
44None.gif= 0;
45None.gif= 0;
46None.gif
47None.giffor k,v in mapper.items():
48None.gif    print "//////////////////////////////////"
49None.gif    a+=1;
50None.gif    Count = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
51None.gif    Benefit = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
52None.gif    Name = [u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u""];
53None.gif    #print Count;
54None.gif    #print Benefit;
55None.gif        #Total = app.Workbooks.Open(CurDic+"Template\\TotalTemplate.xls");
56None.gif    print "How manu Sheets in this List ? ",len(v);
57None.gif    for sht in v:
58None.gif        b+=1;
59None.gif        _Count = sht.Range("C4:C23").Value;
60None.gif        _Benefit = sht.Range("F4:F23").Value;
61None.gif        _Name = sht.Range("B4:B23").Value;
62None.gif        #print _Count;
63None.gif        #print _Benefit;
64None.gif        assert(len(_Count) == len(_Benefit));
65None.gif        for i in range(0,len(_Count)):
66None.gif            c+=1;
67None.gif            Count[i] = _Count[i][0] + Count[i];
68None.gif            Benefit[i] = _Benefit[i][0] + Benefit[i];
69None.gif            Name[i] = _Name[i][0];
70None.gif        #以上作为储存总表项的数据
71None.gif    Total = app.Workbooks.Open(CurDic+"Template\\TotalTemplate.xls");
72None.gif    TotalSheet = Total.Sheets(1);
73None.gif    _Time = k[:k.find(" ")];
74None.gif    _Time = _Time.replace("/","-");
75None.gif    print _Time;
76None.gif    print Count;
77None.gif    print Benefit;
78None.gif        #TotalSheet.Cells(2,2).Value = _Time;
79None.gif    for i in range(0,len(Count)):
80None.gif        TotalSheet.Cells(4+i,3).Value = Count[i];#填充数量
81None.gif        TotalSheet.Cells(4+i,6).Value = Benefit[i];#填充利润
82None.gif        TotalSheet.Cells(4+i,2).Value = Name[i];#填充货物名称
83None.gif
84None.gif    #保存总表
85None.gif    Total.SaveAs(CurDic+_Time+"统计总表.xls");
86None.gif    del Count,Benefit;
87None.gifprint "++++++++++++++++++++++++++++"
88None.gifprint a,b,c;
89None.gifapp.Quit();
90None.gifapp = None;
91None.gif

  使用方法,先安装Python 2.4和PythonWin For 2.4。然后把这个脚本拷贝到分表的文件夹下,然后运行(调试),自动生成与日期相关的总表。效果图如下:

TableEffect.PNG



最终解决思路的提示:其实这种方法只能在规模比较小的时候,因为这种脱离于总系统的处理效率实在非常低,而且Excel二进制文件,空表的占用就达15k,在未来有大量业务数据处理的话将是无法忍受的噩梦。所以,我建议这位商务人士分析一下他所使用的处理系统,用便宜的网络线路构建从各地中心服务器系统,使用XML作为数据交换得媒介,在自己的服务器上您只需要使用简单的SQL处理过程就可以了,而且数据的可靠度比平面Excel文档高得多。

数据在这里下载,为了保险起见请不要使用中文的文件夹目录。

2020-03-13 12:01:28 ssspppfff 阅读数 28
用途 库名称 参考资料
读EXCEL xlrd
写EXCEL xlwt
操作EXCEL xlwings https://docs.xlwings.org/en/stable/
操作WORD python-docx https://python-docx.readthedocs.io/en/latest/index.html
调用Windows接口 pywin32 win32com、win32api 、win32clipboard 、win32event 、 win32gui 、win32help ……
2017-10-27 10:07:22 luanpeng825485697 阅读数 7541

全栈工程师开发手册 (作者:栾鹏)

python教程全解

python操作office办公软件(doc)。

前提条件是电脑已经安装了office办公软件,并且下载安装了pywin32-217.win32-py2.7库

安装python库的方法,可以参考 Python库的安装与卸载

然后就可以使用python编程操作word软件了。word软件的启动有时较慢,所以可能需要等待几秒中才能启动成功。

python2.7下代码如下

#coding:utf-8
#python操作word
from Tkinter import Tk
from time import sleep
from tkMessageBox import showwarning
import win32com.client as win32

warn = lambda app: showwarning(app, 'Exit?') #弹出提示框

def word():
    app = 'Word'
    word = win32.gencache.EnsureDispatch('%s.Application' % app) #创建word对象 
    doc = word.Documents.Add() #添加一个文档
    word.Visible = True  #设置为桌面显示可见
    sleep(1)  #暂停一下,让用户看清演示的每一步

    rng = doc.Range(0,0)  #定位光标位置
    rng.InsertAfter('first line\r\n\r\n')  #在光标后加入内容
    sleep(1)  #暂停一下,让用户看清演示的每一步
    for i in range(3, 8):
        rng.InsertAfter('Line %d\r\n' % i)  #在光标后加入内容
        sleep(1)  #暂停一下,让用户看清演示的每一步
    rng.InsertAfter("\r\nlast line\r\n") #在光标后加入内容

    warn(app)   #弹出警告消息
#     doc.Save("test.doc")  #保存
    doc.Close(False)  #文档关闭
    word.Application.Quit()   #word应用退出

if __name__=='__main__':
    Tk().withdraw()  #不让tk顶级窗口出现,因为默认tk会自动创建一个顶级窗口,而且不会将其隐藏
    word()

python3.6中代码如下

#coding:utf-8
#python操作word
from tkinter import Tk
from time import sleep
from tkinter.messagebox import showwarning
import win32com.client as win32

warn = lambda app: showwarning(app, 'Exit?') #弹出提示框

def word():
    app = 'Word'
    word = win32.gencache.EnsureDispatch('%s.Application' % app) #创建word对象 
    doc = word.Documents.Add() #添加一个文档
    word.Visible = True  #设置为桌面显示可见
    sleep(1)  #暂停一下,让用户看清演示的每一步

    rng = doc.Range(0,0)  #定位光标位置
    rng.InsertAfter('first line\r\n\r\n')  #在光标后加入内容
    sleep(1)  #暂停一下,让用户看清演示的每一步
    for i in range(3, 8):
        rng.InsertAfter('Line %d\r\n' % i)  #在光标后加入内容
        sleep(1)  #暂停一下,让用户看清演示的每一步
    rng.InsertAfter("\r\nlast line\r\n") #在光标后加入内容

    warn(app)   #弹出警告消息
#     doc.Save("test.doc")  #保存
    doc.Close(False)  #文档关闭
    word.Application.Quit()   #word应用退出

if __name__=='__main__':
    Tk().withdraw()  #不让tk顶级窗口出现,因为默认tk会自动创建一个顶级窗口,而且不会将其隐藏
    word()
没有更多推荐了,返回首页