1、引言
小屌丝:鱼哥,有一事相求?
小鱼:何事,说来听听!
小屌丝:BOSS让我把exce转成word,
小鱼:这还不简单,你直接修改文件后缀名不就行了。
小屌丝:你可以伤害我,但是不能侮辱我…
小鱼:额…好吧,就这一点要求吗?
小屌丝:不是的,excel中题目和答案,老板让我给区分来,整理成两个word文档
小鱼:呦呵… BOSS就是BOSS,要求都这么高大上
小屌丝:BOSS说了,下个月能不能涨薪,就看这次表现了…
小鱼:这… 不是事啊~ ~
小屌丝:接文件…
小鱼:…
为了信息安全,小鱼就把小屌丝的文件内容给替换一下。
这样能更直观的展示,也方便理解。
文档内容截图
2、excel转换成word
看到上面的截图,我们来想一下,一般的转换方式,无非就两种:
手动转换
自动转换
如果不借助于收费软件,手动转换的话,可能就会麻烦一点;
如果想省钱省时省力,代码转换会更直接。
有了这两个思路,我们就来看看到底怎么实现。
2.1 手动转换
这里手动转换的方法不唯一,小鱼这里就列举一种常用的方法:
先转换成PDF文件,再转换成Word,步骤如下:
步骤一、excel的另存为".pdf",
步骤二、将PDF文件,转存为.docx
由于小鱼的电脑没有pdf,所以就不演示另存为word了
但是pdf转换word有一个弊端,就是默认情况下,转换页数有限制,这也就是资本家割韭菜的原因。
2.2 自动转换
小屌丝:韭…菜…
小鱼:咋的,不让当韭菜,还不习惯了?
小屌丝:我从小到大被割这么多次,还差这一次!
小屌丝的女友是富婆,所以不在乎;
但是小鱼却不想当韭菜,所以,就用技术来武(解)装(放)自己。
2.2.1 docxtpl 介绍
我们来看一下官网的介绍:
This package uses 2 major packages :
python-docx for reading, writing and creating sub documents
jinja2 for managing tags inserted into the template docx
python-docx-template has been created because python-docx is powerful for creating documents but not for modifying them.
The idea is to begin to create an example of the document you want to generate with microsoft word, it can be as complex as you want : pictures, index tables, footer, header, variables, anything you can do with word. Then, as you are still editing the document with microsoft word, you insert jinja2-like tags directly in the document. You save the document as a .docx file (xml format) : it will be your .docx template file.
Now you can use python-docx-template to generate as many word documents you want from this .docx template and context variables you will associate.
Note : python-docx-template as been tested with MS Word 97, it may not work with other version.
我给大概翻译一下:
docxtpl 主要有两个软件包:
python-docx 用于读取、写入和创建子文档
jinja2 用于管理插入到模板 docx 中的标签
之所以创建 python-docx-template ,是因为 python-docx 在创建文档方面功能强大,但不能用于修改文档。
这个想法起源于想生成word文档,它可以是你想要的任何复杂的,如:图片、索引表、页脚、页眉、变量、和你想要做的任何事情。由于还在使用Word编辑文档,所以可以直接在Word中插入jinja2的标签。将文档另存为.docx文件(xml 格式):它将成为您的 .docx 模板文件。
小屌丝:鱼哥,我咋看的一脸懵x?
鱼哥:嗯,因为你不了解docxtpl。但是,跟着鱼哥的脚步,保你不在懵逼。
老规矩,先安装再使用:**
1、docxtpl安装
pip install docxtpl
安装完,就可以撸码了:
2、代码展示:
# -*- coding:utf-8 -*- # @Time : 2021-08-25 # @Author : carl_DJ from docxtpl import DocxTemplate ''' 步骤: 1、读取需要保存的模板, 2、读取原excel表数据的值并输出 3、按照模本保存数据 ''' doc = DocxTemplate("my_word_template.docx") context = { 'company_name' : "World company" } doc.render(context) doc.save("generated_doc.docx")
这段代码,很简单,也很直白。
步骤:
1、读取需要保存的模板,
2、读取原excel表数据的值并输出
3、按照模本保存数据
因为保存word,我们需要jinja2的模板,如下:
docx文档使用模本
{%p if display_paragraph %} Here is my paragraph {%p endif %}
温馨提示:
这里把 "p"去掉,也可以运行,但是为了代码正确性,还是按照文档来写。
关于jinja2更多的用法:下载并查阅官方文档, 点击下载文档。
2.2.2 代码实战
上面介绍了docxtpl的用法和jinja2的docx模板,
接下来,我们就要用3行代码,把excel转换成word。
步骤如下:
首先、我们得准备3个文档:
① excel原数据文档
② word文档模板
③ 转换后的word文档
这是一个空文档,但是文件名称必须得安排上,否则运行代码会报错。
其次、编写代码
# -*- coding:utf-8 -*- # @Time : 2021-08-25 # @Author : carl_DJ import pandas as pd from docxtpl import DocxTemplate #excel原文档数据,这里使用pandas,来读取excel原文件数据 df = pd.read_excel('个人喜好文档.xlsx') df.sort_values(["章","节"],inplace = True) #把excel原文档数据通过jinja2模板匹配后,保存到word文档 #这个文档保存的是问题集 tpl = DocxTemplate("个人喜好问题模板.docx") tpl.render({'ps':df[["章","节","标号","题目"]].values.tolist()}) tpl.save("个人喜好问题集.docx") #同样重复excel读jinja2模本与保存word的动作 #这个word保存的是答案集 tpl = DocxTemplate("个人喜好答案模板.docx") tpl.render({'ps':df[["章","节","标号","答案","来源","收集人"]].values.tolist()}) tpl.save("个人喜好答案集.docx")
运行后,我们看看word文档里面内容:
个人喜好问题集.docx
个人喜好答案集.docx
如果不了解Pandas,那么就去看小鱼的这篇博文:
《数据分析之Pandas从入门到放弃:代码+实战,9分钟带你推开Pandas大门!!!》
小屌丝:9分钟,你有计算过这个时间吗?难道不能是8分钟、10分钟?
小鱼:…那我是不是得改成:大概9分钟带你推开Pandas大门…
3、总结
写到这里,又要告一段落了,
今天就不扯太多了,毕竟…时间不早了。
我也得留一点时间给妹子,不然…
最后一句话,
时间总是很匆忙,但是脚本却从未迈出!
收工