【Js】导出 HTML 为 Word 文档

打印 上一主题 下一主题

主题 529|帖子 529|积分 1587

在 Web 开发中,有时我们盼望用户能够将网页上的 HTML 内容生存为 Word 文档,以便更方便地分享和打印。
html样式

word文档

工具预备

1、 html-docx-js - npm
html-docx-js是一个 JavaScript 库,用于将 HTML 内容转换为 Word 文档的格式。它提供了简单的 API,使得在浏览器情况中可以轻松地生成并导出 Word 文档 
2、 file-saver - npm
file-saver是一个 JavaScript 库,用于在浏览器中生存文件。它简化了通过 Blob 对象生存文件的过程,并提供了一个直观的 API。
代码实现

1、先引入这两个库:可以通过 npm 安装,也可以直接使用 CDN 引入,还可以下载到当地项目引用。
  1. <!-- 使用 npm 安装 -->
  2. <!-- npm install html-docx-js file-saver -->
  3. <!-- 或者直接使用 CDN 引入 -->
  4. <script src="https://cdn.jsdelivr.net/npm/html-docx-js/dist/html-docx.js"></script>
  5. <script src="https://cdn.jsdelivr.net/npm/file-saver/dist/FileSaver.min.js"></script>
  6. <!-- 或者访问上面CDN链接,保存到本地,放在项目里引用 -->
  7. <script src="./js/html-docx.js"></script>
  8. <script src="./js/FileSaver.min.js"></script>
复制代码
2、创建一个导出方法,该方法担当 HTML 内容作为参数,并将其导出为 Word 文档。 
  1. const exportHtmlToDocx = (htmlContent, fileName = 'exported-document.docx') => {
  2.   // convertImagesToBase64(htmlContent);
  3.   // 将HTML元素转换为字符串,并提取图片
  4.   const regularImages = Array.from(htmlContent.querySelectorAll('img'));
  5.   const imagePromises = regularImages.map(imgElement => {
  6.     const canvas = document.createElement('canvas');
  7.     const ctx = canvas.getContext('2d');
  8.     const imgObj = new Image();
  9.     imgObj.crossOrigin = 'Anonymous'; // 如果图片需要跨域访问
  10.     imgObj.src = imgElement.src;
  11.     return new Promise((resolve, reject) => {
  12.       imgObj.onload = () => {
  13.         //canvas 图片缩小到固定大小
  14.         //如果页面上img设置了style="width:50px;height:50px",已页面设置的为主,如果没有设置就是默认图片的大小
  15.         canvas.width = imgElement.width || imgObj.width;// 想要的canvas固定宽度
  16.         canvas.height = imgElement.height || imgObj.height;// 想要的canvas固定高度
  17.         //计算缩放比例
  18.         var ratio = Math.min(canvas.width / imgObj.width, canvas.height / imgObj.height);
  19.         var scaledWidth = imgObj.width * ratio;
  20.         var scaledHeight = imgObj.height * ratio;
  21.         var offsetX = (canvas.width - scaledWidth) / 2;
  22.         var offsetY = (canvas.height - scaledHeight) / 2;
  23.         // 绘制缩小后的图片
  24.         ctx.drawImage(imgObj, 0, 0, imgObj.width, imgObj.height, offsetX, offsetY, scaledWidth, scaledHeight);
  25.         // 将缩小后的图片导出为PNG
  26.         resolve(canvas.toDataURL('image/png'));
  27.       };
  28.       imgObj.onerror = reject;
  29.     });
  30.   });
  31.   Promise.all(imagePromises).then(dataUris => {
  32.     dataUris.forEach((dataUri, i) => {
  33.       regularImages[i].src = dataUri;
  34.     });
  35.     // 构建包含 HTML 内容的完整 HTML 文档字符串
  36.     const fullHtmlContent = `
  37.       <!DOCTYPE html>
  38.       <html>
  39.         <head>
  40.           <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  41.         </head>
  42.         <body>
  43.           ${htmlContent.outerHTML}
  44.         </body>
  45.       </html>
  46.     `;
  47.     // 使用 html-docx-js 将 HTML 转换为 Word 文档的 Blob 对象
  48.     const converted = htmlDocx.asBlob(fullHtmlContent);
  49.     // 使用 file-saver 保存 Blob 对象为 Word 文档文件
  50.     saveAs(converted, fileName);
  51.   });
  52. };
复制代码
3、在应用中调用上述导出方法,并传入想导出的 HTML 内容。
留意:html结构必要包罗style样式,引入css文件样式不见效的
  1. //html页面上
  2. <a class="fs-14 text-g" ng-click="vm.daochu()">导出</a>
  3. <div class="row" id="resumeAllInfo">
  4.   <div class="row" style="color:#205081;font-size:16px;border-bottom:1px solid #eee;margin-bottom: 15px;padding-bottom: 5px;">基本信息</div>
  5.   <div class="row" style="vertical-align: middle">
  6.     <span style="float: left;margin-right:20px">
  7.       <img style="width:50px;height:50px" ng-src="{{ vm.resume.portraitUrl }}" rw-default-img img-type="portrait" alt="头像">
  8.     </span>
  9.     <span>
  10.       <span style="font-size:16px;margin-right:20px">{{ vm.resume.name }}</span>
  11.       <span style="margin-right:10px">{{ vm.resume.phone }}</span>
  12.       <span ng-if="vm.resume.wechat" style="margin-right:10px">
  13.         <span style="margin-right:10px">|</span>{{ vm.resume.wechat }}</span>
  14.       <span ng-if="vm.resume.qq" style="margin-right:10px">
  15.         <span style="margin-right:10px">|</span>{{ vm.resume.qq }}</span>
  16.       <span ng-if="vm.resume.email" style="margin-right:10px">
  17.         <span style="margin-right:10px">|</span>{{ vm.resume.email }}</span>
  18.     </span>
  19.   </div>
  20. </div>
  21. <script>
  22.     ……
  23.     vm.daochu=daochu;
  24.     function daochu() {
  25.       // 获取要导出的HTML字符串
  26.       const htmlElement = document.getElementById('resumeAllInfo');
  27.       //调用导出方法
  28.       exportHtmlToDocx(htmlElement, 'my-exported-document.docx');
  29.     }  
  30. </script>   
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

没腿的鸟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表