python操作word文档(python-docx)

  • 1. 效果图
    • 1.1 python-docx文档标题段落(等级、加粗、斜体、居中)效果图
    • 1.2 python-docx字体(加粗、斜体、居中、大小颜色、高亮颜色)效果图
    • 1.3 python-docx 表格效果图
    • 1.4 itextpdf7表格效果图
  • 2. 安装
  • 3. 源代码
    • 3.1 python-docx文档标题段落源码
    • 3.2 python-docx字体(加粗、斜体、居中、大小颜色、高亮颜色)源码
    • 3.3 python-docx表格源码
    • 3.4 itextpdf 表格源码
  • 参考

写这篇博客源于博友的提问,将介绍如何使用python-docx操作word文档。python-docx不支持表格内文本水平居中,可以考虑使用itextpdf,生成pdf的表格然后在转回word。
itexpdf7支持的样式都比较灵活和多样。

1. 效果图

1.1 python-docx文档标题段落(等级、加粗、斜体、居中)效果图

标题、段落可加粗,斜体,居中:
段落各种python-docx提供的默认style如下图:

设置段前段后间距:

1.2 python-docx字体(加粗、斜体、居中、大小颜色、高亮颜色)效果图

字体加粗、斜体、颜色、高亮颜色(增加背景颜色):

1.3 python-docx 表格效果图

先使用5 * 5表格,然后在行中分别对某些cell在添加一个小的1*2的table实现

直接用5*9表格,标头部分列cell进行合并,效果图如下:

python-docx不够灵活,没法居中等;但自带了比较多的样式:
Light Shading如下:

Light List样式如下:
Light Grid如下:
Medium Shading如下:

Medium List如下:

Dark List效果图如下:

Colorful Shading效果图如下:

1.4 itextpdf7表格效果图

2. 安装

前提依赖:

  • Python 2.6, 2.7, 3.3, or 3.4
  • lxml >= 2.3.2

pip安装python-docx:

pip install python-docx

3. 源代码

3.1 python-docx文档标题段落源码

# python操作doxc demo类from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.text.parfmt import ParagraphFormat
from docx.shared import Ptdocument = Document()for i in range(10):document.add_heading('Heading, level ' + str(i), level=i)p = document.add_paragraph('A plain paragraph having some ')
# 加粗
p.add_run('bold').bold = True
p.add_run(' and some ')
# 斜体
p.add_run('italic.').italic = True
print(p.style.font.size)
# 居中
p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTERdocument.add_paragraph('Intense quote', style='Intense Quote')document.add_paragraph('first item in unordered list', style='List Bullet'
)
document.add_paragraph('first item in ordered list', style='List Number'
)# 获取文档自带的所有styles
styles = document.styles
for i, j in enumerate(styles):if (not '_ParagraphStyle' in str(j)):  # 获取所有段落的样式,选择合适的作为自己需要的stylecontinueprint(i, str(j))p1 = document.add_paragraph(str(i) + '  ' + str(j) + ' 居中字体', style=j)# 居中p1.alignment = WD_PARAGRAPH_ALIGNMENT.CENTERp3 = document.add_paragraph(str(i) + '  ' + str(j) + ' -----', style=j)# 居中p3.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER# paragraph_format = document.styles['Normal'].paragraph_formatprint('before: ',p3.paragraph_format.space_before,p3.paragraph_format.space_after)# 设置段前段后的间距p3.paragraph_format.space_before = Pt(12)p3.paragraph_format.space_after = Pt(12)print('after: ',p3.paragraph_format.space_before,p3.paragraph_format.space_before)p2 = document.add_paragraph(str(i) + '  ' + str(j) + " 不居中~", style=j)document.save('images/docx_header_paragraph_.docx')

3.2 python-docx字体(加粗、斜体、居中、大小颜色、高亮颜色)源码

