工作中正好接到个小项目需要将Excel数据导出组成word表格并合并所有表格成一个word文档,这个流程涉及到Excel的解析、Word文档的数据插入,多个Word文档的合并,对Word文档插入图片等,在尝试构写脚本时发现百度谷歌的资料多有缺失或者干脆就是过时的方法,于是写下这篇文章将自己在构写这个脚本时遇到的坑写一下。

首先是解析Excel数据,Python的xlrd框架可以快速地帮助我们完成这一部分操作:

import xlrd

//获取Excel文档

workbook = xlrd.open_workbook(u'2019名单.xls')

//我们可以通过两种不同的方式获取Excel文档中对应的表单

sheet = workbook.sheets()[0]

sheet = getSheetByName("表单名字",workbook)

//通过xlrd的接口获得表单的行数及列数

nrow = sheet.nrows

ncol = sheet.ncols

for i in range(1,nrow):

//cells代表的是Excel表单的每一行,即一个单元格组

cells = sheet.row(i)

//得到单元格组我们便可执行下一步的插入Word文档操作了

insertCellsToWord(cells)

需要明白的是,最好不要在Python脚本中对Word文档的效果进行再定义,原因之一是因为脚本并不全能,如果在脚本中对文档效果进行再定义,代码会变得臃肿且难以维护,例如先通过脚本生成表单效果再对单元格进行修改效果等等,这些操作最好先自行创建Word文档进行定义,即,通过Python脚本获取预先定义好的Word文档进行插入数据的操作。

譬如,我们有如下一张Word文档。

我们需要填充的数据都在这个表单里,通过预先确定的唯一标示符(即图中的英文单词)将Excel中的数据插入到对应的单元格中。

//python-docx是Python较为常用的操控Word文档的工具框架

from docx import Document

def insertCellsToWord(cells):

//获取预先设置的模板

test = Document("XXXX模板.docx")

for t in test.tables:

for row in t.rows:

//遍历到单元格进行数据插入

for cell in row.cells:

try:

set_cell(cell,cells)

except Exception as e:

print(cells)

print(e)

test_number = str(cells[0].value)

//生成新模板

test.save(output_path + "普通/" + test_number + ".docx")

def set_cell(cell,cells):

//找到对应的单元格进行数据插入

if cell.text == "school":

cell.text = cells[13].value

需要注意的是,当你如此完成了插入数据的操作并预览输出的Word文档时,你会发现,输出的文档并没有按照你预先调制的展示效果展示,例如单元格中的文字居中,加粗,字体修改等等,通过python-docx的操作会丢失这部分数据,cell.text = cells[13].value的操作并不会继承效果,因此我们需要通过python-docx再次对单元格效果进行设置。

from docx.enum.text import WD_ALIGN_PARAGRAPH

from docx.shared import Pt

if cell.text == "school":

cell.text = cells[13].value

p = cell.paragraphs[0]

p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER

r = p.runs[0]

r.bold = True

f = r.font

f.size = Pt(12)

通过单元格的paragraphs属性及runs属性进行样式设置,在此,我设置了单元格居中,文字加粗以及字体大小设置为12,你可以在python-docx的官方文档找到更多可参考的样式属性。

接下来开始进行Word文档合并。

在合并之前需要说明的是,我们常常会遇到表单中需要插入图片的需求,比如每张表格都有一个一寸照之类的,但在我构写这个脚本的踩坑中发现,图片并不能在合并文档之前插入(也可能是我没找到正确的方式),当先插入图片再进行合并时,导出的合并文件必然是损坏的,而导出没有图片的纯文本合并文件却不会损坏,因此,我通过在第一次对单元格的文本设置中对标注插入图片的单元格替换唯一标示符(例如上图中的Icon变为Icon+“对应的人员编号”),然后在合并文件之后再次遍历单元格插入图片,理所应当的,这样会导致脚本的效率大大降低,如果有更好的方式希望不吝赐教。

normal_path = output_path + "普通/"

//获取本地所有待合并文档

files = os.listdir(normal_path)

files.sort()

normal_merge_docx = ""

for index, filename in enumerate(files):

if index == 0:

normal_merge_docx = Document(normal_path + filename)

continue

sub_doc = Document(normal_path + filename)

for el in sub_doc.element.body:

normal_merge_docx.element.body.append(el)

normal_merge_docx.save("normal_merge_docx.docx")

可能会有人问,为什么要获取第一个待合并文件对接下来的文档进行合并而不是新建一个Word文档,对所有的待合并文件进行合并呢?

原因在于,新建的Word文档并不包含一些高于表格的样式数据,如果使用新建文档对所有待合并文档合并,则预览输出文件会发现合并Word文档的样式错误,所以必须取一个待合并文档作为基类来合并其他文档,这样才保证不会样式丢失。

接着进行图片插入:

from docx.shared import Inches

//因为我需要插入的图片位置是确定的,所以我直接设置入参去取对应的单元格插入图片,增加效率。

def insertImage(filename,row,col):

output = Document(filename)

for t in output.tables:

cell = t.cell(row,col)

if "-" in cell.text:

print(cell.text)

arr = cell.text.split("-")

cell.text = ""

p = cell.paragraphs[0]

r = p.runs[0]

pathstr = ""

//getImage通过具体的标识符去取本地图片,若本地图片有问题则通过dealImg对图片处理再行插入

try:

pathstr = getImg(arr[0], arr[1])

except Exception as e:

print(e)

pathstr = dealImg(getImg(arr[0], arr[1]), arr[1])

r.add_picture(pathstr, width=Inches(0.84), height=Inches(1.2))

p.alignment = WD_ALIGN_PARAGRAPH.CENTER

