分享

《自动化办公》Python

 Four兄 2019-08-25

虽然Word不好用, 但还必须得用它, python-docx是专门用于编辑Word文档的一个工具库, 它有两大用途, 自动化生成word文档 and 自动化修改文档

1. 自定义样式

python可以自定义三类样式

  • 段落样式
  • 字符样式
  • 表格样式(一般用不到)

这三类样式的创建方式基本一致, 只是创建参数 略有不同(1为段落样式, 2为字符样式, 3为表格样式)

以设置段落样式为例

  1. # 创建自定义段落样式(第一个参数为样式名, 第二个参数为样式类型, 1为段落样式, 2为字符样式, 3为表格样式)
  2. UserStyle1 = document.styles.add_style('UserStyle1', 1)
  3. # 设置字体尺寸
  4. UserStyle1.font.size = Pt(40)
  5. # 设置字体颜色
  6. UserStyle1.font.color.rgb = RGBColor(0xff, 0xde, 0x00)
  7. # 居中文本
  8. UserStyle1.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER
  9. # 设置中文字体
  10. UserStyle1.font.name = '微软雅黑'
  11. UserStyle1._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
  12. 复制代码

2.理解结构关系

  • 往文档中插入文本内容, 首先要插入一个段落, 段落后面可追加字符, 但文档不能直接插入字符
  • 段落之间会自动以 回车符号 分隔
  • 段落 和 字符 可 各自设置独立的样式

实例: 插入段落, 插入段落后追加字符

  1. # 使用自定义段落样式
  2. document.add_paragraph('自定义段落样式', style = UserStyle1)
  3. # 使用自定义字符样式
  4. document.add_paragraph('').add_run('正月里采花无哟花采,二月间采花花哟正开,二月间采花花哟正开。三月里桃花红哟似海,四月间葡萄架哟上开,四月间葡萄架哟上开。', style = UserStyle2)
  5. 复制代码

3. 插入图片

python-docx支持将图片插入文档, 且可以设置图片大小

实例代码:

  1. document.add_picture('少女17087938.jpg', width=Inches(5))
  2. 复制代码

4.插入列表

插入有序列表

  1. document.add_paragraph('把冰箱门打开', style='List Number')
  2. document.add_paragraph('把大象装进去', style='List Number')
  3. document.add_paragraph('把冰箱门关上', style='List Number')
  4. 复制代码

插入无序列表

  1. document.add_paragraph('天地匆匆 惊鸿而过 路有千百个', style='List Bullet')
  2. document.add_paragraph('遑遑无归 闲云逸鹤 人间红尘过', style='List Bullet')
  3. document.add_paragraph('引势而流 鸿门乱局 各有各选择', style='List Bullet')
  4. document.add_paragraph('乾震坎艮 坤巽离兑 定一切生克', style='List Bullet')
  5. 复制代码

5.插入表格

把表格看做二维数组, 然后往数组中填数据

  1. rows_num = 5
  2. cols_num = 6
  3. table = document.add_table(rows=rows_num, cols=cols_num, style = 'Table Grid')
  4. for r in range(rows_num):
  5. for c in range(cols_num):
  6. table.cell(r, c).text = '第{r}行{c}列'.format(r = r+1, c = c+1)
  7. 复制代码

