js 或者 vue表格导出Excel总结(发票/账单)

1.自定义样式

2.自定义页边距

3.设置单元格输出

废话不多说,直接上代码

本例 是基于vue开发,代码格式保持vue风格,写在.vue组件里,如果使用js请自行转换

两种方式:

<template>
<div>
  <div>
    <button type="button" @click="ExportExcel">导出Excel(第一种方式)</button>
    <button type="submit" @click="tableToExcel('tableExcel','','test2.xlsx')" 
    class="btn btn-primary">
          <a id="download" href="" style="display: none;"></a>导出Excel(第二种方式)
     </button>
  </div>
  <div id="myDiv">
    <table id="tableExcel" style="width: 740px;">
      <thead>
      <tr>
       <td colspan="6" align="center" class="title">********账单(2019年05月)</td>
     </tr>
      <tr><td colspan="6" align="right">打印日期:2019年05月09日</td></tr>
      <tr><td colspan="4" class="company_name">名称:********有限公司</td>
        <td colspan="2" align="right">合同号:1255664155</td></tr>
      <tr><td class="company_name">房产:</td>
        <tdcolspan="5"class="company_name">1121,909,e3091121,
          909,e3091121,909,e3091121,909,e309112
        </td>
      </tr>
      </thead>
      <colgroup>
        <col class="table_read"/><col class="table_room"/><col class="table_room"/>
        <col class="table_read"/><col class="table_read"/><col class="table_read"/>
      </colgroup>
      <tbody>
      <tr align="center"><td class="table_head">费项</td><td class="table_head">房产</td>
       <td class="table_head">期间/读数|倍率</td><td class="table_head">数量</td>
       <td class="table_head">单价</td><td class="table_head">金额</td>
     </tr>
      <tr><td>租金</td><td class="ggg">101,e10022,1121,909,e309</td><class="ggg">ccc</td>
         <td>ddd</td><td align="right">0.20</td><td align="right">332.20</td>
      </tr>    
      <tr><td>管理费</td><td class="ggg">1121,909,e309</td><td class="ggg">CCC</td>
          <td>DDD</td><td align="right">2.63</td><td align="right">64652.32</td>
       </tr>
      <tr><td>电梯费</td><td class="ggg">1121,909,e309</td><td class="ggg">HHH</td>
       <td>III</td><td align="right">0.04</td><td align="right">121458.23</td>
      </tr>
      <tr><td>电费</td><td class="ggg">1121,909,e309</td><td class="ggg">HHH</td>
       <td>III</td><td align="right">0.40</td><td align="right">236.00</td>
      </tr>
      <tr><td>水费</td><td class="ggg">1121,909,e309</td><td class="ggg">HHH</td>
       <td>III</td><td class="hhh" align="right">2521221122</td>
       <td align="right">293658.92</td></tr>
      <tr><td rowspan="4">说明</td>
        <td colspan="3" rowspan="4">
          请于当月5日前缴清费用,费用有疑问请拨打0755-21000374,咨询转账请留言13799988555, 
          逾期按日收取月租金的0.5%违约金,
          逾期未交者,将按合同约定执行,恕不另行通知
        </td>
        <td align="right" class="ccc">本期总计:</td>
         <td align="right"class="ddd">11111.00</td>
      </tr>
      <tr><td align="right" class="ccc">往期欠缴:</td>
         <td align="right" class="ddd">440.00</td></tr>
      <tr><td align="right"  class="ccc">应付总额:</td>
       <td align="right" class="ddd">11551.00</td></tr>
      <tr ><td align="right" class="eee">违约金:</td>
      <td align="right" class="fff">22.00</td></tr>
      </tbody>
    </table>
  </div>

</div>
</template>

