3. Word 基本操作

# pip install python-docx

def first():

    from docx import Document

    doc1 = Document()
    doc1.add_heading('如何使用 Python 创建和操作 Word', 0)
    doc1.save('./办公自动化/files/word.docx')

def start1():
    from docx import Document

    doc1 = Document()

    # 标题操作
    doc1.add_heading('如何使用 Python 创建和操作 Word', 0)
    doc1.add_heading('Python 操作 Word 1级标题', level=1)
    doc1.add_heading('Python 操作 Word 2级标题', level=2)
    doc1.add_heading('Python 操作 Word 3级标题', level=3)
    # doc1.add_page_break()  # 分页

    # 增加段落
    doc1.add_paragraph('这个是段落内容', )
    doc1.add_paragraph('这个是段落内容', 'Title')   # 等于0级标题
    doc1.add_paragraph(
        '       Python是一门计算机程序编程语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。是一种解释型脚本语言。它是由荷兰人吉多·范罗苏姆所发明的。')
    paragraph = doc1.add_paragraph(
        '       Python是一门计算机程序编程语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。是一种解释型脚本语言。它是由荷兰人吉多·范罗苏姆所发明的。')
    # 在段落后面增加内容
    paragraph.add_run('在段落后面增加内容!')

    # 增加无序列表
    doc1.add_paragraph('哪个不是动物:')
    doc1.add_paragraph('喜羊羊', style='List Bullet')
    doc1.add_paragraph('懒羊羊', style='List Bullet')
    doc1.add_paragraph('沸羊羊', style='List Bullet')
    doc1.add_paragraph('美羊羊', style='List Bullet')
    doc1.add_paragraph('灰太狼', style='List Bullet')

    # 增加有序列表
    doc1.add_paragraph('今年的学习计划:')
    doc1.add_paragraph('Python', style='List Number')
    doc1.add_paragraph('HTML', style='List Number')
    doc1.add_paragraph('JS', style='List Number')
    doc1.add_paragraph('CSS', style='List Number')

    # 增加引用
    doc1.add_paragraph('这个是引用', style='Intense Quote')

    # 增加图片
    from docx.shared import Inches   # 英寸
    # doc1.add_picture('D:\\git-python\\前端\\static\\img\\haha.png')
    # doc1.add_picture('D:\\git-python\\前端\\static\\img\\haha.png', width=Inches(5))    # 配置图片宽度为5英寸

    # 配置图片适应文档宽度
    pic = doc1.add_picture('D:\\git-python\\前端\\static\\img\\haha.png')
    height = pic.height
    width = pic.width
    page_width = doc1.sections[0].page_width  # 获取整个文档宽度
    page_left = doc1.sections[0].left_margin   # 页面左边页边距
    doc_width = page_width - (page_left * 2)   # 文档内容实际宽度
    print(page_width, page_left, doc_width)   # 7772400 1143000 5486400
    sc = height/width   # 计算图片高宽比
    pic.width = doc_width   # 配置图片宽度
    pic.height = int(doc_width * sc)

    # 增加表格
    table = doc1.add_table(rows=1, cols=3)
    cells = table.rows[0].cells
    cells[0].text = '编号'
    cells[1].text = '姓名'
    cells[2].text = '职业'

    data = [
        [1, '吕小布', '将军'],
        [2, '诸葛亮', '军师'],
        [3, '刘备', '主公']
    ]

    for i, n, w in data:
        cells = table.add_row().cells
        cells[0].text = str(i)
        cells[1].text = n
        cells[2].text = w

    doc1.save('./办公自动化/files/word.docx')

