前端将页面内容生成Word文件并下载
时间:2024年03月29日
/来源:网络
/编辑:佚名
本文章向大家介绍前端将页面内容生成Word文件并下载,主要包括前端将页面内容生成Word文件并下载使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
根据产品需求,需要将页面内容下载成可编辑的Word文件
1.插件依赖
// 注意:file-saver 依赖 Blob 对象
import { saveAs } from 'file-saver';
// htmlDocx 的作用就是将html字符串转成Blob对象
import htmlDocx from 'html-docx-js/dist/html-docx';
2.生成Word文件并下载至本地
/**
* 1.导出局部的html页面
* @param {} dom 局部的html页面
* @param {*} fileName 导出文件的名称
* @param {*} title
*/
export const exportDocx = (dom, fileName, config, { title = document.title, width } = {}) => {
if (!dom) return;
config = config || {};
let copyDom = document.createElement('span');
const titleDom = document.createElement('title');
titleDom.innerText = title;
copyDom.appendChild(titleDom);
const cloneDom = dom.cloneNode(true);
if (width) {
const domTables = cloneDom.getElementsByTagName('table');
if (domTables.length) {
for (const table of domTables) {
table.style.width = width + 'px';
}
}
}
copyDom.appendChild(cloneDom);
const htmlTemp = copyDom.innerHTML;
copyDom = null;
const iframeDom = document.createElement('iframe');
const attrObj = {
height: 0,
width: 0,
border: 0,
wmode: 'Opaque',
};
const styleObj = {
position: 'absolute',
top: '-999px',
left: '-999px',
};
Object.entries(attrObj).forEach(([key, value]) => {
iframeDom.setAttribute(key, value);
});
Object.entries(styleObj).forEach(([key, value]) => {
iframeDom.style[key] = value;
});
document.body.insertBefore(iframeDom, document.body.children[0]);
const iframeWin = iframeDom.contentWindow; // 1.获取iframe中的window
const iframeDocs = iframeWin.document; // 2.获取iframe中的document
iframeDocs.write(`<!doctype html>`);
iframeDocs.write(htmlTemp);
const htmlStyle = `
table{
table-layout: fixed;
}
td{
word-wrap: break-word;
}
`;
const htmlDocContent = `<!DOCTYPE html><html><head><meta charset="UTF-8"><style></style></head><body style="text-indent:30px">${iframeDocs.documentElement.innerHTML}</body></html>`;
var converted = htmlDocx.asBlob(htmlDocContent, config);
saveAs(converted, fileName + '.docx');
document.body.removeChild(iframeDom);
};
<div id="downloadWord">
<div>word 需要下载的内容</div>
<div>word 需要下载的内容</div>
<div>word 需要下载的内容</div>
</div>
<Button onClick={() => {
exportDocx(document.querySelector('#downloadWord'), 'docxName', {
margins: { left: 300, right: 300, top: 300, bottom: 150 },
});
}}
>下载</Button>
注:通过此方法下载的 Word文件 在不编辑Word和另存为新Word文件情况下,无法通过获取Word格式获取文件内容
根据产品需求,需要将页面内容下载成可编辑的Word文件
1.插件依赖
// 注意:file-saver 依赖 Blob 对象
import { saveAs } from 'file-saver';
// htmlDocx 的作用就是将html字符串转成Blob对象
import htmlDocx from 'html-docx-js/dist/html-docx';
2.生成Word文件并下载至本地
/**
* 1.导出局部的html页面
* @param {} dom 局部的html页面
* @param {*} fileName 导出文件的名称
* @param {*} title
*/
export const exportDocx = (dom, fileName, config, { title = document.title, width } = {}) => {
if (!dom) return;
config = config || {};
let copyDom = document.createElement('span');
const titleDom = document.createElement('title');
titleDom.innerText = title;
copyDom.appendChild(titleDom);
const cloneDom = dom.cloneNode(true);
if (width) {
const domTables = cloneDom.getElementsByTagName('table');
if (domTables.length) {
for (const table of domTables) {
table.style.width = width + 'px';
}
}
}
copyDom.appendChild(cloneDom);
const htmlTemp = copyDom.innerHTML;
copyDom = null;
const iframeDom = document.createElement('iframe');
const attrObj = {
height: 0,
width: 0,
border: 0,
wmode: 'Opaque',
};
const styleObj = {
position: 'absolute',
top: '-999px',
left: '-999px',
};
Object.entries(attrObj).forEach(([key, value]) => {
iframeDom.setAttribute(key, value);
});
Object.entries(styleObj).forEach(([key, value]) => {
iframeDom.style[key] = value;
});
document.body.insertBefore(iframeDom, document.body.children[0]);
const iframeWin = iframeDom.contentWindow; // 1.获取iframe中的window
const iframeDocs = iframeWin.document; // 2.获取iframe中的document
iframeDocs.write(`<!doctype html>`);
iframeDocs.write(htmlTemp);
const htmlStyle = `
table{
table-layout: fixed;
}
td{
word-wrap: break-word;
}
`;
const htmlDocContent = `<!DOCTYPE html><html><head><meta charset="UTF-8"><style></style></head><body style="text-indent:30px">${iframeDocs.documentElement.innerHTML}</body></html>`;
var converted = htmlDocx.asBlob(htmlDocContent, config);
saveAs(converted, fileName + '.docx');
document.body.removeChild(iframeDom);
};
<div id="downloadWord">
<div>word 需要下载的内容</div>
<div>word 需要下载的内容</div>
<div>word 需要下载的内容</div>
</div>
<Button onClick={() => {
exportDocx(document.querySelector('#downloadWord'), 'docxName', {
margins: { left: 300, right: 300, top: 300, bottom: 150 },
});
}}
>下载</Button>
注:通过此方法下载的 Word文件 在不编辑Word和另存为新Word文件情况下,无法通过获取Word格式获取文件内容
新闻资讯 更多
- 【建站知识】查询nginx日志状态码大于400的请求并打印整行04-03
- 【建站知识】Python中的logger和handler到底是个什么?04-03
- 【建站知识】python3拉勾网爬虫之(您操作太频繁,请稍后访问)04-03
- 【建站知识】xpath 获取meta里的keywords及description的方法04-03
- 【建站知识】python向上取整以50为界04-03
- 【建站知识】scrapy xpath遇见乱码解决04-03
- 【建站知识】scrapy爬取后中文乱码,解决word转为html 时cp1252编码问题04-03
- 【建站知识】scrapy采集—爬取中文乱码,gb2312转为utf-804-03