<script>
    export default {
      methods:{
        ExportExcel(data){// 第一种方式
          let lHtml = document.getElementById("myDiv").innerHTML;
          let tableHtml='<html><head><meta charset="UTF-8">' +
            '<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">'+
            '<style>' +
            '.title{\n' +
            '  font-size: 22px;\n' +
            'height: 32px;'+
            '}\n' +
            '.company_name{\n' +
            '  font-size: 16px;\n' +
            'height: 30px;'+
            '}'+
            ' .table_head{\n' +
            '  font-size: 14px;height: 24px;\n' +
            '  }\n'+
            'table{\n' +
            '  width: 740px;\n' +
            '  table-layout:fixed;' +
            '}\n' +
            'td{\n' +
            '  padding: 0 5px;\n' +
            '  overflow:hidden;\n' +
            '  mso-number-format:"\#\,\#\#0\.00"'+
            '}\n' +
            'tbody td{\n' +
            '  height: 30px;\n' +
            '  font-size: 15px;\n' +
            '  border:0.5px solid #000;'+
            '}\n' +
            '.ccc{\n' +
            '  border: 0;\n' +
            '}\n'+
            '.ddd{' +
            'border: 0;'+
            'border-right: 0.5px solid #000;\n' +
            '}\n'+
            '.eee{\n' +
            '  border: 0;\n' +
            '  border-bottom: 0.5px solid #000;\n' +
            '}\n' +
            '.fff{\n' +
            '  border: 0;\n' +
            '  border-bottom: 0.5px solid #000;\n' +
            '  border-right: 0.5px solid #000;\n' +
            '}'+
            '.ggg{' +  // 设置溢出省略号,无效
            '  word-break:keep-all;\n' +
            '  white-space:nowrap;\n' +
            '  overflow:hidden;\n' +
            '  text-overflow:ellipsis;\n' +
            '}'+
            '.hhh{' +
            '  mso-number-format:"\@";'+// 设置单元格类型
            '}'+
            ' .table_room{\n' +
            '    width: 170px;\n' +
            '  }\n' +
            ' .table_read{\n' +
            '    width: 100px;\n' +
            '  }'+
            '@page\n' +
            '  {margin:0.80cm 0.90cm 0.80cm 1.80cm; \n' +
            '   mso-header-margin:0.51cm;\n' +
            '   mso-footer-margin:0.51cm;}'+
            '</style>'+
            '</head><body>';
          tableHtml += lHtml;
          tableHtml += '</body></html>';
          console.log(tableHtml)
          let excelBlob = new Blob([tableHtml], {type: 'application/vnd.ms-excel'});
          let fileName = "test1.xls";
          if(this.isIE()){
            window.navigator.msSaveOrOpenBlob(excelBlob,fileName);
          }else{
            //  这里是两种方式的区别之处 直接导出HTML内容,这种在Excel表格里会自动使用
               // 文件名作为工作表名称
            let a = document.createElement('a');
            a.href = URL.createObjectURL(excelBlob);
            a.download = fileName;
            document.body.appendChild(a);
            a.click();
          }
        },
        <!****************第二种方式********************************>
        tableToExcel (tableId, name,filename) {
        if(this.isIE()){
            window.navigator.msSaveOrOpenBlob(excelBlob,fileName);
            return;
          }
          let uri = 'data:application/vnd.ms-excel;base64,',
            //Excel样式代码
            template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" 
                        xmlns:x="urn:schemas-microsoft-com:office:excel"'+
              'xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml>
               <x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>'
              +'<x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/>
                </x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets>'
              +'</x:ExcelWorkbook></xml><![endif]-->'+
              '<meta http-equiv=Content-Type content="text/html; charset=utf-8">'+
              '<style>' +
              '.title{\n' +
              '  font-size: 22px;\n' +
              'height: 32px;'+
              '}\n' +
              '.company_name{\n' +
              '  font-size: 16px;\n' +
              'height: 30px;'+
              '}'+
              ' .table_head{\n' +
              '  font-size: 14px;height: 24px;\n' +
              '  }\n'+
              'table{\n' +
              '  width: 740px;\n' +
              '  table-layout:fixed;' +
              '}\n' +
              'td{\n' +
              '  padding: 0 5px;\n' +
              '  overflow:hidden;\n' +
              '  mso-number-format:"\#\,\#\#0\.00"'+
              '}\n' +
              'tbody td{\n' +
              '  height: 30px;\n' +
              '  font-size: 15px;\n' +
              '  border:0.5px solid #000;'+
              '}\n' +
              '.ccc{\n' +
              '  border: 0;\n' +
              '}\n'+
              '.ddd{' +
              'border: 0;'+
              'border-right: 0.5px solid #000;\n' +
              '}\n'+
              '.eee{\n' +
              '  border: 0;\n' +
              '  border-bottom: 0.5px solid #000;\n' +
              '}\n' +
              '.fff{\n' +
              '  border: 0;\n' +
              '  border-bottom: 0.5px solid #000;\n' +
              '  border-right: 0.5px solid #000;\n' +
              '}'+
              '.ggg{' +
              '  word-break:keep-all;\n' +
              '  white-space:nowrap;\n' +
              '  overflow:hidden;\n' +
              '  text-overflow:ellipsis;\n' +
              '}'+
              '.hhh{' +
              '  mso-number-format:"\@";'+
              '}'+
              ' .table_room{\n' +
              '    width: 170px;\n' +
              '  }\n' +
              ' .table_read{\n' +
              '    width: 100px;\n' +
              '  }'+
              '@page\n' +   // 设置页边距,以厘米为单位,也可以以英寸in为单位
              '  {margin:0.80cm 0.90cm 0.80cm 1.80cm; \n' +
              '   mso-header-margin:0.51cm;\n' +
              '   mso-footer-margin:0.51cm;}'+
              '</style>'+
              '</head><body><table><colgroup>\n' +
              '<col class="table_read"/><col class="table_room"/>
                <col class="table_room"/><col class="table_read"/>
                <col class="table_read"/><col class="table_read"/>\n' +
              '</colgroup>' +
              '{table}' +
              '</table></body></html>',
            base64 = function(s) { return window.btoa(unescape(encodeURIComponent(s))) },
            format = function(s, c) {
              return s.replace(/{(\w+)}/g,
                function(m, p) { return c[p]; })
          };
            //  这里是两种方式的区别之处 把页面转为base64码导出 name是工作表名称,可以为空
            let table;
            if (!tableId.nodeType) table = document.getElementById(tableId);
            let ctx = {worksheet: name || 'Worksheet', table: table.innerHTML};
       document.getElementById("download").href = uri + base64(format(template, ctx));
            document.getElementById("download").download = filename;
            document.getElementById("download").click();
        }
      },


        isIE() {
          if (!!window.ActiveXObject || "ActiveXObject" in window) {
            return true;
          } else {
            return false;
          }
        }

      },
    }
