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")
  • 相关阅读:
    模拟登陆江西理工大学教务系统
    python3爬虫 -----华东交大校园新闻爬取与数据分析
    以selenium模拟登陆12306
    PAT (Basic Level) Practice (中文)1076 Wifi密码 (15 分)
    PAT (Basic Level) Practice (中文)1047 编程团体赛 (20 分)
    PAT (Basic Level) Practice (中文)1029 旧键盘 (20 分)
    PAT (Basic Level) Practice (中文)1016 部分A+B (15 分)
    PAT (Basic Level) Practice (中文)1031 查验身份证 (15 分)
    PAT (Basic Level) Practice (中文)1041 考试座位号 (15 分)
    PAT (Basic Level) Practice (中文)1037 在霍格沃茨找零钱 (20 分)
  • 原文地址:https://www.cnblogs.com/tfzz/p/14676157.html
Copyright © 2011-2022 走看看