from docx import Document
from docx.shared import Inches
from docx.shared import RGBColor
from docx.enum.text import WD_COLOR_INDEX, WD_UNDERLINEdocument = Document()document.add_heading('Document Title', 0)p = document.add_paragraph('A plain paragraph having some ')
# 设置加粗
p.add_run(' bold ').bold = True
p.add_run(' and some ')# 设置字体
p.add_run(' font name ').font.name = 'Arial'# 设置字体颜色
p.add_run(' color\n ').font.color.rgb = RGBColor(0xff, 0x99, 0xcc)
p.add_run(' test colors\n ').font.color.rgb = RGBColor(255, 0, 0)
p.add_run(' test colors1\n ').font.color.rgb = RGBColor(0, 255, 0)
p.add_run(' test colors2\n ').font.color.rgb = RGBColor(0, 0, 255)
p.add_run(' test colors3\n ').font.color.rgb = RGBColor(255, 255, 0)
p.add_run(' test colors4\n ').font.color.rgb = RGBColor(0, 255, 255)
p.add_run(' test colors5\n ').font.color.rgb = RGBColor(255, 0, 255)# 设置字体高亮(背景底色)
# 可设置这些值AUTO = 'default'
# BLACK = 'black'
# BLUE = 'blue'
# BRIGHTGREEN = 'green'
# DARKBLUE = 'darkBlue'
# DARKRED = 'darkRed'
# DARKYELLOW = 'darkYellow'
# GRAY25 = 'lightGray'
# GRAY50 = 'darkGray'
# GREEN = 'darkGreen'
# PINK = 'magenta'
# RED = 'red'
# TEAL = 'darkCyan'
# TURQUOISE = 'cyan'
# VOILET = 'darkMagenta'
# WHITE = 'white'
# YELLOW = 'yellow'
p.add_run(' \ntest highlight_color\n ').font.highlight_color = WD_COLOR_INDEX.YELLOW
p.add_run(' \ntest highlight_color\n ').font.highlight_color = WD_COLOR_INDEX.PINK# 设置斜体
p.add_run(' italic. ').italic = Truedocument.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='Intense Quote')document.add_paragraph('first item in unordered list', style='List Bullet'
)
document.add_paragraph('first item in ordered list', style='List Number'
)document.save('images/demo.docx')

3.3 python-docx表格源码

