前端將頁面內容生成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格式獲取文件內容

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM