【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 引入,还可以下载到本地项目引用。

<!-- 使用 npm 安装 -->
<!-- npm install html-docx-js file-saver -->
 

<!-- 或者直接使用 CDN 引入 -->
<script src="https://cdn.jsdelivr.net/npm/html-docx-js/dist/html-docx.js"></script>
<script src="https://cdn.jsdelivr.net/npm/file-saver/dist/FileSaver.min.js"></script>


<!-- 或者访问上面CDN链接,保存到本地,放在项目里引用 -->
<script src="./js/html-docx.js"></script>
<script src="./js/FileSaver.min.js"></script>

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

const exportHtmlToDocx = (htmlContent, fileName = 'exported-document.docx') => {
  // 处理HTML元素里面的图片
  const regularImages = Array.from(htmlContent.querySelectorAll('img'));//提取图片
  const imagePromises = regularImages.map(imgElement => {
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
    const imgObj = new Image();

    imgObj.crossOrigin = 'Anonymous'; // 如果图片需要跨域访问的,必写,不然会报错
    imgObj.src = imgElement.src;

    return new Promise((resolve, reject) => {
      imgObj.onload = () => {
        //canvas宽高:如果页面上img设置了style="width:50px;height:50px",已页面设置的为主,如果没有设置就是默认图片的大小
        canvas.width = imgElement.width || imgObj.width;// 想要的canvas固定宽度
        canvas.height = imgElement.height || imgObj.height;// 想要的canvas固定高度
        
        //在canvas里面绘制图片:图片的宽高需要按缩放比例进行绘制
        //计算缩放比例
        var ratio = Math.min(canvas.width / imgObj.width, canvas.height / imgObj.height);
        var scaledWidth = imgObj.width * ratio;
        var scaledHeight = imgObj.height * ratio;
        var offsetX = (canvas.width - scaledWidth) / 2;
        var offsetY = (canvas.height - scaledHeight) / 2;
        // 绘制缩小后的图片
        ctx.drawImage(imgObj, 0, 0, imgObj.width, imgObj.height, offsetX, offsetY, scaledWidth, scaledHeight);
        // 将缩小后的图片导出为PNG
        resolve(canvas.toDataURL('image/png'));
      };
      imgObj.onerror = reject;
    });
  });

  Promise.all(imagePromises).then(imgUrls => {
    imgUrls.forEach((imgUrl, i) => {
      regularImages[i].src = imgUrl;
    });

    // 构建包含 HTML 内容的完整 HTML 文档字符串
    const fullHtmlContent = `
      <!DOCTYPE html>
      <html>
        <head>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        </head>
        <body>
          ${htmlContent.outerHTML}
        </body>
      </html>
    `;

    // 使用 html-docx-js 将 HTML 转换为 Word 文档的 Blob 对象
    const converted = htmlDocx.asBlob(fullHtmlContent);
    // 使用 file-saver 保存 Blob 对象为 Word 文档文件
    saveAs(converted, fileName);
  });
};

3、在应用中调用上述导出方法,并传入想导出的 HTML 内容。

注意:html结构需要包含style样式,引入css文件样式不生效的

//html页面上
<a class="fs-14 text-g" ng-click="vm.daochu()">导出</a>
<div class="row" id="resumeAllInfo">
  <div class="row" style="color:#205081;font-size:16px;border-bottom:1px solid #eee;margin-bottom: 15px;padding-bottom: 5px;">基本信息</div>
  <div class="row" style="vertical-align: middle">
    <span style="float: left;margin-right:20px">
      <img style="width:50px;height:50px" ng-src="{{ vm.resume.portraitUrl }}" rw-default-img img-type="portrait" alt="头像">
    </span>
    <span>
      <span style="font-size:16px;margin-right:20px">{{ vm.resume.name }}</span>
      <span style="margin-right:10px">{{ vm.resume.phone }}</span>
      <span ng-if="vm.resume.wechat" style="margin-right:10px">
        <span style="margin-right:10px">|</span>{{ vm.resume.wechat }}</span>
      <span ng-if="vm.resume.qq" style="margin-right:10px">
        <span style="margin-right:10px">|</span>{{ vm.resume.qq }}</span>
      <span ng-if="vm.resume.email" style="margin-right:10px">
        <span style="margin-right:10px">|</span>{{ vm.resume.email }}</span>
    </span>
  </div>
</div>

<script>
    ……
    vm.daochu=daochu;
    function daochu() {
      // 获取要导出的HTML字符串
      const htmlElement = document.getElementById('resumeAllInfo');

      //调用导出方法
      exportHtmlToDocx(htmlElement, 'my-exported-document.docx');

    }  
</script>    

以下是一个用于51单片机的超声波避障小车的代码: ```c #include <reg51.h> #define MIDDLE 0 #define LEFT 1 #define RIGHT 2 void Delay450ms() //@11.0592MHz { unsigned char i, j, k; _nop_(); i = 4; j = 39; k = 209; do { do { while (--k); } while (--j); } while (--i); } void Delay150ms() //@11.0592MHz { unsigned char i, j, k; _nop_(); i = 2; j = 13; k = 237; do { do { while (--k); } while (--j); } while (--i); } void Time0Init() { // 初始化定时器0 // ... } void Time1Init() { // 初始化定时器1 // ... } void sgMiddle() { // 设置超声波传感器朝向中间 // ... } void sgLeft() { // 设置超声波传感器朝向左边 // ... } void sgRight() { // 设置超声波传感器朝向右边 // ... } double get_distance() { // 获取超声波传感器测得的距离 // ... } void goForword() { // 小车前进 // ... } void goBack() { // 小车后退 // ... } void Stop() { // 停止小车 // ... } void goRight() { // 小车右转 // ... } void goLeft() { // 小车左转 // ... } void main() { char dir; double disMiddle; // 中间距离 double disLeft; // 左边距离 double disRight; // 右边距离 Time0Init(); // 初始化定时器0 Time1Init(); // 初始化定时器1 sgMiddle(); Delay450ms(); Delay450ms(); dir = MIDDLE; while(1) { if(dir != MIDDLE) { sgMiddle(); Delay450ms(); dir = MIDDLE; } disMiddle = get_distance(); if(disMiddle > 35) { goForword(); } else if(disMiddle < 10) { goBack(); } else { Stop(); sgLeft(); dir = LEFT; Delay450ms(); disLeft = get_distance(); sgMiddle(); Delay450ms(); sgRight(); dir = RIGHT; Delay450ms(); disRight = get_distance(); if(disLeft < disRight) { goRight(); Delay150ms(); Stop(); } if(disLeft > disRight) { goLeft(); Delay150ms(); Stop(); } } } } ``` 这段代码实现了一个超声波避障小车的功能。它使用了51单片机,通过超声波传感器测量距离,并根据距离的变化控制小车的运动。具体的代码逻辑和功能实现请参考上述代码。 #### 引用[.reference_title] - *1* *2* *3* [51单片机实现避障小车](https://blog.csdn.net/m0_68038554/article/details/129938089)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smart_dream

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值