# python操作doxc demo类from docx import Document
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.enum.text import WD_PARAGRAPH_ALIGNMENTdocument = Document()document.add_heading('Document Title', 0)p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True
print(p.style.font.size)
p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTERdocument.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='Intense Quote')document.add_paragraph('first item in unordered list', style='List Bullet'
)
document.add_paragraph('first item in ordered list', style='List Number'
)record_score = (('学习目标-1', '', '', '21', '12.59', '', '', '21', '12.59'),('学习目标-2', '', '', '16', '10.88', '14', '11.25', '30', '22.13'),('学习目标-3', '17', '14.11', '', '', '32', '21.95', '49', '36.66')
)# 获取文档自带的所有styles
styles = document.stylestable = document.add_table(rows=2, cols=5, style=styles['Table Grid'])
table.alignment = WD_TABLE_ALIGNMENT.CENTER
hdr_cells = table.rows[0].cells
hdr_cells[1].text = '2.1'
hdr_cells[2].text = '3.2'
hdr_cells[3].text = '7.4'
hdr_cells[4].text = '期末成绩'
hdr_cells = table.rows[1].cells
for i in range(5):if (i == 0):continuet1 = hdr_cells[i].add_table(0, 2)t1_cells = t1.add_row().cellst1_cells[0].text = '分值't1_cells[1].text = '平均分'
for xxmb, l1, l2, l3, l4, l5, l6, l7, l8 in record_score:row_cells = table.add_row().cellsl = [l1, l2, l3, l4, l5, l6, l7, l8]for i in range(5):if (i == 0):row_cells[i].text = xxmbcontinuet2 = row_cells[i].add_table(0, 2)t2_cells = t2.add_row().cellst2_cells[0].text = l[(i - 1) * 2]t2_cells[1].text = l[(i - 1) * 2 + 1]p = document.add_paragraph('\n\n\n\n')
table = document.add_table(rows=2, cols=9, style=styles['Table Grid'])
print(table.style.font.size)
# table.style.font.size = int(304800//3.8)
table.style.font.size = 80000
print(table.style.font.size)
table.alignment = WD_TABLE_ALIGNMENT.CENTER
hdr_cells = table.rows[0].cells
header = ['', '2.1', '3.2', '7.4', '期末成绩']
for i in range(5):if (i == 0):print(hdr_cells[i].width)continuetc = hdr_cells[i * 2 - 1].merge(hdr_cells[i * 2])tc.text = header[i]row_cells = table.rows[1].cells
for i in range(5):if (i == 0):continuerow_cells[i * 2 - 1].text = '分值'row_cells[i * 2].text = '平均分'for i, l in enumerate(record_score):row_cells = table.add_row().cellsfor j in range(9):row_cells[j].text = l[j]p = document.add_paragraph('\n\n\n\n')for ii, style in enumerate(styles):if (not '_TableStyle' in str(style)):continuep = document.add_paragraph('\n' + str(ii) + " " + str(style))table = document.add_table(rows=2, cols=9, style=style)table.alignment = WD_TABLE_ALIGNMENT.CENTERhdr_cells = table.rows[0].cellsheader = ['', '2.1', '3.2', '7.4', '期末成绩']for i in range(5):if (i == 0):continuetc = hdr_cells[i * 2 - 1].merge(hdr_cells[i * 2])tc.text = header[i]row_cells = table.rows[1].cellsfor i in range(5):if (i == 0):continuerow_cells[i * 2 - 1].text = '分值'row_cells[i * 2].text = '平均分'for i, l in enumerate(record_score):row_cells = table.add_row().cellsfor j in range(9):row_cells[j].text = l[j]document.save('images/demo_merge_2.docx')

3.4 itextpdf 表格源码

