首页 > 其他分享 >vue+docxtemplater,填充word模板

vue+docxtemplater,填充word模板

时间:2023-06-01 10:56:51浏览次数:45  
标签:docx vue word 项目名称 let error docxtemplater 模板

安装依赖

yarn add docxtemplater
yarn add pizzip
yarn add jszip-utils
yarn add file-saver
// 模板解析插件(支持list循环直接使用$index,使用if判断语法)
yarn add angular-expressions
yarn add lodash

页面测试代码

<template>
<div>
<button @click="btnClick">docx</button>
</div>
</template>

<script>
import { exportDocx } from '@/utils/docx.js'
export default {
data() {
return {};
},
computed: {},

mounted() {},

methods: {
btnClick() {
exportDocx(
"/test.docx", // 将模板文件放入这个public静态文件夹中
{ // 生成模板对应的数据格式
value1: "小明同学",
value2: "小明同学",
value3: "小明同学",
value4: "小明同学",
value5: "2022-10-20",
list: [{
value6: "项目名称1",
value7: "项目名称",
value8: "项目名称",
value9: "项目名称",
value10: "项目名称",
value11: "项目名称",
value12: "项目名称",
value13: "项目名称",
value14: "项目名称",
value15: "项目名称",
},
{
value6: "项目名称2",
value7: "项目名称",
value8: "项目名称",
value9: "项目名称",
value10: "项目名称",
value11: "项目名称",
value12: "项目名称",
value13: "项目名称",
value14: "项目名称",
value15: "项目名称",
},
{
value6: "项目名称3",
value7: "项目名称",
value8: "项目名称",
value9: "项目名称",
value10: "项目名称",
value11: "项目名称",
value12: "项目名称",
value13: "项目名称",
value14: "项目名称",
value15: "项目名称",
},
],
},
"测试.docx"
);
},
},
};
</script>
<style scoped>
</style>

新建src→utils→docx.js

import Docxtemplater from 'docxtemplater'
import PizZip from 'pizzip'
import JSZipUtils from 'jszip-utils'
import {
saveAs
} from 'file-saver'

/**
4. 导出docx
5. @param { String } tempDocxPath 模板文件路径
6. @param { Object } data 文件中传入的数据
7. @param { String } fileName 导出文件名称
*/
export const exportDocx = (tempDocxPath, data, fileName) => {
var expressions = require("angular-expressions");
var assign = require("lodash/assign");
var last = require("lodash/last");
expressions.filters.lower = function(input) {
if (!input) return input;
return input.toLowerCase();
};

function angularParser(tag) {
tag = tag
.replace(/^\.$/, "this")
.replace(/(’|‘)/g, "'")
.replace(/(“|”)/g, '"');
const expr = expressions.compile(tag);
return {
get: function(scope, context) {
let obj = {};
const index = last(context.scopePathItem);
const scopeList = context.scopeList;
const num = context.num;
for (let i = 0, len = num + 1; i < len; i++) {
obj = assign(obj, scopeList[i]);
}
obj = assign(obj, {
$index: index
});
return expr(scope, obj);
},
};
}
// 读取并获得模板文件的二进制内容
JSZipUtils.getBinaryContent(tempDocxPath, (error, content) => {
// input.docx是模板。我们在导出的时候,会根据此模板来导出对应的数据
// 抛出异常
if (error) {
this.$message.error("导出word文档失败!");
throw error;
}
// 创建一个JSZip实例,内容为模板的内容
// let zip = new JSZip(content);
let zip = new PizZip(content);
// 创建并加载Docxtemplater实例对象
// let doc = new window.Docxtemplater().loadZip(zip);
let doc = new Docxtemplater()
.loadZip(zip)
.setOptions({
parser: angularParser
});
// 设置模板变量的值
doc.setData(data);
try {
// 用模板变量的值替换所有模板变量
doc.render();
} catch (error) {
// 抛出异常
let e = {
message: error.message,
name: error.name,
stack: error.stack,
properties: error.properties,
};
console.log(JSON.stringify({
error: e
}));
this.$message.error("导出word文档失败!");
throw error;
}

// 生成一个代表docxtemplater对象的zip文件(不是一个真实的文件,而是在内存中的表示)
let out = doc.getZip().generate({
type: "blob",
mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
});
// 将目标文件对象保存为目标类型的文件,并命名
saveAs(out, fileName);
});
}

