目录

  • 引言
  • 安装python-docx
  • 删除空段落
  • 不同文本设置不同字体样式
  • 插入页眉页脚
  • DataFrame数据写入到word表格中
  • 删除指定表格
  • 绘制表格以及合并指定单元格并赋值
  • 设置段落对齐格式
  • 实现分栏
  • 以bytes形式插入图像

引言
  • 整理收集常用到的一些python-docx代码片段。当找不到自己想要问题的解决方案时,不妨去issue去逛一下,一般会有惊喜的。
  • python-docx官方文档:docs
  • python-docx官方repo:Github
安装python-docx
pip install python-docx
删除空段落
def delete_paragraph(paragraph):
    p = paragraph._element
    p.getparent().remove(p)
    p._p = p._element = None
不同文本设置不同字体样式
import docx
from docx.oxml.ns import qn
from docx.shared import Pt 
 
newfile = docx.Document()
p1 = newfile.add_paragraph()
text1 = p1.add_run("第一段文字是中文;The first paragraph is in English")  # 注意这里是add_run
text1.font.size = Pt(15)                # 字体大小
text1.bold = True                    # 字体是否加粗
text1.font.name = 'Times New Roman'           # 控制是西文时的字体
text1.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')  # 控制是中文时的字体

p2 = newfile.add_paragraph()
text2 = p2.add_run("第二段文字是中文;The second paragraph is in English")
text2.font.size = Pt(10)
text2.bold = False # 字体是否加粗
text2.font.name = 'Times New Roman'
text2.element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
newfile.save("newdocx.docx")
插入页眉页脚
from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

document = Document()  # 新建文档

header = document.sections[0].header  # 获取第一个节的页眉
print('页眉中默认段落数:', len(header.paragraphs))
paragraph = header.paragraphs[0]  # 获取页眉的第一个段落
paragraph.add_run('这是第一节的页眉')  # 添加页面内容

footer = document.sections[0].footer  # 获取第一个节的页脚
paragraph = footer.paragraphs[0]  # 获取页脚的第一个段落
paragraph.add_run('这是第一节的页脚')  # 添加页脚内容

document.save('设置页眉页脚.docx')
DataFrame数据写入到word表格中
import docx
import camelot

# downlink: https://github.com/camelot-dev/camelot/blob/master/docs/_static/pdf/foo.pdf
pdf_path = 'foo.pdf'
tables = camelot.read_pdf(pdf_path, flavor='lattice', backend="poppler",
                          line_scale=40,)
doc = docx.Document()
df = tables[0].df
rows, cols = df.shape[:2]
t = doc.add_table(rows, cols, style='Table Grid')
for i in range(rows):
    for j in range(cols):
        t.cell(i, j).text = str(df.values[i, j])

doc.save('tmp.docx')
删除指定表格
from docx import Document

document = Document('YOUR_DOCX')

def Delete_table(table):
        document.tables[table]._element.getparent().remove(document.tables[table]._element)

Delete_table(0)

document.save('OUT.docx')
绘制表格以及合并指定单元格并赋值
from docx import Document

document = Document()

table = document.add_table(rows=4, cols=3, style='Table Grid')

# 合并(0, 0)到(1, 0)之间所有的单元格
table.cell(0, 0).merge(table.cell(1, 0))

# 赋值
table.cell(0, 0).text = 'xxxx'

# 当为合并的单元格多次赋值时,最终只会保留最后一次赋值
table.cell(1,0).text = '啦啦啦啦'

# 加粗该文本
text = '啦啦啦啦'
table.cell(1, 0).text = ''
para = table.cell(1,0).paragraphs[0]
para.add_run(text).bold = True

document.save('demo.docx')
  • 结果图:
  • 参考链接:
  • python生成word文档的表格
  • docs
设置段落对齐格式
from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

doc = Document()
paragraph = doc.add_paragraph('Hello world')

# 设置两端对齐
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
  • 其他可选的有,具体效果一试便知(来源):

可选值

含义

LEFT

左对齐

CENTER

居中对齐

RIGHT

右对齐

JUSTIFY

两端对齐

DISTRIBUTE

分散对齐

JUSTIFY_MED

以一个合适的字符压缩率两端对齐

JUSTIFY_HI

以一个较高的字符压缩率两端对齐

JUSTIFY_LOW

以一个较低的字符压缩率两端对齐

THAI_JUSTIFY

按照泰语的格式两端对齐

实现分栏
from docx import Document
from docx.oxml import OxmlElement
from docx.oxml.ns import qn

document = Document()
section = document.sections[0]

sectPr = section._sectPr
cols = sectPr.xpath('./w:cols')[0]
cols.set(qn('w:num'),'2')

document.save('demo.docx')
以bytes形式插入图像
from docx import Document
from docx.shared import Cm
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
import cv2
from io import BytesIO

# 这里假装im是从其他地方得来的
im = cv2.imread('a.jpg')
data = cv2.imencode('.jpg', im)[1]
img_bytes = BytesIO(data.tobytes())

doc = Document()
paragraph = doc.add_paragraph()

# 设置段落整体居中,这样图像就会居中
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
run = paragraph.add_run("")
run.add_picture(img_bytes, width=Cm(13.93))

doc.save('test.docx')