• 【Js】导出 HTML 为 Word 文档


    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. <script src="https://cdn.jsdelivr.net/npm/html-docx-js/dist/html-docx.js">script>
    2. <script src="https://cdn.jsdelivr.net/npm/file-saver/dist/FileSaver.min.js">script>
    3. <script src="./js/html-docx.js">script>
    4. <script src="./js/FileSaver.min.js">script>

    2、创建一个导出方法,该方法接受 HTML 内容作为参数,并将其导出为 Word 文档。 

    1. const exportHtmlToDocx = (htmlContent, fileName = 'exported-document.docx') => {
    2. // 处理HTML元素里面的图片
    3. const regularImages = Array.from(htmlContent.querySelectorAll('img'));//提取图片
    4. const imagePromises = regularImages.map(imgElement => {
    5. const canvas = document.createElement('canvas');
    6. const ctx = canvas.getContext('2d');
    7. const imgObj = new Image();
    8. imgObj.crossOrigin = 'Anonymous'; // 如果图片需要跨域访问的,必写,不然会报错
    9. imgObj.src = imgElement.src;
    10. return new Promise((resolve, reject) => {
    11. imgObj.onload = () => {
    12. //canvas宽高:如果页面上img设置了style="width:50px;height:50px",已页面设置的为主,如果没有设置就是默认图片的大小
    13. canvas.width = imgElement.width || imgObj.width;// 想要的canvas固定宽度
    14. canvas.height = imgElement.height || imgObj.height;// 想要的canvas固定高度
    15. //在canvas里面绘制图片:图片的宽高需要按缩放比例进行绘制
    16. //计算缩放比例
    17. var ratio = Math.min(canvas.width / imgObj.width, canvas.height / imgObj.height);
    18. var scaledWidth = imgObj.width * ratio;
    19. var scaledHeight = imgObj.height * ratio;
    20. var offsetX = (canvas.width - scaledWidth) / 2;
    21. var offsetY = (canvas.height - scaledHeight) / 2;
    22. // 绘制缩小后的图片
    23. ctx.drawImage(imgObj, 0, 0, imgObj.width, imgObj.height, offsetX, offsetY, scaledWidth, scaledHeight);
    24. // 将缩小后的图片导出为PNG
    25. resolve(canvas.toDataURL('image/png'));
    26. };
    27. imgObj.onerror = reject;
    28. });
    29. });
    30. Promise.all(imagePromises).then(imgUrls => {
    31. imgUrls.forEach((imgUrl, i) => {
    32. regularImages[i].src = imgUrl;
    33. });
    34. // 构建包含 HTML 内容的完整 HTML 文档字符串
    35. const fullHtmlContent = `
    36. ${htmlContent.outerHTML}
    37. `;
    38. // 使用 html-docx-js 将 HTML 转换为 Word 文档的 Blob 对象
    39. const converted = htmlDocx.asBlob(fullHtmlContent);
    40. // 使用 file-saver 保存 Blob 对象为 Word 文档文件
    41. saveAs(converted, fileName);
    42. });
    43. };
    '
    运行

    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>

  • 相关阅读:
    web前端期末大作业 HTML+CSS+JavaScript仿京东
    JS判断字符串是否为json字符串,读取JSON数据 | js获取对象的方法 | 元素添加 class 属性
    一篇讲清楚String、StringBuffer和StringBuild
    时间复杂度课后习题
    028通过vuedraggable实现多级菜单并支持拖拽排序功能
    Maven 私服Nexus的搭建教程windows(搭配android maven插件使用)
    项目部署(手动版)
    分类预测 | MATLAB实现CNN-LSTM(卷积长短期记忆神经网络)多特征分类预测
    Qt之FTP实现-QFtp实例操作
    DBRichEdit关联ClientDataSet不能保存的Bug
  • 原文地址:https://blog.csdn.net/xiaoxiong_jiaxin/article/details/140394697