导出多个表的excel文件

<template>

  <div class="horizontalDiv">
    <div style="display:none" id="horizontalDiv1"></div>
    <div style="display:none" id="horizontalDiv2"></div>
    <div style="display:none" id="horizontalDiv3"></div>
    <div style="display:none" id="horizontalDiv4"></div>
    <div style="display:none" id="horizontalDiv5"></div>
  </div>
</template>

<script>
import XLSX from 'xlsx';

export default {
  name: 'horizontal',
  methods: {
    horizontalTables(hdata, standardName) {
      let sheetNames = ['层楼板投影面积统计表', '层楼梯、挑板、水平其他构件投影面积统计表', '层梁投影面积统计表', '层预制楼板、楼梯、阳台板投影面积统计表', '层预制梁、沉箱、空调板、飘窗板、挑板投影面积统计表'];
      sheetNames = sheetNames.map(item => standardName + item);

      let sheet1Str;
      let sheet1Start;
      let sheet1Center;
      let sheet1end;
      sheet1Start = '<table style="text-align:center" align="center" id="sheet1" cellspacing="0" cellpadding="0" border="1"> <tbody>';

      let sheet11;
      let sheet12;
      let sheet13;
      sheet11 = `
            <tr>
              <td align="center" colspan="4">${sheetNames[0]}</td>
            </tr>
            <tr>
              <td align="center" colspan="2">编号</td>
              <td align="center" colspan="2">投影面积(m2)</td> 
            </tr>`;
      for (let j = 0; j < hdata.unprefab.floor.length; j += 1) {
        sheet12 += `<tr>
              <td colspan="2">${hdata.unprefab.floor[j].compNo || '-'}</td>
              <td colspan="2">${hdata.unprefab.floor[j].parArea || '-'}</td>
            </tr> `;
      }
      // sheet13 = '<tr><td colspan="4"></td></tr>';
      sheet1Center += sheet11 + sheet12 + sheet13;

      sheet1end = '</tbody></table>';
      sheet1Str = sheet1Start + sheet1Center + sheet1end;

      let sheet2Str;
      let sheet2Start;
      let sheet2Center;
      let sheet2end;
      sheet2Start = '<table align="center" id="sheet2" cellspacing="0" cellpadding="0" border="1"> <tbody>';

      let sheet21;
      let sheet22;
      let sheet23;
      sheet21 = `
            <tr>
              <td align="center" colspan="4">${sheetNames[1]}</td>
            </tr>
            <tr>
             <td align="center" colspan="2">编号</td>
              <td align="center" colspan="2">投影面积(m2)</td> 
            </tr>`;
      for (let j = 0; j < hdata.unprefab.other.length; j += 1) {
        sheet22 += `<tr>
              <td colspan="2">${hdata.unprefab.other[j].compNo || '-'}</td>
              <td colspan="2">${hdata.unprefab.other[j].parArea || '-'}</td>
            </tr> `;
      }
      // sheet23 = '<tr><td colspan="4"></td></tr>';
      sheet2Center += sheet21 + sheet22 + sheet23;

      sheet2end = '</tbody></table>';
      sheet2Str = sheet2Start + sheet2Center + sheet2end;

      let sheet3Str;
      let sheet3Start;
      let sheet3Center;
      let sheet3end;
      sheet3Start = '<table align="center" id="sheet3" cellspacing="0" cellpadding="0" border="1"> <tbody>';

      let sheet31;
      let sheet32;
      let sheet33;
      sheet31 = `
            <tr>
              <td align="center" colspan="4">${sheetNames[2]}</td>
            </tr>
            <tr>
              <td colspan="2">编号</td>
              <td colspan="2">投影面积(m2)</td> 
            </tr>`;
      for (let j = 0; j < hdata.unprefab.beam.length; j += 1) {
        sheet32 += `<tr>
               <td colspan="2">${hdata.unprefab.beam[j].compNo || '-'}</td>
              <td colspan="2">${hdata.unprefab.beam[j].parArea || '-'}</td>
            </tr> `;
      }
      // sheet23 = '<tr><td colspan="4"></td></tr>';
      sheet3Center += sheet31 + sheet32 + sheet33;
      sheet3Str = sheet3Start + sheet3Center + sheet3end;

      let sheet4Str;
      let sheet4Start;
      let sheet4Center;
      let sheet4end;
      sheet4Start = '<table align="center" id="sheet4" cellspacing="0" cellpadding="0" border="1"> <tbody>';
      let sheet41;
      let sheet42;
      let sheet43;
      sheet41 = `
            <tr>
             <td align="center" colspan="4">${sheetNames[3]}</td>
            </tr>
            <tr>
              <td colspan="2">编号</td>
              <td colspan="2">投影面积(m2)</td> 
            </tr>`;
      for (let j = 0; j < hdata.prefab.floor.length; j += 1) {
        sheet42 += `<tr>
                <td colspan="2">${hdata.prefab.floor[j].compNo || '-'}</td>
              <td colspan="2">${hdata.prefab.floor[j].parArea || '-'}</td>
            </tr> `;
      }
      // sheet23 = '<tr><td colspan="4"></td></tr>';
      sheet4Center += sheet41 + sheet42 + sheet43;

      sheet4end = '</tbody></table>';
      sheet4Str = sheet4Start + sheet4Center + sheet4end;


      let sheet5Str;
      let sheet5Start;
      let sheet5Center;
      let sheet5end;
      sheet5Start = '<table align="center" id="sheet5" cellspacing="0" cellpadding="0" border="1"> <tbody>';
      let sheet51;
      let sheet52;
      let sheet53;
      sheet51 = `
            <tr>
             <td align="center" colspan="4">${sheetNames[4]}</td>
            </tr>
            <tr>
              <td colspan="2">编号</td>
              <td colspan="2">投影面积(m2)</td> 
            </tr>`;
      for (let j = 0; j < hdata.prefab.beam.length; j += 1) {
        sheet52 += `<tr>
                <td colspan="2">${hdata.prefab.beam[j].compNo || '-'}</td>
              <td colspan="2">${hdata.prefab.beam[j].parArea || '-'}</td>
            </tr> `;
      }
      // sheet23 = '<tr><td colspan="4"></td></tr>';
      sheet5Center += sheet51 + sheet52 + sheet53;

      sheet5end = '</tbody></table>';
      sheet5Str = sheet5Start + sheet5Center + sheet5end;


      document.getElementById('horizontalDiv1').innerHTML = sheet1Str;
      document.getElementById('horizontalDiv2').innerHTML = sheet2Str;
      document.getElementById('horizontalDiv3').innerHTML = sheet3Str;
      document.getElementById('horizontalDiv4').innerHTML = sheet4Str;
      document.getElementById('horizontalDiv5').innerHTML = sheet5Str;
      const sheet1 = XLSX.utils.table_to_sheet(document.getElementById('sheet1'));
      const sheet2 = XLSX.utils.table_to_sheet(document.getElementById('sheet2'));
      const sheet3 = XLSX.utils.table_to_sheet(document.getElementById('sheet3'));
      const sheet4 = XLSX.utils.table_to_sheet(document.getElementById('sheet4'));
      const sheet5 = XLSX.utils.table_to_sheet(document.getElementById('sheet5'));
      // console.log(XLSX);
      const wb = XLSX.utils.book_new();

      XLSX.utils.book_append_sheet(wb, sheet1, sheetNames[0]);
      XLSX.utils.book_append_sheet(wb, sheet2, sheetNames[1]);
      XLSX.utils.book_append_sheet(wb, sheet3, sheetNames[2]);
      XLSX.utils.book_append_sheet(wb, sheet4, sheetNames[3]);
      XLSX.utils.book_append_sheet(wb, sheet5, sheetNames[4]);

      const workbookBlob = this.workbook2blob(wb);
      this.openDownloadDialog(workbookBlob, `${standardName}层预制水平构件应用比例计算统计表.xlsx`);
    },
    openDownloadDialog (blob, fileName) {
      if (typeof blob === 'object' && blob instanceof Blob) {
        // eslint-disable-next-line no-param-reassign
        blob = URL.createObjectURL(blob); // 创建blob地址
      }
      let aLink = document.createElement('a');
      aLink.href = blob;
      // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,有时候 file:///模式下不会生效
      aLink.download = fileName || '';
      let event;
      if (window.MouseEvent) event = new MouseEvent('click');
      //   移动端
      else {
        event = document.createEvent('MouseEvents');
        event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
      }
      aLink.dispatchEvent(event);
    },
    workbook2blob (workbook) {
    // 生成excel的配置项
      let wopts = {
        // 要生成的文件类型
        bookType: 'xlsx',
        // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
        bookSST: false,
        type: 'binary',
      };
      let wbout = XLSX.write(workbook, wopts);
      // 将字符串转ArrayBuffer
      function s2ab (s) {
        let buf = new ArrayBuffer(s.length);
        let view = new Uint8Array(buf);
        // eslint-disable-next-line no-bitwise
        for (let i = 0; i !== s.length; i += 1) view[i] = s.charCodeAt(i) & 0xff;
        return buf;
      }
      let buf = s2ab(wbout);
      let blob = new Blob([buf], {
        type: 'application/octet-stream',
      });
      return blob;
    },
  },
  created() {

  },
};
</script>
<style scoped lang="scss">
  // @import '../../../mixinCss/mixin';
  table td{
    text-align: center !important;
  }