def use_style():
    from docx import Document
    from docx.shared import Inches, Pt, RGBColor
    from docx.enum.text import WD_ALIGN_PARAGRAPH
    from docx.oxml.ns import qn

    doc1 = Document()
    h1 = doc1.add_heading('', 0)
    h1.alignment = WD_ALIGN_PARAGRAPH.CENTER   # 居中
    h = h1.add_run('如何使用 Python 创建和操作 Word')
    h.font.size = Pt(28)

    # 段落字段样式
    p1 = doc1.add_paragraph('')
    p = p1.add_run('这是段落1:\n')
    p.font.size = Pt(28)
    p.bold = True
    p.font.shadow = True
    p.font.color.rgb = RGBColor(205, 51, 51)

    p1.add_run('这是内容1.1 # 粗体\n').bold = True   # 粗体
    p1.add_run('这是内容1.2 # 斜体\n').italic = True  # 斜体
    p1.add_run('这是内容1.3 # 字体大小\n').font.size = Pt(26)  # 字体大小
    p1.add_run('这是内容1.4 # 中划线\n').font.strike = True    # 中划线
    p1.add_run('这是内容1.5 # 下划线\n').font.underline = True    # 下划线
    p1.add_run('这是内容1.6 # 阴影\n').font.shadow = True    # 阴影
    p1.add_run('这是内容1.7 # 颜色\n').font.color.rgb = RGBColor(238, 118, 33)  # 颜色
    p1.add_run('Test font style 1.8 \n').font.name = '微软雅黑'
    run = p1.add_run('测试字体 1.9 \n')
    run.font.name = ''
    run._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')

    # 段落格式
    p2 = doc1.add_paragraph('')
    p2.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER   # 居中
    # 对齐方式为居中,没有这句话默认左对齐。另外右对齐:RIGHT,两端对齐:JUSTIFY,分散对齐:DISTRIBUTE
    p = p2.add_run('这是段落2\n')
    p.font.size = Pt(28)
    p.bold = True
    p.font.shadow = True
    p.font.color.rgb = RGBColor(139, 28, 98)

    # 缩进
    p3 = doc1.add_paragraph()
    p3.add_run('Python是一门计算机程序编程语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。是一种解释型脚本语言。它是由荷兰人吉多·范罗苏姆所发明的。')
    p3.paragraph_format.left_indent = Inches(0.5)   # 整体缩进 0.5英寸约缩进四个中文字符空格
    p4 = doc1.add_paragraph('')
    run = p4.add_run(
        'Python是一门计算机程序编程语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。是一种解释型脚本语言。它是由荷兰人吉多·范罗苏姆所发明的。')
    p4.paragraph_format.first_line_indent = Inches(0.25)  # 首行缩进

    # 段落间距
    last_paragraph = doc1.paragraphs[-1]   # 获取最后一个段落
    p4.paragraph_format.space_after = Pt(24)  # 设置段后间距为24点(大约1.5行)
    p4.paragraph_format.space_before = Pt(24)  # 设置段前间距为24点(大约1.5行)
    # p4.paragraph_format.space_within = Pt(24)  # 设置段落内

    # 行距
    p4.paragraph_format.line_spacing = 1.5  # 行距

    doc1.save('./办公自动化/files/word.docx')

def default_style():
    from docx import Document
    from docx.shared import Pt
    from docx.oxml.ns import qn

    # 创建一个新的Word文档
    doc = Document()

    # 设置中文字体
    doc.styles['Normal'].font.name = '宋体'
    doc.styles['Normal'].font.size = Pt(25)
    doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')

    # 添加中英文内容
    doc.add_paragraph('这是一段中文内容')
    doc.add_paragraph('This is an English paragraph')

    # 循环修改所有runs字体大小
    for paragraph in doc.paragraphs:
        paragraph.style = doc.styles['Normal']
        for run in paragraph.runs:
            run.font.size = Pt(10)

    # 保存文档
    doc.save('./办公自动化/files/word.docx')

