【插件】前端生成word 文件

文章目录

    • 1、背景
    • 2、方式一:html-docx-js
      • 2.1 具体代码
      • 2.2 前端生成word文件的样式
      • 2.3 总结
    • 3、方式二:pizzip + docxtemplater
      • 3.1 具体代码
      • 3.2 前端生成word文件的样式
      • 3.3 总结
    • 4、参考链接

1、背景

在实际开发中,业务需要,需要把数据进行组合生成一个 word 文件

2、方式一:html-docx-js

在这里插入图片描述

注意,这个插件 最近的更新日期 八年之前了

2.1 具体代码

核心逻辑

  1. 画出 Word 文件内容样子
  2. 把 word文件内容样子的DOM 。传入 html-docx-jsasBlob 方法
  3. 处理 blob 格式的数据,配合 a 标签,直接在界面弹出文件

在这里插入图片描述

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>HTML to Word</title><script src="https://cdn.jsdelivr.net/npm/html-docx-js@0.3.1/dist/html-docx.min.js"></script><style>.abc {display: grid;grid-template-columns: repeat(3, 1fr);font-weight: bold;}.title {font-weight: bold;text-align: center;vertical-align: middle;}.textCenter {text-align: center;}tr,td {font-size: 12px;}* {margin: 0;padding: 0;}</style>
</head><body><div id="content"><div style="font-size: 48px; font-weight: bold; text-align: center">质量反馈单</div><div>反馈单单号: WLYD202412250049</div><table style="width: 100%;" border="1" cellspacing="0" cellpadding="0" class="textCenter"><tr><td class="title">质量问题主题</th><td colspan="3" class="textCenter">你还是是大家看会玩空间的哈授课计划的卡号夸奖哈首府卡迪夫好看就好的夸奖哈库文件很大看见你是法务会计贺卡就是饭卡文化按时付款计划啊空间未婚夫你还是是大家看玩空间的哈授课计划的卡号夸奖哈首府卡迪夫好看就好的夸奖哈库文件很大看见你是法务会计贺卡就是饭卡文化按时付款计划啊空间未婚夫你还是是大家看会玩空间的哈授课计划的卡号夸奖哈首府卡迪夫好看就好的夸奖哈库文件很大看见你是法务会计贺卡就是饭卡文化按时付款计划啊空间未婚夫</td></tr><tr><td style="width: 15%;" class="title">反馈日期</td><td style="width: 35%;">2024-11-23</td><td style="width: 15%;" class="title">质量问题等级</td><td style="width: 35%;">严重</td></tr><tr><td class="title">电站名称</td><td>北京市超级充电站</td><td class="title">电站运营时间</td><td>2024-11-23</td></tr><tr><td class="title">项目类型</td><td>头肩</td><td class="title">反馈公司</td><td>特来电新能源</td></tr><tr><td class="title">反馈人</td><td>呆呆狗</td><td class="title">反馈人电话</td><td>18856491536</td></tr><tr><td class="title">父级设备</td><td>箱变</td><td class="title">设备生产日期</td><td>2024-11-23</td></tr><tr><td class="title">子型号</td><td>子星号</td><td class="title">故障设备</td><td>故障设备</td></tr></table><!-- 现场问题描述 --><table style="width: 100%;margin-top: -2px;" border="1" cellspacing="0" cellpadding="0"><tr><td rowspan="2" style="width: 15%;" class="title">现场问题描述</td><td style="width: 85%;height: 100px;vertical-align:top">edddd</td></tr><tr style="height: 40px;"><td>填写人: 呆呆狗</td></tr></table><!-- 纠正 --><table style="width: 100%;margin-top: -2px;" border="1" cellspacing="0" cellpadding="0"><tr><td rowspan="7" style="width: 15%;text-align: center;" class="title">纠正</td><td colspan="2" style="width: 17%;text-align: center;" class="title">分类</td><td class="title" style="width: 10%;">数量</td><td class="title">措施</td><td class="title" style="width: 15%;">日期</td></tr><tr><td style="text-align: center;" colspan="2">现场故障设备</td><td class="textCenter">12345.00</td><td>3</td><td class="textCenter">2024-01-01</td></tr><tr><td rowspan="3" style="text-align: center;">在库</td><td style="text-align: center;">供应商在库</td><td class="textCenter">3</td><td>4</td><td class="textCenter">2024-01-01</td></tr><tr><td style="text-align: center;">XXX在库</td><td class="textCenter">3</td><td>4</td><td class="textCenter">2024-01-01</td></tr><tr><td style="text-align: center;">区域仓在库</td><td class="textCenter">3</td><td>4</td><td class="textCenter">2024-01-01</td></tr><tr><td style="text-align: center;" colspan="2">在市</td><td class="textCenter">2</td><td>3</td><td class="textCenter">2024-01-01</td></tr><tr><td style="text-align: center;" colspan="2">其他</td><td class="textCenter">2</td><td>3</td><td class="textCenter">2024-01-01</td></tr></table><!-- 具体原因分析 --><table style="width: 100%;margin-top: -2px;" border="1" cellspacing="0" cellpadding="0"><tr><td rowspan="3" style="width: 15%;" class="title">原因分析</td><td style="width: 10%;" class="title">发生原因</td><td>2</td></tr><tr><td style="width: 10%;" class="title">流出原因</td><td>2</td></tr><tr><td style="width: 10%;" class="title">其他</td><td>2</td></tr></table><!-- 纠正措施 --><table style="width: 100%;margin-top: -2px;" border="1" cellspacing="0" cellpadding="0"><tr><td rowspan="4" style="width: 15%;" class="title">纠正措施</td><td style="width: 10%;" class="title"></td><td class="title">措施</td><td style="width: 15%;" class="textCenter title">日期</td></tr><tr><td style="width: 10%;" class="title">发生</td><td>2</td><td style="width: 15%;" class="textCenter">2024-11-23</td></tr><tr><td style="width: 10%;" class="title">流出</td><td>2</td><td style="width: 15%;" class="textCenter">2024-11-23</td></tr><tr><td style="width: 10%;" class="title">举一反三</td><td>2</td><td style="width: 15%;" class="textCenter">2024-11-23</td></tr></table><!-- 标准化 --><table style="width: 100%;margin-top: -2px;" border="1" cellspacing="0" cellpadding="0"><tr><td rowspan="3" style="width: 15%;" class="title">标准化</td><td class="title">文件名称</td><td style="width: 10%;" class="title">文件类型</td><td style="width: 15%;" class="title">日期</td></tr><tr><td>流出</td><td style="width: 10%;" class="textCenter">新增</td><td style="width: 15%;" class="textCenter">2024-11-23</td></tr><tr><td>举一反三</td><td style="width: 10%;" class="textCenter">修改</td><td style="width: 15%;" class="textCenter">2024-11-23</td></tr></table><!-- 责任部门 和 责任部门领导审批 --><table style="width: 100%;margin-top: -2px;" border="1" cellspacing="0" cellpadding="0"><tr><td style="width: 15%;" class="title">责任部门</td><td class="textCenter">总裁办</td><td style="width: 10%;" class="title">负责人</td><td style="width: 15%;" class="textCenter">呆呆狗</td><td style="width: 10%;" class="title">日期</td><td style="width: 15%;" class="textCenter">2024-01-01</td></tr><tr><td style="width: 15%;" class="title">责任部门领导审批</td><td colspan="3" class="textCenter">总裁办</td><td style="width: 10%;" class="title">日期</td><td style="width: 15%;" class="textCenter">2024-01-01</td></tr></table><!-- 跟踪验证结果 --><table style="width: 100%;margin-top: -2px;" border="1" cellspacing="0" cellpadding="0"><tr><td rowspan="3" style="width: 15%;" class="title">跟踪验证确认</td><td style="width: 85%;height: 100px;vertical-align:top">缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结缺陷反酷点总结</td></tr><tr style="height: 40px;"><td>验证结果: 关闭 无效</td></tr><tr style="height: 40px;"><td>负责人: 呆呆狗 日期:2024-12-30 </td></tr><tr><td style="width: 15%;font-family: '宋体';font-size: 12pt;" class="title">备注</td><td style="font-family: '宋体';font-size: 12pt"></td></tr></table></div><button id="downloadButton">Download as Word</button><script>document.getElementById("downloadButton").onclick = function () {var content = document.getElementById("content").outerHTML;var fullHtml = `<!DOCTYPE html><html><head><meta charset="UTF-8"><style>* {margin: 0;padding: 0;}.title { font-weight: bold;text-align: center; vertical-align: middle;}tr,td {font-size: 14px;}.textCenter {text-align: center;}</style></head><body>${content}</body></html>`;var converted = htmlDocx.asBlob(fullHtml);var link = document.createElement("a");link.href = URL.createObjectURL(converted);link.download = "document.docx";link.click();};</script>
</body></html>

