网站开发进阶(三十一)js如何将html表格导出为excel文件(后记)

举报
SHQ5785 发表于 2020/12/29 22:58:32 2020/12/29
【摘要】   js如何将html表格导出为excel文件(后记) 前言         项目前期做了个导出Excel表格的功能,但是经过测试发现只有在IE上才可以正确实现,在Chrome等浏览器中无法实现导出效果。经过上网搜索,尝试通过插件的形式实现。通过安装ActiveX for Chrome插件(地址栏输入chrome://extensions/ 进入扩展程序安装页面)。 ...

 

js如何将html表格导出为excel文件(后记)

前言

 

      项目前期做了个导出Excel表格的功能,但是经过测试发现只有在IE上才可以正确实现,在Chrome等浏览器中无法实现导出效果。经过上网搜索,尝试通过插件的形式实现。通过安装ActiveX for Chrome插件(地址栏输入chrome://extensions/ 进入扩展程序安装页面)。

      经过测试,选择ActiveX插件的形式并不能解决问题,故弃掷。经过一番网络搜索,查到一个好的方法,其通过FileSaver.js实现浏览器写入文件到本地磁盘。代码如下:

 


  
  1. <script>
  2. (function(){
  3. document.getElementById("saveBtn").onclick = function(event){
  4. event.preventDefault();
  5. var BB = self.Blob;
  6. saveAs(
  7. new BB(
  8. ["\ufeff" + document.getElementById("content").value] //\ufeff防止utf8 bom防止中文乱码
  9. , {type: "text/plain;charset=utf8"}
  10. )
  11. , document.getElementById("filename").value
  12. );
  13. };
  14. })();
  15. </script>

 

按照前面订单打印的思路,在页面中嵌入一隐藏元素,然后获取其内容。隐藏元素代码如下:

<i id="sunny" hidden="hidden">{{querydata}}</i>

获取结果如下:

 

      接下来需要做的工作解析上面的返回结果,然后拼接成Excel导出方法所需形式。

      解析代码如下:

 


  
  1. var content = document.getElementById("sunny").innerHTML;
  2. // alert(content);
  3. var contentText = "药品名,药品ID,价格(元),数量(盒),下单时间,订单ID,订单内容,购药者,处方药,药品种类\n";
  4. var obj = JSON.parse(content); // 由JSON字符串转换为JSON对象
  5. // alert(obj.length);
  6. var billDtl = '';
  7. for(k=0; k<obj.length; k++){
  8. var bill = obj[k];
  9. var content = '';
  10. var index = bill.billContent.indexOf(',');
  11. // alert(index);
  12. if(index != -1){
  13. var contentArray = bill.billContent.split(",");
  14. if(contentArray.length > 1){
  15. for(j=0; j<contentArray.length-1; j++){
  16. content += contentArray[j] + '、';
  17. }
  18. content += contentArray[j];
  19. }
  20. // alert(content);
  21. }
  22. billDtl += bill.medname + "," + bill.medid + "," + bill.medprice + "," + bill.sellcnt + "," + bill.tx_time + "," + bill.billid + ","
  23. + content + "," + bill.buy_uid + "," + bill.iscf + "," + bill.medtype + "\n";
  24. }
  25. alert(billDtl);

 

其中主要涉及到

json数组字符串转换为json数组:

var obj = JSON.parse(content); // 由JSON字符串转换为JSON对象

订单内容格式化:

var content = '';

var index = bill.billContent.indexOf(',');

//alert(index);

if(index != -1){

   var contentArray = bill.billContent.split(",");

   if(contentArray.length > 1){

     for(j=0; j<contentArray.length-1; j++){

        content += contentArray[j] + '、';

      }

     content += contentArray[j];

   }

//alert(content);

    }else{

content = bill.billContent;

}

订单内容拼接:

billDtl += bill.medname + "," + bill.medid + "," + bill.medprice + "," + bill.sellcnt + "," + bill.tx_time + "," + bill.billid + "," + content + "," 

+ bill.buy_uid + "," + bill.iscf + "," + bill.medtype + "\n";

      至此,Ecxel可实现导出功能,唯一的缺陷就是不存在文件命名,存储位置选择的对话框。

      为了解决文件命名、存储位置选择问题,自己不得不放弃原来的导出方法,尝试使用如下方法:

 


  
  1. <span style="color:#ff0000;">(function (){
  2. Downloadify.create('downloadify',{
  3. filename: function(){
  4. //return document.getElementById('filename').value;
  5. return "Sunny.csv";
  6. },
  7. data: function(){
  8. var content = document.getElementById("sunny").innerHTML;
  9. // alert(content);
  10. var contentText = "药品名,药品ID,价格(元),数量(盒),下单时间,订单ID,订单内容,购药者,处方药,药品种类\n";
  11. var obj = JSON.parse(content); // 由JSON字符串转换为JSON对象
  12. // alert(obj.length);
  13. var billDtl = '';
  14. for(k=0; k<obj.length; k++){
  15. var bill = obj[k];
  16. var content = '';
  17. var index = bill.billContent.indexOf(',');
  18. // alert(index);
  19. if(index != -1){
  20. var contentArray = bill.billContent.split(",");
  21. if(contentArray.length > 1){
  22. for(j=0; j<contentArray.length-1; j++){
  23. content += contentArray[j] + '、';
  24. }
  25. content += contentArray[j];
  26. }
  27. // alert(content);
  28. }else{
  29. content = bill.billContent;
  30. }
  31. billDtl += bill.medname + "," + bill.medid + "," + bill.medprice + "," + bill.sellcnt + "," + bill.tx_time + "," + bill.billid + ","
  32. + content + "," + bill.buy_uid + "," + bill.iscf + "," + bill.medtype + "\n";
  33. }
  34. alert(billDtl);
  35. return "\ufeff" + contentText + billDtl;
  36. },
  37. onComplete: function(){
  38. alert('保存成功!');
  39. },
  40. onCancel: function(){
  41. },
  42. onError: function(){
  43. alert('保存失败!');
  44. },
  45. transparent: false,
  46. swf: 'img/downloadify.swf',
  47. downloadImage: 'img/download.png',
  48. width: 100,
  49. height: 30,
  50. transparent: true,
  51. append: false
  52. });
  53. })();</span>

 

      经过UI的稍微调整,问题总算得以解决。

参考文献

1.http://www.chromi.org/archives/10618

2.http://www.oschina.net/news/16501/new-plugin-make-chrome-support-activex

3.http://zhidao.baidu.com/link?url=-wD7FbuwVMYGGgCr4X65CmL73z7TF53dzYWD2Z1-t1ysM0U2CyyyzSymO43DaAgUpEcJ1zwm_mgT8JdGo26Om2t6h5yWTW0TzPJ3rXjP6rS

4.http://baike.baidu.com/link?url=tXq95A_vT1Ksgruf2wFAxzwzYocQk-UD3YQ6hYVwL1CORcCax7ThRE7jypfkqVEaXQ9wgieKECONqx7tp75SHw2-OJ8v9XYCNcFqGC4j2V3

5.http://my.oschina.net/tongjh/blog/316938

6.http://www.jb51.net/article/43136.htm

7.http://www.ynpxrz.com/n763517c2025.aspx

8.http://www.dreamdu.com/xhtml/tag_param/

有图有真相

 

 

美文美图

 

文章来源: shq5785.blog.csdn.net,作者:No Silver Bullet,版权归原作者所有,如需转载,请联系作者。

原文链接:shq5785.blog.csdn.net/article/details/50774291

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。