</script>

<style scoped>
  .title{
    font-size: 20px;
  }
  .company_name{
    font-size: 16px;
    height: 30px;
  }
  table{
    table-layout:fixed;
  }

  td{
    padding: 0 5px;
    border:1px solid #aaa;
    /*word-break:keep-all;*/
    /*white-space:nowrap;*/
    overflow:hidden;
    /*text-overflow:ellipsis;*/
  }
  thead td:last-child{}
  tbody td{
    height: 30px;
    font-size: 15px;
    border: 1px solid #000;
  }
  .ggg{
    word-break:keep-all;
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
  }
  .ccc{
    border: 0;
  }
  .ddd{
    border: 0;
    border-right: 1px solid #000;
  }
  .eee{
    border: 0;
    border-bottom: 1px solid #000;
  }
  .fff{
    border: 0;
    border-bottom: 1px solid #000;
    border-right: 1px solid #000;
  }
  .table_head{
    font-size: 12px;
    height: 24px;
  }
  .table_room{
    width: 170px;
  }
  .table_read{
    width: 100px;
  }


</style>

 

 

摘抄自:https://blog.csdn.net/nihaoqiulinhe/article/details/53537540    

理解翻译

mso-number-format:"0"NO Decimals  没有小数位
mso-number-format:"0\.000" 3 Decimals  保留3位小数
mso-number-format:"\#\,\#\#0\.000"Comma with 3 dec  保留3位小数,并且长数字用逗号分隔
mso-number-format:"mm\/dd\/yy"Date7  日期  以下都是不同的日期格式展示
mso-number-format:"mmmm\ d\,\ yyyy"Date9
mso-number-format:"m\/d\/yy\ h\:mm\ AM\/PM"D -T AMPM
mso-number-format:"Short Date"01/03/1998
mso-number-format:"Medium Date"01-mar-98
mso-number-format:"d\-mmm\-yyyy"01-mar-1998
mso-number-format:"Short Time"5:16
mso-number-format:"Medium Time"5:16 am
mso-number-format:"Long Time"5:16:21:00
mso-number-format:"Percent"Percent - two decimals   百分数 两位小数
mso-number-format:"0%"Percent - no decimals  百分数  没有小数
mso-number-format:"0\.E+00"Scientific Notation   科学计数法
mso-number-format:"\@"  Text    作为文本输出   当前数值大的时候会变为科学计数法,用此转换
mso-number-format:"\#\ ???\/???"Fractions - up to 3 digits (312/943)  分数 最多三位数
mso-number-format:"\0022£\0022\#\,\#\#0\.00"£12.76 英镑
mso-number-format:"\#\,\#\#0\.00_ \;

Red

\-\#\,\#\#0\.00\ "

2 decimals, negative numbers in red and signed (1.56   -1.56)

2位小数,红色负号

  

 

页面效果图:

第一种方式导出Excel效果图:

 

第二种方式导出效果图:

 

可以看出两种方式展示效果基本一样,区别在于第一种方式的设置td宽度没有其作用

而共同之处在于给两种方式设置的溢出省略号处理都没有实现,全部失效。

希望解决的朋友留言告知,谢谢!!!

本文不妥之处请指正,接受意见,不接受批评!

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值