docx-templates前端模板引擎生成word

前端生成word的方法还挺多的,在开始这项功能之前应该先选一份合适自己的框架,笔者最开始使用的就是docxtemplater框架,优点就是npm上面周下载量挺多的,看文档示例还有网友写的文章挺简单的上手很快,缺点就是商业化的框架要收费,如果你的word比较复杂有图片啥的,图片模板就是要收费的。后来发现了一个比较小众的 docx-templates(https://github.com/guigrpa/docx-templates),虽然小众但是能满足自己的需求就行。目前这个框架网上的资料除了github上的文档几乎没有任何资料,这里简单记录一下用法。有时间再来补充踩过的坑,这个坑主要都在图片合成那边。框架本身没啥问题。

要做的功能如下图是一个网页,点击下载生成一个一样的word,后端因为一些原因,现在生成word的功能放在了前端。这个功能其实不难,难的是在word中插入图片,一个是地图位置的图片,另一个是一个图片列表含有多张图片,除此之外你要合成一个蓝色的header头,这个图片后端返回的是一个图片地址。

 

这是vue项目
安装:
    cnpm i docx-templates -S
    // jszip-utils 用于获取模板文件 template.docx,讲道理浏览器是不允许未经用户允许读取本地数据和写入数据到本地,因为这违反了浏览器的安全策略,所以有这个库我也很意外,要不然这个功能用这个库可能搞不起来,除非让用户主动上传模板,github给出的也是用户主动上传模板。这个文件我放在public目录底下,具体template.docx 文件样式我截图放在最后
    cnpm i jszip-utils -S 



import JSZipUtils from 'jszip-utils';
/* 生成word */
const { createReport } = require('docx-templates');


// 点击下载按钮执行的word合成代码,这里只留了 creator 和 getMapPicture() 地图图片作为示例
JSZipUtils.getBinaryContent(
        './template.docx',
        async (error, template) => {
          // 抛出异常
          if (error) {
            throw error;
          }
          const report = await createReport({
            template,
            data: {
              //这个是你要放在 template.docx模板中的字段,这个变量后面会插入到template.docx模板中
              creator: 'zhangsan',
              
            },
            // 这个对象里面的函数会在合成模板之前被执行
            additionalJsContext: {
              // 返回的格式如下, res 是图片 base64 编码
              getMapPicture: async () => {
                const res = await this.getMapPicBase64(ticketInfo);
                return {
                  width: 6,
                  height: 6,
                  data: res,
                  extension: '.png'
                };
              },
        
            },
            // 这个属性定义了模板中变量的边界,例如template.docx中插入变量就可以使用{ creator }
            cmdDelimiter: ['{', '}']
          });
          this.saveDataToFile(
            report,
            '123.docx',//文件名称
            'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
          );
        }
      );
    }
// 下载按钮方法结束






/* 下载word文件 */
    async saveDataToFile(data, fileName, mimeType) {
      const blob = new Blob([data], { type: mimeType });
      const url = window.URL.createObjectURL(blob);
      this.downloadURL(url, fileName, mimeType);
      setTimeout(() => {
        window.URL.revokeObjectURL(url);
      }, 1000);
    },
    async downloadURL(data, fileName) {
      const a = document.createElement('a');
      a.href = data;
      a.download = fileName;
      document.body.appendChild(a);
      a.style = 'display: none';
      a.click();
      a.remove();
    },

template.docx 模板,这几乎是我模板原件了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Django是一个用于快速开发Web应用程序的Python Web框架。而python-docx-template是一个Python库,它可以使用Word文档作为模板,然后根据传入的数据批量生成Word文档。在Django中,我们可以利用python-docx-template库来实现批量生成Word文档的功能。 首先,我们需要在Django项目中安装python-docx-template库。可以使用pip命令来安装该库: ```bash pip install python-docx-template ``` 接下来,我们可以在Django项目中创建一个视图函数,用于接收数据并根据模板生成Word文档。在视图函数中,我们可以使用python-docx-template库提供的方法将数据填充到Word模板中,生成最终的Word文档。 例如,假设我们有一个Word文档模板`template.docx`,里面包含了一些需要填充数据的位置,我们可以在Django中这样写视图函数: ```python from docxtpl import DocxTemplate from django.http import HttpResponse def generate_word_document(request): # 从请求中获取数据 data = request.GET.get('data', '') # 读取Word模板 doc = DocxTemplate("template.docx") # 根据数据填充模板 context = {'data': data} doc.render(context) # 写入生成Word文档 doc.save("generated_document.docx") # 返回生成Word文档给用户 with open("generated_document.docx", 'rb') as f: response = HttpResponse(f.read(), content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document') response['Content-Disposition'] = 'attachment; filename=generated_document.docx' return response ``` 通过上述视图函数,我们可以在Django项目中实现批量生成Word文档的功能,用户可以通过传入数据来生成他们所需的Word文档。这样我们就可以方便地利用Python和Django来批量生成Word文档,提高生产效率。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值