package com.itextpdf.samples.sandbox.tables;import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.properties.*;
import com.itextpdf.layout.renderer.CellRenderer;
import com.itextpdf.layout.renderer.DrawContext;
import com.itextpdf.layout.renderer.IRenderer;import java.io.File;
import java.util.ArrayList;
import java.util.List;public class SimpleTable10_ {public static final String DEST = "./target/sandbox/tables/simple_table10_.pdf";public static void main(String[] args) throws Exception {File file = new File(DEST);file.getParentFile().mkdirs();new SimpleTable10_().manipulatePdf(DEST);}protected void manipulatePdf(String dest) throws Exception {PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));Document doc = new Document(pdfDoc);Table table = new Table(UnitValue.createPercentArray(9)).useAllAvailableWidth();table.setHorizontalAlignment(HorizontalAlignment.CENTER);table.setVerticalAlignment(VerticalAlignment.MIDDLE);// 首行
//        table.addCell("").addCell(new Cell(1, 2).add(new Paragraph("2.1").setHorizontalAlignment(HorizontalAlignment.CENTER))
//                .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER));
//        table.addCell(new Cell(1, 2).add(new Paragraph("3.2")));
//        table.addCell(new Cell(1, 2).add(new Paragraph("7.4")));
//        table.addCell(new Cell(1, 2).add(new Paragraph("期末成绩dd")));String[] header = new String[]{"", "2.1", "3.2", "7.4", "期末成绩dd"};for (int i = 0; i < 5; i++) {if (i == 0) {table.addCell("");continue;}Cell cell0 = new Cell(1, 2);cell0.setHeight(20);cell0.setNextRenderer(new SimpleTable10_.PositionRenderer(cell0, 0.5f, 0.5f,header[i], TextAlignment.CENTER));table.addCell(cell0);}// 第2行
//        table.addCell("").addCell("分数grade").addCell("成绩score")
//                .addCell("分数grade").addCell("成绩score")
//                .addCell("分数grade").addCell("成绩score")
//                .addCell("分数grade").addCell("成绩score").setHorizontalAlignment(HorizontalAlignment.CENTER);for (int i = 0; i < 5; i++) {if (i == 0) {table.addCell("");continue;}Cell cell1 = new Cell();cell1.setHeight(20);cell1.setNextRenderer(new SimpleTable10_.PositionRenderer(cell1, 0.5f, 0.5f,"分数grade", TextAlignment.CENTER));table.addCell(cell1);Cell cell2 = new Cell();cell2.setHeight(20);cell2.setNextRenderer(new SimpleTable10_.PositionRenderer(cell2, 0.5f, 0.5f,"成绩score", TextAlignment.CENTER));table.addCell(cell2);}Cell sn = new Cell(3, 1).add(new Paragraph("学习目标-1\n学习目标-2\n学习目标-3"));
//        sn.setBackgroundColor(ColorConstants.YELLOW);table.addCell(sn);List<String> stringList = new ArrayList<>();stringList.add("\"\", \"\", \"21\", \"12.59\", \"\", \"\", \"21\", \"12.59\"," +"\"\", \"\", \"16\", \"10.88\", \"14\", \"11.25\", \"20\", \"22.13\"," +"\"17\", \"14.11\", \"\", \"\", \"32\", \"21.95\", \"49\", \"36.66\"");String[] scores = stringList.get(0).split(",");for (int i = 0; i < 24; i++) {Cell cell7 = new Cell();cell7.setHeight(20);cell7.setNextRenderer(new SimpleTable10_.PositionRenderer(cell7, 0.5f, 0.5f,scores[i].replaceAll("\"", ""), TextAlignment.CENTER));table.addCell(cell7);
//            table.addCell(scores[i].replaceAll("\"", "")).setHorizontalAlignment(HorizontalAlignment.CENTER);}doc.add(table);doc.close();}private static class PositionRenderer extends CellRenderer {private String content;private TextAlignment alignment;private float wPct;private float hPct;public PositionRenderer(Cell modelElement, float wPct, float hPct,String content, TextAlignment alignment) {super(modelElement);this.content = content;this.alignment = alignment;this.wPct = wPct;this.hPct = hPct;}// If a renderer overflows on the next area, iText uses #getNextRenderer() method to create a new renderer for the overflow part.// If #getNextRenderer() isn't overridden, the default method will be used and thus the default rather than the custom// renderer will be created@Overridepublic IRenderer getNextRenderer() {return new SimpleTable10_.PositionRenderer((Cell) modelElement, wPct, hPct, content, alignment);}@Overridepublic void draw(DrawContext drawContext) {super.draw(drawContext);
//            drawContext.getCanvas().addXObjectFittedIntoRectangle(img.getXObject(), getOccupiedAreaBBox());drawContext.getCanvas().stroke();UnitValue fontSizeUV = getPropertyAsUnitValue(Property.FONT_SIZE);float x = getOccupiedAreaBBox().getX() + wPct * getOccupiedAreaBBox().getWidth();float y = getOccupiedAreaBBox().getY() + hPct * (getOccupiedAreaBBox().getHeight()- (fontSizeUV.isPointValue() ? fontSizeUV.getValue() : 12f) * 1.5f);new Canvas(drawContext.getDocument().getFirstPage(), drawContext.getDocument().getDefaultPageSize()).showTextAligned(content, x, y, alignment);}}
}

参考

  • https://python-docx.readthedocs.io/en/latest/
  • https://github.com/seminar2012/python-docx

