目录
- 引言
- 安装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')