其实主要核心代码就是下面这几行

    var converted = htmlDocx.asBlob(fullHtml);var link = document.createElement("a");link.href = URL.createObjectURL(converted);link.download = "document.docx";link.click();

html-docx-jsasBlob 方法,传入前端的DOM ,然后,用 URL.createObjectURL 创建一个blob 格式的链接,配合 a标签 就可以了

2.2 前端生成word文件的样式

在这里插入图片描述
在这里插入图片描述

2.3 总结

优点

  1. 代码简单,上手速度快
  2. 不需要依赖于 后端,前端可以独自处理

缺点

  1. 支持的 html、css 比较简单,比如 flex、grid 不支持
  2. 这个库已经很久不维护
  3. 图片需要转成 base64 才能放进去
  4. word的 行高字体字号 支持性较差

如果对于 word 文件的样子要求不是很高,可以使用这个 方法,开发过程也相对比较简单

3、方式二:pizzip + docxtemplater

3.1 具体代码

在这里插入图片描述
核心思路

  1. 读取预先设置好的 word 文件
  2. 解析word ,解析成二进制
  3. 创建docxtemplater实例
  4. 填充word 里面的数据
  5. 渲染word
  6. 获取渲染后word的 blob 地址
  7. 下载 word

前提需要准备一个这样的word 文件 ,下面的代码是演示 插入循环 table,具体的文件在文章最顶部可以下载