python操作word文档(python-docx)相关推荐

  1. python操作word文档-python操作word

    1.Python写word文档 要操作word文档首先需要安装python-docx库: pip install python-docx 然后导入docx模块,或者从docx模块中导入Document ...

  2. Python 操作Word文档插入图片和表格实例演示

    Python 操作Word文档插入图片和表格实例演示 效果图 实现过程 ① python-docx 库安装 ② word 文档插入图片演示 ③ word 文档插入表格演示 [ 文章推荐 ] Pytho ...

  3. python操作word文档中的图片_Python操作word文档插入图片和表格的实例演示

    前言P6Q免费资源网 图片是Word的一种特殊内容,这篇文章主要介绍了关于Python操作word文档,向里面插入图片和表格的相关内容,下面话不多说了,来一起看看详细的代码P6Q免费资源网 实例代码: ...

  4. 利用python操作word文档

    总目录:Python数据分析整理 本文代码参考自官方文档: python-docx 使用的库下载方式为:pip install python-docx 注意!! 不是:pip install docx ...

  5. php怎么在表格里插图片,Python操作word文档插入图片和表格的实例演示

    今天带来Python操作word文档插入图片和表格的实例演示教程详解 前言 图片是Word的一种特殊内容,这篇文章主要介绍了关于Python操作word文档,向里面插入图片和表格的相关内容,下面话不多 ...

  6. Python 操作Word文档(一)--- 基本读写

    Python 操作Word文档(一)- 基本读写 安装python-docx库 命令安装 pip install python-docx IDE中安装,我使用的是PyCharm,如下 python-d ...

  7. Java操作word文档将docx转换为pdf格式

    Java操作word文档将docx转换为pdf格式 一.整体说明 在上传 Office 课件时,格式有:doc,docx,xls,xlsx,ppt,pptx,程序需要将其 转换成 pdf 格式, 才能 ...

  8. C# DocX操作Word文档(.docx)

    using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...

  9. 一篇就够,python 操作 word 文档,使用 python-docx 落地实现,写入篇

    本篇博客为大家带来 Python 操作 docx 文档相关知识点. 主要涉及的内容为 python-docx ,一款可以操作 Word 文档(仅支持 docx)的第三方库. 文章目录 写在前面 创建一 ...

最新文章

  1. 机器人售卖雪糕机_智能售货机售货机,冰淇淋厂
  2. 网页开发需要先学java吗_先学java还是javascript?
  3. PostgreSQL在何处处理 sql查询之四十七
  4. python的多线程threading
  5. [Cinder] 存储 Qos
  6. 抖音只能上下滑动吗_抖音:如何靠评论,轻松涨粉十万
  7. sqlplus / as sysdba 提示权限不足(ORA-01031)问题处理
  8. 来自Curriki和SankoréWiki的免费教育资源
  9. socket结构和几个IP地址转换函数
  10. 利用Gulp实现JSDoc 3的文档编写过程中的实时解析和效果预览
  11. java连接远程带有密码的mongodb数据库
  12. 随手记_英语_学术写作_常用句型35个
  13. 2021-06-27面向对象继承
  14. 如何在H264数据中获取PTS?
  15. access 更新整列数据_创建和运行更新查询
  16. LBP原理介绍以及算法实现
  17. ftp扫描工具,ftp扫描工具如何使用?ftp工具很多用户选iis7服务器管理工具
  18. Blender:如何翻转UV
  19. 【读书笔记】《杜月笙全传》读书笔记
  20. 朋友圈转发集赞截图生成工具,以假乱真!

热门文章

  1. 前后端分离nginx配置,同时解决跨域问题
  2. python 保存内容到记事本里面
  3. java代码 将字符串快速生成到string.xml中
  4. 统计文本中出现的单词个数频率
  5. FLINK源代码调试方式
  6. 搞事情 -- python之线程
  7. MySQL 5.6中如何定位DDL被阻塞的问题
  8. 图论之tarjan缩点
  9. poj1226 Substrings
  10. BitMap 内存使用优化