word模板

生成word文件

 

注意:

    • 将模板文件放入这个public静态文件夹中;
    • vue项目导出word,需要用到docxtemplate工具,但是但凡需要循环在创建模板时候以
      {#数组开始} {值} {/数组结束}
    • 生成word后就可以根据自己需求,对文件进行处理;保存、预览或者转换pdf预览等等;

 

标签:docx,vue,word,项目名称,let,error,docxtemplater,模板
From: https://www.cnblogs.com/wangyb56/p/17448294.html

相关文章

  • vuex加入后启动项目出现WARNING
    出现问题:importVuexfrom‘vuex’;Vue.use(Vuex);安装导入vuex后,在终端执行npmrunserve后出现WARNING,网页中vue无法启动WARNINGCompiledwith3warnings10:33:05warningin../node_module......
  • vue开场动画2
    <!--加载中动画--><style>.app-loading-box{position:fixed;display:flex;justify-content:space-around;align-items:center;width:100vw;height:100vh;top:0;}......
  • vue出现样式问题,竖线样式为正常展示
    预期样式效果: 但是有时候是这样的: 有时候又是好的,奇奇怪怪得bug,经过查看debugger,发现是代码逻辑出现了问题。 本来finally里面得东西是放在请求外面的,请求时异步得,先执行了下面finally里面的逻辑,导致后执行得请求返回来的函数,接收不到变量的变化就gg了,刚开始这里用的还......
  • vue基础用法-初步使用vue
    1.基本使用步骤导入vue.js的script脚本文件在页面中声明一个将要被vue所控制的DOM区域创建vm实例对象(vue实例对象)<!DOCTYPEhtml><htmllange="en"> <head> <metacharset="utf-8"> <title></title> </head> <body> <!--希望......
  • Font-AweSome在Vue中的使用
    Font-AweSome在Vue中的使用yarnaddfont-awesome或者npmifont-awesome-S在main.js中引入import'font-awesome/css/font-awesome.min.css'Vue中使用<iclass="fafa-camera-retro"></i> ......
  • Vue2实现双向数据绑定原理
    Vue2.x采用数据劫持结合发布订阅模式(PubSub模式)的方式,通过Object.defineProperty来劫持各个属性的setter、getter,在数据变动时发布消息给订阅者,触发相应的监听回调。当把一个普通Javascript对象传给Vue实例来作为它的data选项时,Vue将遍历它的属性,用Object.defineProp......
  • VUE
    一、Vue程序初体验学习源:动力节点老杜课程1.1下载并安装vue.js第一步:打开Vue2官网,点击下图所示的“起步”:https://v2.cn.vuejs.org/第二步:继续点击下图所示的“安装”第三步:在“安装”页面向下滚动,直到看到下图所示位置:第五步:安装Vue:使用script标签引入vue.j......
  • vue-route路由meta对象参数说明
    /***路由meta对象参数说明*meta:{*title:菜单栏及tagsView栏、菜单搜索名称(国际化)*isLink:是否超链接菜单,开启外链条件,`1、isLink:true2、链接地址不为空`*isHide:是否隐藏此路由*activeMenu菜单高亮(详......
  • 在 nginx 服务器上发布vue项目 步骤与配置
    1.在vscode中使用yarnbuild:prod进行vue项目的发布2.进入发布文件3.下载nginx的windows版https://nginx.org/en/download.html4.将发布好的文件放入nginx解压后的html文件夹中5.修改nginx的配置文件打开nginx的配置文件配置完成使用命令打开nginx至此发布......
  • HTML 全屏水印 vue 全屏水印
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title>水印</title><style>#water-div{pointer-events:none;position:fixed;top:0;left:0;right:0;bottom:0;}.mask_div{pointer-......