当前位置:   article > 正文

Vue导出Word, JSON_vue项目导入word中的文字读取成json

vue项目导入word中的文字读取成json

第一步:引包

  1. npm install docxtemplater --save
  2. npm install pizzip jszip jszip-utils --save
  3. npm install file-saver --save
  4. npm install angular-expressions --save
  5. npm install docxtemplater-image-module-free --save

第二步

新建一个word.js
  1. import PizZip from 'pizzip'
  2. import docxtemplater from 'docxtemplater'
  3. import JSZipUtils from 'jszip-utils'
  4. import { saveAs } from 'file-saver'
  5. /**
  6. * 将base64格式的数据转为ArrayBuffer
  7. * @param {Object} dataURL base64格式的数据
  8. */
  9. function base64DataURLToArrayBuffer (dataURL) {
  10. const base64Regex = /^data:image\/(png|jpg|jpeg|svg|svg\+xml);base64,/
  11. if (!base64Regex.test(dataURL)) {
  12. return false
  13. }
  14. const stringBase64 = dataURL.replace(base64Regex, '')
  15. let binaryString
  16. if (typeof window !== 'undefined') {
  17. binaryString = window.atob(stringBase64)
  18. } else {
  19. binaryString = new Buffer(stringBase64, "base64").toString("binary");
  20. }
  21. const len = binaryString.length
  22. const bytes = new Uint8Array(len)
  23. for (let i = 0; i < len; i++) {
  24. const ascii = binaryString.charCodeAt(i)
  25. bytes[i] = ascii
  26. }
  27. return bytes.buffer
  28. }
  29. /**
  30. * @description 导出word, 导出图片需将图片转为base64
  31. * @param {String} tempDocxPath 模板文件路径
  32. * @param {Object} wordData 导出数据
  33. * @param {String} fileName 导出文件名
  34. * @param {Array} imgSize 自定义图片大小
  35. */
  36. export const exportWord = (tempDocxPath, wordData, fileName, imgSize = [150, 150]) => {
  37. var ImageModule = require('docxtemplater-image-module-free')
  38. const expressions = require('angular-expressions')
  39. JSZipUtils.getBinaryContent(tempDocxPath, function (error, content) { // 读取并获得模板文件的二进制内容
  40. if (error) {
  41. throw error
  42. }
  43. expressions.filters.size = function (input, width, height) {
  44. return {
  45. data: input,
  46. size: [width, height]
  47. }
  48. }
  49. let opts = {} // 图片处理
  50. opts.centered = false // 图像是否居中
  51. opts.getImage = (chartId) => {
  52. return base64DataURLToArrayBuffer(chartId) // 将base64的数据转为ArrayBuffer
  53. }
  54. opts.getSize = function () {
  55. return imgSize
  56. }
  57. const zip = new PizZip(content) // 创建一个PizZip实例,content为模板的内容
  58. const doc = new docxtemplater() // 创建一个docxtemplater实例对象
  59. doc.attachModule(new ImageModule(opts))
  60. doc.loadZip(zip)
  61. doc.setData(wordData)
  62. try {
  63. doc.render() // 用模板变量的值替换所有模板变量
  64. } catch (error) { // 抛出异常
  65. let e = {
  66. message: error.message,
  67. name: error.name,
  68. stack: error.stack,
  69. properties: error.properties
  70. }
  71. console.log(JSON.stringify({
  72. error: e
  73. }))
  74. throw error
  75. }
  76. let out = doc.getZip().generate({
  77. type: 'blob',
  78. mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
  79. })
  80. saveAs(out, fileName)
  81. })
  82. }

选中图片转base64
  1. let reader = new FileReader();
  2. reader.readAsDataURL(file.raw)
  3. reader.onload = function (e) {
  4. let img_base64 = e.target.result // 此处为base64数据
  5. }
docx模板

普通数据:{data}

图片数据:{%imgUrl}

遍历数据:{#list}{/list}

注意:创建模板的时候,要直接创建docx文件,创建了doc后面再改成docx导出会报错。

vue-cli3.0创建的项目,模板文件要放在public目录下

导出Word
  1. let imgSize = [200,200]
  2. let docxData = {}
  3. exportWord('template.docx', docxData, 'word.docx', imgSize)
导出 JSON
  1. import FileSaver from 'file-saver'
  2. let JSONData = {}
  3. const blob = new Blob([JSON.stringify(JSONData, null, 2)], { type: 'application/json' })
  4. FileSaver.saveAs(blob, 'JSONData.json')
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/705604
推荐阅读
相关标签
  

闽ICP备14008679号