页面转word的那些事

背景

有些时候需要将页面内容或者是页面的数据通过word进行下载,以方便客户进行二次编辑,而不是直接导出图片或者是pdf。

想在页面端点击下载成word,那必然需要服务端来进行读写文件,无论是你后端编辑好的内容流,还是前端自身根据数据进行渲染。而现代浏览器恰好也是支持的,我们下面就介绍几个方式。

实现方案

第一种,使用docxtemplater
常规使用,就是在你本地创建一个word模版,然后通过官方约定的数据格式要求,用数据进行填充。那如果,我是想内容模块能够互换位置,内容完全的定制化,那就不太好办了,也只能用于一些简单的场景。复杂的模块都是收费的~
在这里插入图片描述
第二种,则是虚拟构建一套html文本,然后通过插件html-word转化成word进行下载,这里就可以达成我们想要的效果,只要你会html+css+js基本上问题不大

可以通过htmlDocx插件转化为blob数据,通过额外的配置项可以配置word的页面边距,基本上就是可以的

import htmlDocx from './html-word';
import saveAs from 'file-saver';const content = myRef.current.innerHTML;const converted = htmlDocx.asBlob(content, {margins: { left: 1082, right: 1082 },});await saveAs(converted, datas.name);

注意事项:

  • 如果你的页面有echarts或者canvas类的,需要转化为图片,获取全局echarts dom节点,new一个image的dom节点,插在echarts同级dom(各大框架语法不同,下方为借鉴)
 var img = new Image(); //重头戏在这 图标的大小
chartRefs.map((ref) => {let chart = ref.getEchartsInstance();setTimeout(function () {// 防止渲染过程中,未渲染完成就绘制成图片var img = new Image();img.src = chart.getDataURL({type: 'png',backgroundColor: '#fff',});const option = chart.getOption();img.width = 660img.height = 400ref.ele.insertAdjacentElement('beforebegin', img);setnum++;if (setnum == chartRefs.length) {setnum = 0;callback?.();}}, 800);
});
  • css样式需要使用style内联样式,以防止获取dom节点转化word不生效;
  • 像素单位尽可能使用pt为单位,不要使用px,以防止office、wps显示不同的兼容问题;
  • 图片的宽高等属性需要使用 dom节点原生的width、height,否则不生效;
  • 最好不要使用第三方的UI框架,以防止不生效;
  • 首行锁进,不能使用文本的px进行计算,比如字体16px,text-indent: 32px,就是不可行的,应该使用2em;
  • 行距,默认情况下想设置比如1.5倍行距,只能使用百分比150%,而其他的设置lineHeight为1.5、1.5em,px都会被认为最小值xx磅

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

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

相关文章

BMP280芯片I2C驱动开发指南

这颗芯片不太容易焊接,不能长时间风枪吹,否则容易掉壳。 第一部分 硬件连接 电路很简单,没什么需要注意的。 第二部分 软件驱动 本来打算使用SPL06的,结果焊接掉壳了,更换成bmp280了。函数名没有变过来。。。 void …

2.网络编程-HTTP和HTTPS

目录 HTTP介绍 HTTP协议主要组成部分 GET 和 POST有什么区别 常见的 HTTP 状态码有哪些 http状态码100 HTTP1.1 和 HTTP1.0 的区别有哪些 HTTPS 和 HTTP 的区别是什么 HTTP2 和 HTTP1.1 的区别是什么 HTTP3 和 HTTP2 的区别是什么 HTTPS的请求过程 对称加密和非对称…

MySQL中数据库、表的操作

文章目录 一、管理数据库1.1、连接数据库1.2、创建库1.3、选择数据库1.4、修改数据库名称1.5、查看数据库信息1.6、删除库 二、定义数据表字段2.1、数据表字段的数据类型2.2、数据表字段属性2.3、约束讲解2.3.1、约束的定义1)为什么需要约束2)什么是约束…

Linux——线程互斥与互斥锁的使用

目录 前言 一、进程线程间的互斥相关背景概念 二、互斥量(互斥锁) 三、互斥锁的使用 1.互斥锁的初始化 2.加锁与解锁 3.锁的使用 4.锁的封装 四、线程饥饿 五、互斥锁的原理 六、死锁 前言 我们学习过线程概念与线程控制,知道了线…

Golang | Leetcode Golang题解之第15题三数之和

题目&#xff1a; 题解&#xff1a; func threeSum(nums []int) [][]int {n : len(nums)sort.Ints(nums)ans : make([][]int, 0)// 枚举 afor first : 0; first < n; first {// 需要和上一次枚举的数不相同if first > 0 && nums[first] nums[first - 1] {conti…

埋点测试 之 前端和后端

埋点其实就是在程序中的某个位置加一个标记&#xff0c;当用户触发到某个行为的时候&#xff0c;就采集一下数据&#xff0c;然后将数据上报到某个位置进行存储&#xff0c;埋点的最终目的是收集到相关的数据&#xff0c;用于给运营人员提供数据支撑等。 1. 小程序&#xff1a;…

英语新概念2-回译法-lesson2

这是一个星期天。我从来不在星期天早起&#xff0c;我又是一直赖床到午餐时间。上个星期填我起的非常晚。我看着窗外&#xff0c;外面是黑压压的&#xff0c;“鬼天气&#xff01;"我想。“又在下雨”&#xff0c;不一会儿&#xff0c;电话铃声响起&#xff0c;是我的姑妈…

每天学习一个Linux命令之curl

每天学习一个Linux命令之curl 在Linux系统中&#xff0c;有很多有用的命令可以帮助我们与网络进行交互。一个非常常用的命令是curl&#xff0c;它是一个功能强大的工具&#xff0c;可用于发送、接收和处理各种网络请求。本文将详细介绍在Linux下使用curl命令的各种选项及其用法…

基于GD32的简易数字示波器(3)- PCB设计

这期记录的是项目实战&#xff0c;做一个简易的数字示波器。 教程来源于嘉立创&#xff0c; 本期介绍PCB设计的大致流程。 下图为示波器的指标 具有选择交流耦合还是直流耦合功能、输入信号不衰减或衰减50倍 输入频率理论最大800KHz输入幅值&#xff08;不衰减&#xff09;…

【Python】文件操作和异常

Python基础 读文件操作写文件操作异常异常处理else 和 finally 模块安装第三方包 使用 open() 方法打开一个文件&#xff0c;返回一个文件对象。对应 close() 就是文件关闭。 完整格式&#xff1a;open(file, mode‘r’, buffering-1, encodingNone, errorsNone, newlineNone, …

阿里面试总结

ThreadLocal 线程变量存放在当前线程变量中&#xff0c;线程上下文中&#xff0c;set将变量添加到threadLocals变量中 Thread类中定义了两个ThreadLocalMap类型变量threadLocals、inheritableThreadLocals用来存储当前操作的ThreadLocal的引用及变量对象&#xff0c;把当前线程…

avro c++编译与使用

一、arvo介绍 Avro 是 Hadoop 中的一个子项目&#xff0c;也是一个数据序列化系统&#xff0c;其数据最终以二进制格式&#xff0c;采用行式存储的方式进行存储。 Avro提供了&#xff1a; 1)、丰富的数据结构。 2)、可压缩、快速的二进制数据格式。 3)、一个用来存储持久化数据…