zoukankan      html  css  js  c++  java
  • python-docx操作word文档

    参考博主:https://blog.csdn.net/zhouz92

    下载模块

    1.正常安装
    pip install python-docx
    
    2.相信这一步大家都没问题,部分环境可能会有不能使用pip的情况,也可以使用easy_install或者源码来进行安装:
    easy_install python-docx
    
    3.源码安装
    tar xvzf python-docx-{version}.tar.gz
    cd python-docx-{version}
    python setup.py install
    
    4.其他安装方式
    另外附上一个下载链接:
    https://files.pythonhosted.org/packages/4a/8e/5a01644697b03016de339ef444cfff28367f92984dc74eddaab1ed60eada/docx-0.2.4.tar.gz
    Linux用户可以使用wget来下载。windows用户可以打开浏览器,输入地址,使用浏览器下载。不建议使用迅雷等工具。
    
    如果您具备一定的英语水平,可以直接阅读官方的用户手册,地址如下:
    
    https://python-docx.readthedocs.io/en/latest/#   
    View Code

    全局设置

    import docx
    from docx.enum.text import WD_ALIGN_PARAGRAPH
    from docx.oxml.ns import qn
    from docx.shared import Cm, Pt
    
    document = Document()
    # 设置一个空白样式
    style = document.styles['Normal']
    # 设置西文字体
    style.font.name = 'Times New Roman'
    # 设置中文字体
    style.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')

    一 标题操作

    1.标题写操作

    from docx import Document
    from docx.shared import Inches
    #样式
    from docx.enum.text import WD_ALIGN_PARAGRAPH
    
    #1.创建 Document 对象,相当于打开一个 word 文档
    document = Document()
    
    #2.添加标题:add_heading(text="",level=1),text:标题内容 level:标题级别范围0-9
    # t1 = document.add_heading(text='这是一级标题', level=1)
    # t2 = document.add_heading(text='这是二级标题', level=2)
    .....
    # t9 = document.add_heading(text='这是九级标题', level=9)
    # t10 = document.add_heading(text='这是九级标题', level=10) #报错:ValueError: level must be in range 0-9, got 10
    
    #3.样式:居中
    title_obj = document.add_heading(text='这是文档标题', level=0)
    title_obj.alignment = WD_ALIGN_PARAGRAPH.CENTER #居中默认带下划线
    
    #4.生成文件
    document.save("1-使用标题.docx") #文件路径

    2.标题读

    3.标题样式

    # 设置标题
    title_ = document.add_heading(level=0)
    # 标题居中
    title_.alignment = WD_ALIGN_PARAGRAPH.CENTER
    # 添加或追加标题内容
    title_run = title_.add_run("title")
    # 设置标题字体大小
    title_run.font.size = Pt(14)
    # 设置标题西文字体
    title_run.font.name = 'Times New Roman'
    # 设置标题中文字体
    title_run.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')

     二 段落操作

    1.段落写

    import docx
    from docx.enum.text import WD_ALIGN_PARAGRAPH
    from docx.oxml.ns import qn
    from docx.shared import Cm, Pt
    #1.添加段落add_paragraph(text,style):text内容 style样式# 换行符,空格符
    document = Document()
    p1 = document.add_paragraph(text="这只是
    段落	而已1")
    print(paragraph1.text) #段部落内容
    
    #2.追加段落:add_run(self, text=None, style=None)
    p1.add_run(text="段落2追加的内容")
    
    #3.指定插入段落:某个段落之前插入落:insert_paragraph_before(self, text=None, style=None)
    p2 = p1.insert_paragraph_before('这是段落1之前插入的新段落')
    
    #4.删除段落clear():将段落删除,并返回改段内容,但是格式和样式会保留
    delete_p1 = p1.clear().text  #""
    print(11,(delete_content,1),type(delete_content)#<docx.text.paragraph.Paragraph object at 0x00000204EAF04970> <class 'docx.text.paragraph.Paragraph'>
    
    #5.保存
    document.save("1-使用标题.docx") #文件路径

    2.段落读

    #1.获取Word文档所有段落对象:列表
    paragraphs = doc.paragraphs
    print(len(paragraphs),paragraphs)
    # 注意:
    # paragraphs 获取的是文档中所有段落对象的列表,严格来说是word文档中正文部分的段落对象列表。因为通过前文的介绍,许多除正文部分,如 表格,页面页脚等元素也包含 paragraph 对象。
    # 而 doc.paragraphs 获取到的 paragraph 不包含这些段落对象。
    
    #2.获取段落对象:索引0,默认是文档标题
    par0 = paragraphs[0]
    print(par0)
    #3.获取段落文字
    par0_string = par0.text
    print(par0_string)
    #获取所有段落文字信息
    pars_string = [par.text for par in paragraphs]
    print(pars_string)
    
    #4.获取段落格式
    print('段落对齐方式:',par0.paragraph_format.alignment)
    # 段落对齐方式: LEFT (0)
    print('左缩进:',par0.paragraph_format.left_indent)
    # 左缩进: None
    print('右缩进:',par0.paragraph_format.right_indent)
    # 右缩进: None
    print('首行缩进:',par0.paragraph_format.first_line_indent)
    # 首行缩进: 304800
    print('行间距:',par0.paragraph_format.line_spacing)
    # 行间距: 1.5
    print('段前间距:',par0.paragraph_format.space_before)
    # 段前间距: 198120
    print('段后间距:',par0.paragraph_format.space_after)

    段落文字

    # 1.获取段落的 run 对象列表
    par1 = paragraphs[1]
    runs = par1.runs#获取 runs列表
    print(runs,len(runs))
    # 获取run对象
    run_0 = runs[0]
    print(run_0.text) # 获取 run 对象文字信息
    
    # 获取文字格式信息
    print('字体名称:',run_0.font.name,par1.style.font.name) #分别获取段落和run对象字体名称,下同理
    # 字体名称: 宋体
    print('字体大小:',run_0.font.size)
    # 字体大小: 152400
    print('是否加粗:',run_0.font.bold)
    # 是否加粗: None
    print('是否斜体:',run_0.font.italic)
    # 是否斜体: True
    print('字体颜色:',run_0.font.color.rgb)
    # 字体颜色: FF0000
    print('字体高亮:',run_0.font.highlight_color)
    # 字体高亮: YELLOW (7)
    print('下划线:',run_0.font.underline)
    # 下划线: True
    print('删除线:',run_0.font.strike)
    # 删除线: None
    print('双删除线:',run_0.font.double_strike)
    # 双删除线: None
    print('下标:',run_0.font.subscript)
    # 下标: None
    print('上标:',run_0.font.superscript)

    3.段落样式

    
    
    from docx import Document
    from docx.shared import Inches
    #样式
    from docx.enum.text import WD_ALIGN_PARAGRAPH
    from docx.shared import Cm, Pt
    from docx.oxml.ns import qn
    ##字体颜色
    from docx.shared import RGBColor

    document=Document( )
    #添加段落
    # paragraph=document.add_paragraph().add_run('this is test for left_indent with inches.111111111111111111111111111111111111111111111111111111111111111111111111111')
    paragraph=document.add_paragraph('this is test for left_indent with inches')
    #获取段落样式
    paragraph_format=paragraph.paragraph_format
    #1.段落整体缩进
    # paragraph_format.left_indent=Inches(0.3) #调整左缩进0.3英寸
    #paragraph_format.right_indent = Pt(20) #设置段落从右开始缩进,使用Pt来衡量

    #2.首行缩进0.74厘米,即2个字符
    paragraph_format.first_line_indent = Cm(0.74)
    paragraph_format.alignment=WD_ALIGN_PARAGRAPH.CENTER #内容居中

    #4.行间距
    #设置与上一段间隔 Pt(5)
    # paragraph.space_after = Pt(20)
    #设置与下一段间隔 Pt(10)
    # paragraph.space_before = Pt(10)

    #5.字体操作
    add_run1 = paragraph.add_run("追加段落") #追加段落

    # paragraph.style.font.bold = True #整体段落加粗
    add_run1.font.bold = True #追加段落加粗

    # paragraph.style.font.italic = True #整体斜体
    add_run1.font.italic = True #追加斜体

    # paragraph.style.font.underline = True #整体下划线
    add_run1.font.underline = True #追加内容下划线

    # add_run1.font.color.rgb=RGBColor(0x42, 0x24 , 0xE9) #追加内容颜色
    paragraph.style.font.color.rgb=RGBColor(0x42, 0x24 , 0xE9) #整体内容颜色

    #字体大小
    paragraph.style.font.size = Pt(20)
    add_run1.font.size = Pt(20)

    #字体样式
    #设置西文字体
    paragraph.style.font.name = '仿宋'
    # add_run1.font.name = '仿宋'
    # 设置中文字体
    # paragraph.style.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')

    #6.设置段落内部文字在遇到需分页情况时处理状态
      par2.paragraph_format.keep_together = True # 段中不分页
      par2.paragraph_format.keep_with_next = True # 与下段同页
      par2.paragraph_format.page_break_before = True # 段前分页
      par2.paragraph_format.widow_control = True # 孤行控制

    document.save('段落.docx')

    三 表格

    1.写

    from docx import Document
    from docx.shared import Inches
    #样式
    from docx.enum.text import WD_ALIGN_PARAGRAPH
    from docx.shared import Cm, Pt
    from docx.oxml.ns import qn
    ##字体颜色
    from docx.shared import RGBColor
    #5.操作表格
    
    document=Document(  )
    """
    在Word中使用表格是一个比较复杂的内容。这一点与使用Python操作Excel相差不大,本节不会涉及太多与样式有关的内容,关于样式会在《在word文档中使用样式》使用样式一节中做详述的说明。
    如果想要熟练使用python-docx操作Word文档,需要认识Table()、_Cell()、 _Row()、 _Rows() _Column() 和 _Columns()五个类。
    在Word文档中添加表格需要使用Document()对象的add_table()方法。
    """
    #1。创建表格:add_table(rows, cols, style=None) add_table()方法会返回一个Table对象。rows代表行数,cols代表列数,style代表样式。
    table_obj = document.add_table(3, 3,style='Table Grid')
    
    # """
    # Table()对象中报了对表格进行操作的方法和属性,如下:
    # add_column(width):如果你想添加列,可以使用此方法,使用此方法需要设置列宽
    # add_row():如果你想添加行,可以添加此方法
    # cell(row_idx, col_idx):如果你想访问单个单元格,可以使用此方法
    # row_cells(row_idx):返回一个序列,序列包含的是行号为row_idx的行内所有单元格
    # column_cells(column_idx):返回一个序列,序列包含的是列号为column_idx的列内所有单元格
    # rows:返回的是_Rows对象,是一个包含了所有行(_Row对象)的列表
    # columns:返回的是_Columns对象,是一个包含了所有列(_Column对象)的列表
    # """
    #2.添加列
    # table_obj.add_column(3)
    #3.添加行
    # table_obj.add_row()
    #4.单个单元格操作
    # """
    # cell()方法实际上是返回了一个_Cell()对象。_Cell()对象代表的是一个具体的单元格,包含了操作一个单个单元格的方法与属性,如下:
    # add_paragraph(text=u'', style=None):在单元格内添加段落。
    # add_table(rows, cols):在单元格中添加表格
    # merge(other_cell):合并单元格
    # """
    #4.1选取某一单元格
    cell_obj = table_obj.cell(1,1)
    print(cell_obj) #<docx.table._Cell object at 0x000001AD64AE0910>
    #4.2添加段落
    cell_obj.add_paragraph(text='11', style=None)
    print(1,cell_obj.text,9)
    #删除段落
    table_obj.cell(1, 1).text = ''
    print(2,cell_obj.text,10) #"11"
    #4。3表格添加内容
    paragraph = table_obj.cell(0, 1).text='33'
    print(3, table_obj.cell(0, 1).text) #"33"
    #删除单元格数据
    paragraph = table_obj.cell(0, 1).text=''
    print(4, table_obj.cell(0, 1).text) #"33"
    #4.4合并单元格
    # table_obj.cell(0,0).merge(table_obj.cell(2,2))
    c2 =cell_obj.merge(table_obj.cell(2,2))
    c2.add_paragraph(text='22', style=None)
    
    # 5.3 行与列操作:rows,columns
    """
    1.
    rows:返回的是_Rows对象,是一个包含了所有行(_Row对象)的列表
    columns:返回的是_Columns对象,是一个包含了所有列(_Column对象)的列表
    2.方法
    这时它的元素是表格中的每一行/列。_Rows/_Columns对象中包含了一个属性,如下:
    
    table:用来返回它所属的列表
    _Row对象代表是表格中的行,具有如下属性:
    
    cells:即这一行所有的单元格,是个列表
    height:行高
    height_rule:行高规则,如果没有设置,则默认没有
    table:用来返回它所属的列表
    _Column对象代表的是表格中的列,具有如下属性:
    
    cells:即这一列所有的单元格,是个列表
    table:用来返回它所属的列表
    width:列宽
    """
    #1.获取行与列
    row_ls = table_obj.rows
    
    document.save('表格.docx')

    # 获取文档中表格信息
    tables = doc.tables # 获取文档中所有表格对象的列表
    print(tables)
    # [<docx.table.Table object at 0x000001957059CD48>]
    print(len(tables)) # 查看文档中表格数量
    # 1
    table0 = tables[0]  # 获取表格对象
    
    # 获取表格的样式信息
    print(table0.style)
    # _TableStyle('Normal Table') id: 190621384
    
    # 获取一个表格的所有单元格
    cells = table0._cells
    print(len(cells)) # 表格中单元格数量
    # 15
    
    # 获取单元格内所有文字信息
    cells_string = [cell.text for cell in cells]
    print(cells_string)
    
    
    # 获取表格对象行数量、列数量
    col_num = len(table0.columns)
    print(col_num) # 3
    # 行数量
    row_num = len(table0.rows)
    print(row_num) # 5
    
    # 获取行对象
    row0 = table0.rows[0]
    # 获取列对象
    col0 = table0.columns[0]
    
    # 获取行对象文字信息
    '要用 row0.cells 获取行对象的 cell 才能获取其文字信息'
    row0_string = [cell.text for cell in row0.cells]
    print(row0_string)
    
    # 获取列对象文字信息
    col0_string = [cell.text for cell in col0.cells]
    print(col0_string)

    四 图片

    1.写

    from docx import Document,shared
    from docx.shared import Inches
    #样式
    from docx.enum.text import WD_ALIGN_PARAGRAPH
    from docx.shared import Cm, Pt
    from docx.oxml.ns import qn
    ##字体颜色
    from docx.shared import RGBColor
    
    document = Document()
    
    #1.添加图片:add_picture(self, image_path_or_stream, width=None, height=None)
    # 在文档中增加图片,并对设置图片大小,当只设置一个方向的长度(宽或高)时,另一方向会自动缩放.
    document.add_picture('编程杂艺.png',width=shared.Inches(1))  # 按英寸设置
    document.add_picture('编程杂艺.png',height=shared.Cm(2))  # 按厘米设置
    
    
    #4.生成文件
    document.save("1-使用图片.docx") #文件路径

    四 章节页眉页脚

    1.新建章节

    sec = document.sections
    print(sec) # <docx.section.Sections object at 0x000000000B312E88>
    print(len(sec)) # 1
    
    # 新建一个章节
    document.add_section()
    print(len(sec)) # 2

    2.获取文档页面边距:word 文档的页边距、页眉页脚的设置和章节对象有关:

    
    
    from docx import Document
    #1.读取文档
    doc = Document('1-使用页.docx')
    #2. 获取文档所有章节:列表
    sections = doc.sections
    print(sections)# <docx.section.Sections object at 0x000000000B2E1148>
    # 查看章节数量
    print(len(sections)) # 2
    #3.获取单个章节
    sec0 = sections[0]
    # 获取页面边距值:(单位为像素)
    print('左边距:',sec0.left_margin)
    # 左边距: 1143000
    print('右边距:',sec0.right_margin)
    # 右边距: 1143000
    print('上边距:',sec0.top_margin)
    # 上边距: 914400
    print('下边距:',sec0.bottom_margin)
    # 下边距: 914400
    print('页眉边距:',sec0.header_distance)
    # 页眉边距: 457200
    print('页脚边距:',sec0.footer_distance)
    # 页脚边距: 457200

    3.设置文档页面边距、页面大小

    # 设置页面高度、宽度
    sec0.page_height = shared.Inches(15)
    sec0.page_width = shared.Inches(10)
    
    # 也可以设置页面的边距:
    sec0.left_margin = shared.Inches(1)
    sec0.right_margin = shared.Inches(1)
    sec0.top_margin = shared.Inches(2)
    sec0.bottom_margin = shared.Inches(2)

    4、设置页眉页脚和页面方向

    设置页面页脚时,先获取页眉页脚对象:

    #1. 设置页眉
    head0 = sec0.header  # 返回页眉对象
    font0 = sec0.footer  # 返回页脚对象
    print(head0)
    # <docx.section._Header object at 0x000000000B312E08>
    print(font0)
    # <docx.section._Footer object at 0x000000000B312B88>
    
    "在设置word文档的页眉页脚时,有一个非常重要的是否与前一节相同"
    # 查看页眉是否和上节一直
    print(head0.is_linked_to_previous)  # 默认为 True
    
    # 设置页眉
    "页眉也是一个块级对象,里面也包含了 Paragraph 对象,"
    "所以对齐方式,文字格式设置方式和前文介绍一致。"
    #页眉页脚
    sec = document.sections
    sec0 = sec[0] # 获取章节对象
    head0 = sec0.header # 返回页眉对象
    font0 = sec0.footer # 返回页脚对象

    #设置页眉
    head0_par = head0.paragraphs[0]
    head0_par.add_run('页眉')

    # 设置页脚
    font0_par = font0.paragraphs[0]
    font0_par.add_run('页脚')
     # 注: 设置页脚按序列增加的方式暂未找到

    # 导入设置页面方向所需模块
    from docx.enum.section import WD_ORIENT
    # 获取章节对象
    section = document.sections[0]
    # 设置页面方向
    section.orientation = WD_ORIENT.LANDSCAPE # 横向

    可设置项有横向( LANDSCAPE ) 和纵向 ( PORTRAIT )

     背景颜色设置方法: (与字体颜色设置方法有区别)

    # 设置背景颜色
    from  docx.enum.text import WD_COLOR_INDEX
    run_2.font.highlight_color = WD_COLOR_INDEX.YELLOW
    
    背景颜色可选值有:
    '''
    'AUTO', 0, 'default'
    'BLACK', 1, 'black'
    'BLUE', 2, 'blue'
    'BRIGHT_GREEN', 4, 'green',
    'DARK_BLUE', 9, 'darkBlue',
    'DARK_RED', 13, 'darkRed'
    'DARK_YELLOW', 14, 'darkYellow'
    'GRAY_25', 16, 'lightGray'
    'GRAY_50', 15, 'darkGray'
    'GREEN', 11, 'darkGreen'
    'PINK', 5, 'magenta'
    'RED', 6, 'red'
    'TEAL', 10, 'darkCyan'
    'TURQUOISE', 3, 'cyan'
    'VIOLET', 12, 'darkMagenta'
    'WHITE', 8, 'white'
    'YELLOW', 7, 'yellow'
    '''

    分页

    from docx import Document
    document = Document()
    document.add_paragraph('这是第一页')
    document.add_page_break()
    document.add_paragraph('这是第二页')
    document.save("5-使用分页.docx")
  • 相关阅读:
    在多线程中使用静态方法是否有线程安全问题(转载)
    为什么乐观的人多能成功呢?
    每个人都是超级英雄-《技巧:如何用一年的时间获得十年的经验》
    003|再谈10000小时,三板斧破四困境
    002|也谈10000小时
    在职场中如何通过讲故事,影响他人、支持自己(下篇)
    全面解读:微信服务号升级和群发增至4条的应用方法
    Technical reading July-15
    read links July-14
    Technical news July-11
  • 原文地址:https://www.cnblogs.com/tfzz/p/14676157.html
Copyright © 2011-2022 走看看