这个word 里面的 语法可以参考这个链接 docxtemplater 语法演示

{Code} 在前端设置数据的时候,按照这个名字 和 要设置的值,组成 keyvalue 格式即可

在这里插入图片描述

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Docxtemplater Example</title><script src="https://cdn.jsdelivr.net/npm/pizzip@3.0.1/dist/pizzip.min.js"></script><script src="https://cdn.jsdelivr.net/npm/docxtemplater@3.29.0/build/docxtemplater.js"></script><script src="https://cdn.jsdelivr.net/npm/file-saver@2.0.5/dist/FileSaver.min.js"></script><scriptsrc="https://unpkg.com/docxtemplater-image-module-free@3.0.0/dist/docxtemplater-image-module-free.js"></script>
</head><body><h1>Generate Word Document</h1><button id="generate">Download Word</button><script>document.getElementById('generate').addEventListener('click', function () {// 1、读取word 文件fetch('./template.docx').then(response => response.arrayBuffer()).then(arrayBuffer => {console.log('第一步', arrayBuffer);// 2、解析wordconst zip = new PizZip(arrayBuffer);// 3、创建docxtemplater实例const doc = new window.docxtemplater(zip, {paragraphLoop: true,linebreaks: true,});// 4、设置数据doc.setData({Code: "ZLFX202412280001",name: "你好啊啊John Doe阿斯顿我是具体措施111你是你好啊啊John Doe阿斯顿我是具体措施111你是你好啊啊John Doe阿斯顿我是具体措施111你是你好啊啊John Doe阿斯顿我是具体措施111你是",arr: [{ name: "第一行", type: "新增", time: "2024-12-23" },{ name: "第二行", type: "修改", time: "2024-12-23" },{ name: "第三行", type: "新增", time: "2024-12-23" },{ name: "第四行", type: "新增", time: "2024-12-23" },{ name: "第五行", type: "新增", time: "2024-12-23" },{ name: "第六行", type: "新增", time: "2024-12-23" },{ name: "第七行", type: "删除", time: "2099-12-23" },],});try {// 5、渲染worddoc.render();} catch (error) {console.error('Error rendering the document:', error);return;}// 6、获取渲染后的wordconst output = doc.getZip().generate({ type: 'blob' });// 7、下载wordsaveAs(output, 'output.docx');}).catch(error => console.error('Error loading template:', error));});</script>
</body></html>

3.2 前端生成word文件的样式

生成后的文件样式如下。 图片插入这个地方 官方说是可以,其他的文章也有实现的,但这个地方我没实现。 据说是要用docxtemplater-image-module 这个库

在这里插入图片描述

3.3 总结

优点

  1. 样式可控制

缺点
2. 需要预先设置 word 文件的样式

4、参考链接

  • docxtemplater 语法官方文档
  • html-docx-js GitHub地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20820.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大道至简 少字全意 易经的方式看 缓存 mybatis缓存 rendis缓存场景 案例

目录 介绍 mybatis缓存 一级缓存 1.是什么 2.特点 3.场景 mybatis 二级缓存 1.是什么 2.特点 3.配置步骤 注意 一级缓存问题 二级缓存问题 扩展 1.MyBatis集成 Redis 2.直接使用Redis redis 缓存 一、String 字符串 二、Llst 列表 三、Hash 哈希 四、Set…

RocketMQ消息是如何储存的?

前言 之前有写过关于kafka的存储结构的文章。RocketMQ大部分是借鉴了Kafka的设计原理&#xff0c;但是副本集群机制和存储结构有些差异。看完本篇文章可以看看这篇。消息中间件之kafka RocketMQ 的消息存储机制是其高吞吐、高可用和高可靠性的关键。以下将介绍 RocketMQ 消息存…

10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统

作者&#xff1a;后端小肥肠 目录 1. 前言 为什么选择DeepSeek&#xff1f; 本文技术栈 2. 环境准备 2.1. 后端项目初始化 2.2. 前端项目初始化 3. 后端服务开发 3.1. 配置文件 3.2. 核心服务实现 4. 前端服务开发 4.1. 聊天组件ChatWindow.vue开发 5. 效果展示及源…

Coze扣子怎么使用更强大doubao1.5模型

最近&#xff0c;豆包刚刚发布了最新的doubao1.5系列模型&#xff0c;并且加量不加价。 在性能极大进步的情况下&#xff0c;价格还与之前一致。真是业界良心了。 在同样的价格下&#xff0c;肯定要使用性能更强大的模型嘛 于是我准备把所有的智能体和工作流切换到doubao1.5…

UEditorPlus v4.3.0 已知问题修复,表格自适应,全屏编辑优化

UEditor 是由百度开发的所见即所得的开源富文本编辑器&#xff0c;基于MIT开源协议&#xff0c;该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器&#xff0c;主要做了样式的定制&#xff0c;更…

【核心算法篇十四】《深度解密DeepSeek量子机器学习:VQE算法加速的黑科技与工程实践》

在经典计算机逼近物理极限的今天,量子计算正以指数级加速潜力颠覆传统计算范式。想象一下,一个需要超级计算机运算千年的化学分子模拟问题,用量子计算机可能只需几分钟——这就是DeepSeek团队在VQE(Variational Quantum Eigensolver)算法加速实践中创造的奇迹。根据,VQE作…

Hackthebox- Season7- Titanic 简记 [Easy]

简记 ip重定向到 http://titanic.htb,先添加hosts 收集子域名 wfuzz -c -u http://titanic.htb/ -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -H Host:FUZZ.titanic.htb --hl 9 ******************************************************** * Wfu…

【C语言】C语言 哈夫曼编码传输(源码+数据文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 C语言 哈夫曼编码传输&#xff08;源码数据文件&am…

撕碎QT面具(6):调节窗口大小后,控件被挤得重叠的解决方法

问题&#xff1a;控件重叠 分析原因&#xff1a;因为设置了最小大小&#xff0c;所以界面中的大小不会随窗口的变化而自动变化。 处理方案&#xff1a;修改mimumSize的宽度与高度为0&#xff0c;并设置sizePolicy为Expanding&#xff0c;让其自动伸缩。 结果展示&#xff08;自…

Leetcode - 周赛436

目录 一、3446. 按对角线进行矩阵排序二、3447. 将元素分配给有约束条件的组三、3448. 统计可以被最后一个数位整除的子字符串数目四、3449. 最大化游戏分数的最小值 一、3446. 按对角线进行矩阵排序 题目链接 本题可以暴力枚举&#xff0c;在确定了每一个对角线的第一个元素…

玩转SpringCloud Stream

背景及痛点 现如今消息中间件(MQ)在互联网项目中被广泛的应用&#xff0c;特别是大数据行业应用的特别的多&#xff0c;现在市面上也流行这多个消息中间件框架&#xff0c;比如ActiveMQ、RabbitMQ、RocketMQ、Kafka等&#xff0c;这些消息中间件各有各的优劣&#xff0c;但是想…

解决 Mac 只显示文件大小,不显示目录大小

前言 在使用 mac 的时候总是只显示文件的大小&#xff0c;不显示文件夹的大小&#xff0c;为了解决问题可以开启“计算文件夹”。 步骤 1.进入访达 2.工具栏点击“显示”选项&#xff0c;点击 “查看显示选项” 3.勾选 显示“资源库"文件夹 和 计算所有大小 或者点击…

STM32 定时器产生定周期方法

目录 背景 程序 第一步、使能PCLK1外设时钟​编辑 第二步、时基单元配置 第三步、配置NVIC&#xff08;设置定时中断优先级&#xff09;​编辑 第四步、使能溢出中断 第五步、使能定时器 第六步、填写中断处理函数&#xff08;ISR&#xff09; 背景 在单片机开发当中&…

【DeepSeek系列】04 DeepSeek-R1:带有冷启动的强化学习

文章目录 1、简介2、主要改进点3、两个重要观点4、四阶段后训练详细步骤4.1 冷启动4.2 推理导向的强化学习4.3 拒绝采样和有监督微调4.4 针对所有场景的强化学习 5、蒸馏与强化学习对比6、评估6.1 DeepSeek-R1 评估6.2 蒸馏模型评估 7、结论8、局限性与未来方向 1、简介 DeepS…

Compose常用UI组件

Compose常用UI组件 概述Modifier 修饰符常用Modifier修饰符作用域限定Modifier Modifier 实现原理Modifier.Element链的构建链的解析 常用基础组件文字组件图片组件按钮组件选择器对话框进度条 常用布局组件线性布局帧布局 列表组件 概述 Compose 预置了很多基础组件&#xff…

Ansys EMC Plus:HIRF 与飞机耦合演示

在本篇博文中&#xff0c;我们将深入探讨 EMC Plus 高强度辐射场 (HIRF) 与软件示例中提供的飞机演示的耦合。本概述将指导您完成整个工作流程&#xff0c;从设置问题空间到基本后处理&#xff0c;包括材料属性分配和创建探针。 概述 在本演示中&#xff0c;下图所示的预先简化…

DeepSeek + Mermaid编辑器——常规绘图

下面这张图出自&#xff1a;由清华大学出品的 《DeepSeek&#xff1a;从入门到精通》。 作为纯文本生成模型&#xff0c;DeepSeek虽不具备多媒体内容生成接口&#xff0c;但其开放式架构允许通过API接口与图像合成引擎、数据可视化工具等第三方系统进行协同工作&#xff0c;最终…

红蓝对抗之常见网络安全事件研判、了解网络安全设备、Webshell入侵检测

文章目录 ​​研判&#xff08;入侵检测&#xff09;​​ ​​设备​​ ​​经典网络​​​​云网络​​ ​​异常HTTP请求​​​​Webshell分析​​ ​​Webshell 的分类​​​​Webshell 的检测​​ ​​主机层面​​​​流量层面​​ ​​附录​​ ​​常见端口漏洞…

基于levmar(Levenberg-Marquardt 非线性最小二乘优化库)的椭圆拟合

1. 包含必要的头文件 #include <opencv2/core.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/highgui.hpp> #include <vector> #include <cmath>2. 定义生成椭圆点的函数 编写一个函数&#xff0c;接受椭圆的中心坐标、长轴半径、短…

Fastgpt学习(5)- FastGPT 私有化部署问题解决

1.☺ 问题描述&#xff1a; Windows系统&#xff0c;本地私有化部署&#xff0c;postgresql数据库镜像日志持续报错" data directory “/var/lib/postgresql/data” has invalid permissions "&#xff0c;“ DETAIL: Permissions should be urwx (0700) or urwx,gr…