</style>

  

<template>

  <div class="horizontalDiv">
    <div style="display:none" id="horizontalDiv1"></div>
    <div style="display:none" id="horizontalDiv2"></div>
    <div style="display:none" id="horizontalDiv3"></div>
    <div style="display:none" id="horizontalDiv4"></div>
    <div style="display:none" id="horizontalDiv5"></div>
  </div>
</template>

<script>
import XLSX from 'xlsx';

export default {
  name: 'horizontal',
  methods: {
    horizontalTables(hdatastandardName) {
      let sheetNames = ['层楼板投影面积统计表''层楼梯、挑板、水平其他构件投影面积统计表''层梁投影面积统计表''层预制楼板、楼梯、阳台板投影面积统计表''层预制梁、沉箱、空调板、飘窗板、挑板投影面积统计表'];
      sheetNames = sheetNames.map(item => standardName + item);

      let sheet1Str;
      let sheet1Start;
      let sheet1Center;
      let sheet1end;
      sheet1Start = '<table style="text-align:center" align="center" id="sheet1" cellspacing="0" cellpadding="0" border="1"> <tbody>';

      let sheet11;
      let sheet12;
      let sheet13;
      sheet11 = `
            <tr>
              <td align="center" colspan="4">${sheetNames[0]}</td>
            </tr>
            <tr>
              <td align="center" colspan="2">编号</td>
              <td align="center" colspan="2">投影面积(m2)</td> 
            </tr>`;
      for (let j = 0j < hdata.unprefab.floor.lengthj += 1) {
        sheet12 += `<tr>
              <td colspan="2">${hdata.unprefab.floor[j].compNo || '-'}</td>
              <td colspan="2">${hdata.unprefab.floor[j].parArea || '-'}</td>
            </tr> `;
      }
      // sheet13 = '<tr><td colspan="4"></td></tr>';
      sheet1Center += sheet11 + sheet12 + sheet13;

      sheet1end = '</tbody></table>';
      sheet1Str = sheet1Start + sheet1Center + sheet1end;

      let sheet2Str;
      let sheet2Start;
      let sheet2Center;
      let sheet2end;
      sheet2Start = '<table align="center" id="sheet2" cellspacing="0" cellpadding="0" border="1"> <tbody>';

      let sheet21;
      let sheet22;
      let sheet23;
      sheet21 = `
            <tr>
              <td align="center" colspan="4">${sheetNames[1]}</td>
            </tr>
            <tr>
             <td align="center" colspan="2">编号</td>
              <td align="center" colspan="2">投影面积(m2)</td> 
            </tr>`;
      for (let j = 0j < hdata.unprefab.other.lengthj += 1) {
        sheet22 += `<tr>
              <td colspan="2">${hdata.unprefab.other[j].compNo || '-'}</td>
              <td colspan="2">${hdata.unprefab.other[j].parArea || '-'}</td>
            </tr> `;
      }
      // sheet23 = '<tr><td colspan="4"></td></tr>';
      sheet2Center += sheet21 + sheet22 + sheet23;

      sheet2end = '</tbody></table>';
      sheet2Str = sheet2Start + sheet2Center + sheet2end;

      let sheet3Str;
      let sheet3Start;
      let sheet3Center;
      let sheet3end;
      sheet3Start = '<table align="center" id="sheet3" cellspacing="0" cellpadding="0" border="1"> <tbody>';

      let sheet31;
      let sheet32;
      let sheet33;
      sheet31 = `
            <tr>
              <td align="center" colspan="4">${sheetNames[2]}</td>
            </tr>
            <tr>
              <td colspan="2">编号</td>
              <td colspan="2">投影面积(m2)</td> 
            </tr>`;
      for (let j = 0j < hdata.unprefab.beam.lengthj += 1) {
        sheet32 += `<tr>
               <td colspan="2">${hdata.unprefab.beam[j].compNo || '-'}</td>
              <td colspan="2">${hdata.unprefab.beam[j].parArea || '-'}</td>
            </tr> `;
      }
      // sheet23 = '<tr><td colspan="4"></td></tr>';
      sheet3Center += sheet31 + sheet32 + sheet33;
      sheet3Str = sheet3Start + sheet3Center + sheet3end;

      let sheet4Str;
      let sheet4Start;
      let sheet4Center;
      let sheet4end;
      sheet4Start = '<table align="center" id="sheet4" cellspacing="0" cellpadding="0" border="1"> <tbody>';
      let sheet41;
      let sheet42;
      let sheet43;
      sheet41 = `
            <tr>
             <td align="center" colspan="4">${sheetNames[3]}</td>
            </tr>
            <tr>
              <td colspan="2">编号</td>
              <td colspan="2">投影面积(m2)</td> 
            </tr>`;
      for (let j = 0j < hdata.prefab.floor.lengthj += 1) {
        sheet42 += `<tr>
                <td colspan="2">${hdata.prefab.floor[j].compNo || '-'}</td>
              <td colspan="2">${hdata.prefab.floor[j].parArea || '-'}</td>
            </tr> `;
      }
      // sheet23 = '<tr><td colspan="4"></td></tr>';
      sheet4Center += sheet41 + sheet42 + sheet43;

      sheet4end = '</tbody></table>';
      sheet4Str = sheet4Start + sheet4Center + sheet4end;


      let sheet5Str;
      let sheet5Start;
      let sheet5Center;
      let sheet5end;
      sheet5Start = '<table align="center" id="sheet5" cellspacing="0" cellpadding="0" border="1"> <tbody>';
      let sheet51;
      let sheet52;
      let sheet53;
      sheet51 = `
            <tr>
             <td align="center" colspan="4">${sheetNames[4]}</td>
            </tr>
            <tr>
              <td colspan="2">编号</td>
              <td colspan="2">投影面积(m2)</td> 
            </tr>`;
      for (let j = 0j < hdata.prefab.beam.lengthj += 1) {
        sheet52 += `<tr>
                <td colspan="2">${hdata.prefab.beam[j].compNo || '-'}</td>
              <td colspan="2">${hdata.prefab.beam[j].parArea || '-'}</td>
            </tr> `;
      }
      // sheet23 = '<tr><td colspan="4"></td></tr>';
      sheet5Center += sheet51 + sheet52 + sheet53;

      sheet5end = '</tbody></table>';
      sheet5Str = sheet5Start + sheet5Center + sheet5end;


      document.getElementById('horizontalDiv1').innerHTML = sheet1Str;
      document.getElementById('horizontalDiv2').innerHTML = sheet2Str;
      document.getElementById('horizontalDiv3').innerHTML = sheet3Str;
      document.getElementById('horizontalDiv4').innerHTML = sheet4Str;
      document.getElementById('horizontalDiv5').innerHTML = sheet5Str;
      const sheet1 = XLSX.utils.table_to_sheet(document.getElementById('sheet1'));
      const sheet2 = XLSX.utils.table_to_sheet(document.getElementById('sheet2'));
      const sheet3 = XLSX.utils.table_to_sheet(document.getElementById('sheet3'));
      const sheet4 = XLSX.utils.table_to_sheet(document.getElementById('sheet4'));
      const sheet5 = XLSX.utils.table_to_sheet(document.getElementById('sheet5'));
      // console.log(XLSX);
      const wb = XLSX.utils.book_new();

      XLSX.utils.book_append_sheet(wbsheet1sheetNames[0]);
      XLSX.utils.book_append_sheet(wbsheet2sheetNames[1]);
      XLSX.utils.book_append_sheet(wbsheet3sheetNames[2]);
      XLSX.utils.book_append_sheet(wbsheet4sheetNames[3]);
      XLSX.utils.book_append_sheet(wbsheet5sheetNames[4]);

      const workbookBlob = this.workbook2blob(wb);
      this.openDownloadDialog(workbookBlob`${standardName}层预制水平构件应用比例计算统计表.xlsx`);
    },
    openDownloadDialog (blobfileName) {
      if (typeof blob === 'object' && blob instanceof Blob) {
        // eslint-disable-next-line no-param-reassign
        blob = URL.createObjectURL(blob); // 创建blob地址
      }
      let aLink = document.createElement('a');
      aLink.href = blob;
      // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,有时候 file:///模式下不会生效
      aLink.download = fileName || '';
      let event;
      if (window.MouseEventevent = new MouseEvent('click');
      //   移动端
      else {
        event = document.createEvent('MouseEvents');
        event.initMouseEvent('click'truefalsewindow00000falsefalsefalsefalse0null);
      }
      aLink.dispatchEvent(event);
    },
    workbook2blob (workbook) {
    // 生成excel的配置项
      let wopts = {
        // 要生成的文件类型
        bookType: 'xlsx',
        // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
        bookSST: false,
        type: 'binary',
      };
      let wbout = XLSX.write(workbookwopts);
      // 将字符串转ArrayBuffer
      function s2ab (s) {
        let buf = new ArrayBuffer(s.length);
        let view = new Uint8Array(buf);
        // eslint-disable-next-line no-bitwise
        for (let i = 0i !== s.lengthi += 1view[i] = s.charCodeAt(i) & 0xff;
        return buf;
      }
      let buf = s2ab(wbout);
      let blob = new Blob([buf], {
        type: 'application/octet-stream',
      });
      return blob;
    },
  },
  created() {

  },
};
</script>
<style scoped lang="scss">
  // @import '../../../mixinCss/mixin';
  table td{
    text-aligncenter !important;
  }

</style>
原文地址:https://www.cnblogs.com/daifuchao/p/14710308.html