完整源码:

  1. from docx import Document
  2. from docx.shared import Inches
  3. from docx.dml.color import ColorFormat
  4. from docx.shared import Pt
  5. from docx.shared import RGBColor
  6. from docx.oxml.ns import qn
  7. from docx.enum.style import WD_STYLE_TYPE
  8. from docx.enum.text import WD_ALIGN_PARAGRAPH
  9. def main():
  10. # 创建文档对象
  11. document = Document()
  12. # 设置默认字体
  13. document.styles['Normal'].font.name = '微软雅黑'
  14. document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
  15. # 创建自定义段落样式(第一个参数为样式名, 第二个参数为样式类型, 1为段落样式, 2为字符样式, 3为表格样式)
  16. UserStyle1 = document.styles.add_style('UserStyle1', 1)
  17. # 设置字体尺寸
  18. UserStyle1.font.size = Pt(40)
  19. # 设置字体颜色
  20. UserStyle1.font.color.rgb = RGBColor(0xff, 0xde, 0x00)
  21. # 居中文本
  22. UserStyle1.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER
  23. # 设置中文字体
  24. UserStyle1.font.name = '微软雅黑'
  25. UserStyle1._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
  26. # 创建自定义字符样式(第一个参数为样式名, 第二个参数为样式类型, 1为段落样式, 2为字符样式, 3为表格样式)
  27. UserStyle2 = document.styles.add_style('UserStyle2', 2)
  28. # 设置字体尺寸
  29. UserStyle2.font.size = Pt(15)
  30. # 设置字体颜色0c8ac5
  31. UserStyle2.font.color.rgb = RGBColor(0x0c, 0x8a, 0xc5)
  32. # 设置段落样式为宋体
  33. UserStyle2.font.name = '宋体'
  34. UserStyle2._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
  35. # 使用自定义段落样式
  36. document.add_paragraph('自定义段落样式', style = UserStyle1)
  37. # 使用自定义字符样式
  38. document.add_paragraph('').add_run('正月里采花无哟花采,二月间采花花哟正开,二月间采花花哟正开。三月里桃花红哟似海,四月间葡萄架哟上开,四月间葡萄架哟上开。', style = UserStyle2)
  39. # 设置粗体字
  40. document.add_paragraph('设置粗体字:').add_run('粗体字').bold = True
  41. # 设置斜体字
  42. document.add_paragraph('设置斜体字:').add_run('斜体字').italic = True
  43. # 设置字号50
  44. document.add_paragraph('设置字号50:').add_run('50').font.size = Pt(50)
  45. # 设置字体颜色为 af2626
  46. document.add_paragraph('设置字体颜色:').add_run('颜色').font.color.rgb = RGBColor(0xaf, 0x26, 0x26)
  47. # 样式叠加: 将字体改到30号并且将字体改成特定颜色;
  48. doubleStyle = document.add_paragraph('同时设置文字颜色和字号:').add_run('颜色和尺寸')
  49. doubleStyle.font.size = Pt(30)
  50. doubleStyle.font.color.rgb = RGBColor(0xaf, 0x26, 0x26)
  51. # 添加分页符
  52. document.add_page_break()
  53. # 创建 有序列表
  54. document.add_paragraph('').add_run('有序列表').font.size = Pt(30)
  55. document.add_paragraph('把冰箱门打开', style='List Number')
  56. document.add_paragraph('把大象装进去', style='List Number')
  57. document.add_paragraph('把冰箱门关上', style='List Number')
  58. # 创建 无序列表
  59. document.add_paragraph('').add_run('无序列表').font.size = Pt(30)
  60. document.add_paragraph('天地匆匆 惊鸿而过 路有千百个', style='List Bullet')
  61. document.add_paragraph('遑遑无归 闲云逸鹤 人间红尘过', style='List Bullet')
  62. document.add_paragraph('引势而流 鸿门乱局 各有各选择', style='List Bullet')
  63. document.add_paragraph('乾震坎艮 坤巽离兑 定一切生克', style='List Bullet')
  64. # 添加分页符
  65. document.add_page_break()
  66. # 添加图片
  67. document.add_paragraph('').add_run('添加图片').font.size = Pt(30)
  68. document.add_picture('少女17087938.jpg', width=Inches(5))
  69. # 添加分页符
  70. document.add_page_break()
  71. document.add_paragraph('').add_run('创建表格').font.size = Pt(30)
  72. # 创建两行两列的表格
  73. rows_num = 5
  74. cols_num = 6
  75. table = document.add_table(rows=rows_num, cols=cols_num, style = 'Table Grid')
  76. for r in range(rows_num):
  77. for c in range(cols_num):
  78. table.cell(r, c).text = '第{r}行{c}列'.format(r = r+1, c = c+1)
  79. # 保存文档
  80. document.save('Python生成的文档.docx')
  81. if __name__ == '__main__':
  82. main()
  83. 复制代码

将源码保存为单独的python文件后,安装python-docx, 找一张图片,命名为少女17087938.jpg, 将图片与python文件放到同一个目录, 然后再python3环境下运行python文件即可! 最后附测试图片一张:

最终效果:

自动化修改文档

实例: 将当前目录下, 所有docx文件内的'海南大学', 替换为'Hainan University', 并将新文件添加前缀new后, 保存到当前目录下

  1. import docx
  2. import os
  3. import re
  4. # 传入三个参数, 旧字符串, 新字符串, 文件对象
  5. def replace_text(old_text, new_text, file):
  6. # 遍历文件对象
  7. for f in file.paragraphs:
  8. # 如果 旧字符串 在 某个段落 中
  9. if old_text in f.text:
  10. print('替换前:', f.text)
  11. # 将段落存入 inline
  12. inline = f.runs
  13. # 遍历 段落 生成 i
  14. for i in inline:
  15. # 如果 旧字符串 在 i 中
  16. if old_text in i.text:
  17. # 替换 i.text 内文本资源
  18. text = i.text.replace(old_text, new_text)
  19. i.text = text
  20. print('替换后===>', f.text)
  21. def main():
  22. # 获取当前目录下所有的文件名列表
  23. old_file_names = os.listdir()
  24. # 获取所有docx文件名列表
  25. docx_file_names = []
  26. for old_file_name in old_file_names:
  27. if re.match(r'^[^~].*\.docx', old_file_name):
  28. print(old_file_name)
  29. docx_file_names.append(old_file_name)
  30. for docx_file_name in docx_file_names:
  31. try:
  32. # 获取文件对象
  33. file=docx.Document(docx_file_name)
  34. # 三个参数: 旧的字符串, 新的字符串, 文件对象
  35. print('开始替换:', docx_file_name)
  36. replace_text('海南大学', 'Hainan University', file)
  37. file.save('new_'+docx_file_name)
  38. print(docx_file_name, '替换成功')
  39. except:
  40. print(docx_file_name, '替换失败')
  41. pass
  42. if __name__ == '__main__':
  43. main()
  44. 复制代码

关于Python操控PPT:https://www.jianshu.com/p/5b294515b480

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约