文件导出word导出// 这是word导出需要的插件import JSZipUtils from jszip-utilsimport { saveAs } from file-saverimport PizZip from pizzipimport Docxtemplater from docxtemplater// 这是在模板...
文件导出
word导出
// 这是word导出需要的插件
import JSZipUtils from 'jszip-utils'
import { saveAs } from 'file-saver'
import PizZip from 'pizzip'
import Docxtemplater from 'docxtemplater'
// 这是在模板中书写简单的JS代码的插件
import expressions from 'angular-expressions'
import merge from 'lodash/merge'
// 这里是官网写的应该是处理图片的代码,照着写就行,没动过
// dataURL 是转化成base64之后的字符串
base64DataURLToArrayBuffer(dataURL) {
const base64Regex = /^data:image\/(png|jpg|svg|svg\+xml);base64,/
if (!base64Regex.test(dataURL)) {
return false
}
const stringBase64 = dataURL.replace(base64Regex, '')
let binaryString
if (typeof window !== 'undefined') {
binaryString = window.atob(stringBase64)
} else {
binaryString = new Buffer(stringBase64, 'base64').toString('binary')
}
const len = binaryString.length
const bytes = new Uint8Array(len)
for (let i = 0; i < len; i++) {
bytes[i] = binaryString.charCodeAt(i)
}
return bytes.buffer
},
// 导出word函数
exportWordFile() {
this.getWordData() // wordData 函数,处理word模板需要的数据结构
const that = this
// 引入下载的模板
// const docxUrl = process.env.BASE_URL
// 这里要引入处理图片的插件,下载docxtemplater后,引入的就在其中了
// 将 test.docx 模板文件放在 public 文件夹下,用node全局变量引入,打包后也可生效
const ImageModule = require('docxtemplater-image-module-free')
JSZipUtils.getBinaryContent(`${process.env.BASE_URL}test.docx`, function(error, content) {
if (error) {
throw error
}
const opts = {}
opts.centered = true
opts.fileType = 'docx'
opts.getImage = (tag) => {
return that.base64DataURLToArrayBuffer(tag)
}
opts.getSize = () => {
return [600, 200]// 这里可更改输出的图片宽和高
}
// 下面这个函数就是处理在模板中简单的JS代码的,如果不需要,可以选择删除,在import 中最后的两行插件可以不用引入
const angularParser = function(tag) {
if (tag === '.') {
return {
get: function(s) { return s }
}
}
const expr = expressions.compile(
tag.replace(/(’|‘)/g, "'").replace(/(“|”)/g, '"')
)
return {
get: function(scope, context) {
let obj = {}
const scopeList = context.scopeList
const num = context.num
for (let i = 0, len = num + 1; i < len; i++) {
obj = merge(obj, scopeList[i])
}
return expr(scope, obj)
}
}
}
const zip = new PizZip(content)
const doc = new Docxtemplater()
doc.attachModule(new ImageModule(opts))
doc.setOptions({ parser: angularParser })
doc.loadZip(zip)
doc.setData({
...that.wordData // 我的最外层包裹一切要导出的数据名称
})
try {
doc.render()
} catch (error) {
const e = {
message: error.message,
name: error.name,
stack: error.stack,
properties: error.properties
}
console.log(JSON.stringify({
error: e
}))
throw error
}
const out = doc.getZip().generate({
type: 'blob',
mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
})
const downLoadFileName = that.monitorObj + '_' + that.downloadTime
saveAs(out, downLoadFileName) // 导出为word
})
}
word 模板介绍
// 一般数据格式
data: [
{
text: '111'
},
{
text: '222'
}
]
// word 模板中使用
//{#data}
//{text}
//{/data}
// 上述方法可以简单的循环data数组中的item
// 有一种情况就是根据勾选的选项,动态下载word
// 就需要用简单的JS代码在word 模板中控制,data 必须是数组
// {#data.length > 0}
// {text}
// {
沃梦达教程
本文标题为:Vue导出word+echarts,pdf
基础教程推荐
猜你喜欢
- JS滚动到顶部踩坑解决记录 2023-07-10
- HTML clearfix清除浮动讲解 2022-11-20
- cocos creator游戏实现loading加载页面,游戏启动加载动画 2022-10-29
- uniapp开发微信小程序自定义顶部导航栏功能实例 2022-10-21
- 关于Ajax跨域问题及解决方案详析 2023-02-23
- 使用ajax跨域调用springboot框架的api传输文件 2023-02-23
- Javascript Bootstrap的网格系统,导航栏和轮播详解 2023-08-11
- Ajax+smarty技术实现无刷新分页 2022-12-15
- 在实战中可能碰到的几种ajax请求方法详解 2023-02-01
- Ajax发送和接收请求 2022-12-15