def test():
    from docx import Document  # 导入docx包
    from docx.shared import Cm, Inches, Pt, RGBColor  # 导入单位换算函数

    document = Document('./办公自动化/files/word.docx')  # 新建word文档

    section = document.sections[0]  # 获取section对象
    # 修改页面大小
    # print('默认页面的宽度和高度:', section.page_width.cm,section.page_height.cm) # 打印默认页面宽度和高度
    # section.page_width = Cm(40)
    # section.page_height = Cm(40)
    # print('修改后页面的宽度和高度:', section.page_width.cm, section.page_height.cm) # 打印修改后的页面宽度和高度
    # 修改页边距
    print('上页边距:下页边距:左页边距:右页边距:', section.top_margin, section.bottom_margin,
          section.left_margin, section.right_margin)  # :上页边距#:下页边距#:左页边距#:右页边距
    section.top_margin = Cm(1.27)
    section.bottom_margin = Cm(1.27)
    section.left_margin = Cm(1.27)
    section.right_margin = Cm(1.27)
    print('上页边距:下页边距:左页边距:右页边距:', section.top_margin, section.bottom_margin,
          section.left_margin, section.right_margin)  # :上页边距#:下页边距#:左页边距#:右页边距
    # 设置页面大小
    document.sections[0].page_height = Cm(29.7)  # 设置A4纸的高度
    document.sections[0].page_width = Cm(21)  # 设置A4纸的宽
    # 修改纸张方向
    # from docx.enum.section import WD_ORIENTATION
    # WD_ORIENTATION.LANDSCAPE:纸张方向为横向。
    # WD_ORIENTATION.PORTRAIT:纸张方向为纵向。
    # section.orientation =  WD_ORIENTATION.LANDSCAPE
    # 设置分栏
    # from docx.oxml.ns import qn
    # section._sectPr.xpath('./w:cols')[0].set(qn('w:num'), '2') #设置为2栏
    # 设置页眉页脚
    # header = section.header  # 获取第一个节的页眉
    # print('页眉中默认段落数:', len(header.paragraphs))
    # paragraph = header.paragraphs[0]  # 获取页眉的第一个段落
    # paragraph.add_run('这是第一节的页眉2')  # 添加页面内容
    # footer = section.footer  # 获取第一个节的页脚
    # paragraph = footer.paragraphs[0]  # 获取页脚的第一个段落
    # paragraph.add_run('这是第一节的页脚2')  # 添加页脚内容

    # 段落样式修改
    # 新增加一段段落
    # paragraph = document.add_paragraph('这是一个新的段落\n 这又是一个段落哦')
    # 设置段落间距
    # space_before,space_after 上下间距
    # line_spacing,line_spacing_rule 行距
    # paragraph_format=paragraph.paragraph_format
    # paragraph_format.space_before=Pt(0)    #上行间距
    # paragraph_format.space_after=Pt(0)    #下行间距
    # paragraph_format.line_spacing=1.15  #行距
    # from docx.enum.text import WD_LINE_SPACING
    # ONE_POINT_FIVE,1.5倍行距
    # AT_LEAST,最小行距
    # DOUBLE,双倍行距
    # EXACTLY,固定值
    # MULTIPLE,多倍行距
    # SINGL,单倍行距
    # paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE

    # 整体样式调整
    from docx.oxml.ns import qn
    document.styles['Normal'].font.name = u'宋体'
    document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
    document.styles['Normal'].font.size = Pt(10.5)
    document.styles['Normal'].font.color.rgb = RGBColor(0, 80, 0)

    # 标题样式调整
    # 标题等级0-9这些数字,一级标题二级标题这样
    Head = document.add_heading("", level=1)  # 这里不填标题内容
    run = Head.add_run("真正要填写的标题")
    run.font.name = u'Cambria'
    run._element.rPr.rFonts.set(qn('w:eastAsia'), u'Cambria')
    run.font.color.rgb = RGBColor(0, 0, 0)

    import docx
    Head.alignment = docx.enum.text.WD_ALIGN_PARAGRAPH.CENTER  # 设置为居中

    # 段落字体样式
    from docx.enum.style import WD_STYLE_TYPE
    from docx.oxml.ns import qn
    page = document.add_paragraph('这是一个段落')
    run = page.add_run('这是一个段落')
    run.font.name = '微软雅黑'  # 字体名称
    run.font.size = Pt(50)  # 字体大小
    run.font.color.rgb = RGBColor(0, 0, 0)  # 字体颜色

    # 关闭孤行控制
    document.styles['Normal'].paragraph_format.widow_control = False

    from docx.enum.dml import MSO_THEME_COLOR_INDEX, MSO_COLOR_TYPE
    # 内置颜色
    # BACKGROUND_1、BACKGROUND_2、TEXT_1、TEXT_2、ACCENT_1、ACCENT_2、ACCENT_3、ACCENT_4、ACCENT_5和ACCENT_6
    run.font.color.theme_color = MSO_THEME_COLOR_INDEX.ACCENT_1  # 设置字体主题颜色
    run.font.highlight_color = MSO_THEME_COLOR_INDEX.DARK_1  # 设置高亮背景颜色
    # 加粗
    # run.bold = True
    # 斜体
    # run.font.italic = True
    # 设置下划线
    # run.font.underline = True
    # 设置轮廓线
    # run.font.outline = True
    # 设置阴影
    # run.font.shadow = True
    # 删除线
    # run.font.strike = True
    # 双删除线
    # run.font.double_strike = True
    # 设置下标
    # run.font.subscript = True
    # 设置上标
    # run.font.superscript = True

    # 结束保存
    document.save('./办公自动化/files/word.docx')  # 保存word文档

    """
    # 字号'八号'对应磅值5
    # 字号'七号'对应磅值5.5
    # 字号'小六'对应磅值6.5
    # 字号'六号'对应磅值7.5
    # 字号'小五'对应磅值9
    # 字号'五号'对应磅值10.5
    # 字号'小四'对应磅值12
    # 字号'四号'对应磅值14
    # 字号'小三'对应磅值15
    # 字号'三号'对应磅值16
    # 字号'小二'对应磅值18
    # 字号'二号'对应磅值22
    # 字号'小一'对应磅值24
    # 字号'一号'对应磅值26
    # 字号'小初'对应磅值36
    # 字号'初号'对应磅值42
    """

def get_docx(file):
    from docx import Document
    # 读取docx
    document = Document(file)
    for i in document.paragraphs:
        print(i.text)

    # 如果存在表格
    for t in document.tables:
        for rows in t.rows:
            for cell in rows.cells:
                print(cell.text)

if __name__ == '__main__':
    # first()
    # start1()
    # use_style()
    # default_style()
    get_docx('./办公自动化/files/违章通知书.docx')