需要注意的是,python-docx的文档告诉我们,插入图片的方法在单元格的paragraphs数组属性的runs数组属性中,只有找到具体的run属性才能add_picture。

这里有一个问题,虽然在上述代码中我们将对应单元格的标记文本(Icon-XXXXXXX)置为空,但对应的样式属性依然存在,如果通过cell的add_paragraph增加paragraph再通过add_run增加run的样式属性,则会发现输出文档的图像上多出一行,这是因为这个单元格的paragraphs数组变大了,即有两组样式属性对应不同文本,而在python-docx中又无法在不销毁单元格的情况下对单元格内的文本及样式属性进行快速清空,因此,就需要在原来的标记文本置为空的情况下获取对应的样式属性进行插入图片。

最后输出文件:

output.save(filename)

整个流程便结束了。

python合并word表格单元格_Python-Excel转word表格并合并流程相关推荐

  1. html表格单元格换行属性,CSS对表格单元格强制换行和不换行

    CSS对表格单元格强制换行和不换行 互联网   发布时间:2008-10-17 19:28:28   作者:佚名   我要评论 CSS控制Table单元格强制换行与强制不换行 我们知道Div的换行和不 ...

  2. python合并word表格单元格_Python实战009:读取Word文档中的表格数据及表格合并问题解决...

    同事最近被安排整理资料,主要工作室将文档中的表格数据提取出来并整理层Excel表格供我们FII刀具商城进行资料维护.由于刀具的种类繁多且规格无数,所以要处理的数据量相当的庞大.人工核对整理既费时又费力 ...

  3. python合并word表格单元格_python docx模块读取word表格遇到合并单元格时的处理

    python docx模块读取word表格遇到合并单元格时的处理 python docx模块读取word表格遇到合并单元格时的处理 python docx模块读取word表 遇到合并单元格时的处理 通 ...

  4. python xlsxwriter合并单元格_Python使用xlsxwriter导出表格并合并单元格

    之前使用csv导出表格,但是好像不支持合并单元格.后来发现了这个,试了一下. import xlsxwriter f = xlsxwriter.Workbook('9.xlsx') # 创建excel ...

  5. python csv合并单元格_Python使用xlsxwriter导出表格并合并单元格

    之前使用csv导出表格,但是好像不支持合并单元格.后来发现了这个,试了一下. import xlsxwriter f = xlsxwriter.Workbook('9.xlsx') # 创建excel ...

  6. python 拆分excel单元格_Python Excel 单元格 拆分并填充内容,功能和的wps类似

    一.实现的功能: 二.效果 1.拆分并填充前 2.拆分并填充后 三.代码 import openpyxl from copy import deepcopy # 原文:https://www.cnbl ...

  7. poi设置word表格单元格宽度_poi导出word表格的操作讲解

    一.效果如下 二.js代码 function export_word(){ //导出word var url = "czzsca/exportWord.do"; this.expo ...

  8. css表格单元格大小,CSS怎样控制表格单元格的宽高?

    单元格的宽度和高度,有着和其他标签不同的特性,主要表现在单元格之间的互相影响上.使用CSS中的width和height属性可以控制单元格的宽高.示例代码如下: table{ border:1px so ...

  9. 获取layui表格单元格的数据_Layui数据表格之获取表格中所有的数据方法

    数据表格中的数据是通过直接赋值的方式.这里实际上思想是反过来的,将拿数据表格中的所有数据,转换为Layui数据表格拿原始数据去渲染数据表格. 1.创建一个作用域合适的JS对象数组用来保存数据表格中的原 ...

  10. HTML5合并单元格居中,excel表格合并后居中的方法步骤

    Excel中具体该如何合并后进行合并呢?接下来是学习啦小编为大家带来的excel表格合并后居中的方法,供大家参考. excel表格合并后居中的方法 合并居中步骤1:在"开始"功能区 ...

最新文章

  1. Javascript(JS)中的大括号{}和中括号[]详解
  2. 查看oracle中path,查看oracle进程启动时的环境变量
  3. Linux Shell脚本编程--jq命令
  4. Linux开机启动流程详细步骤是什么?
  5. (转)C++的tie()函数
  6. java之beanutils技术
  7. Java多线程系列--【JUC集合07】- ArrayBlockingQueue
  8. Python监控股价并通过微信提醒
  9. 操作系统OS作业整合
  10. .gitignore文件作用
  11. 实验七:定时/计数器8253、8254
  12. ubuntu设置开机启动程序
  13. Tomcat课堂笔记
  14. python语言-实现半自动爬虫爬取小说《遮天》评论
  15. 经典机器学习算法:高斯判别分析GDA
  16. 【历史上的今天】8 月 30 日:首台通用电子计算机的发明者诞生;谷歌推出第一个涂鸦
  17. 东南亚(Lazada shoppe)自养号测评如何解决收货地址及ip问题详解
  18. C语言编程游戏-教程1 Star Empires
  19. lorawan在嵌入式系统中的实现--节点端(一)--SX1278介绍
  20. rdo远程计算机需要,Remote Desktop Organizer

热门文章

  1. QTextEdit设计的几个知识点
  2. kotlin发音!这份字节跳动历年校招Android面试真题解析,附架构师必备技术详解
  3. unhandled exception in XXX:0xC0000005:access violation问题
  4. win10 android软件下载,windows10模拟器安卓版
  5. 今日头条广告如何优化?这四个思路至关重要
  6. ${}和`${}`的用法
  7. Javascript深入浅出之闭包
  8. 开关面板如何自己印字_墙壁开关上的商标是怎么印上去的
  9. 个人计算机使用的标准键盘,电脑键盘的基本操作规范 -电脑资料
  10. Google Chrome误删书签的恢复方式!