网站开发进阶(二十五)js如何将html表格导出为excel文件

举报
SHQ5785 发表于 2020/12/29 23:45:47 2020/12/29
【摘要】 js如何将html表格导出为excel文件        赠人玫瑰,手留余香。若您感觉此篇博文对您有用,请花费2秒时间点个赞,您的鼓励是我不断前进的动力,共勉!       jsp页面数据导出成excel的方法很多,今天介绍一种简单的js方法:   源码   // 导出$scope.doExportExcel = function() { var winna...

js如何将html表格导出为excel文件

       赠人玫瑰,手留余香。若您感觉此篇博文对您有用,请花费2秒时间点个赞,您的鼓励是我不断前进的动力,共勉!

      jsp页面数据导出成excel的方法很多,今天介绍一种简单的js方法:

  源码

 


  
  1. // 导出
  2. $scope.doExportExcel = function() {
  3. var winname = window.open('', '_blank', 'top=10000');
  4. //获得页面上需要导出的数据内容
  5. var strHTML = document.all.content_med_statement.innerHTML; // 其中tableExcel是需要导出数据的div的id或者表的id
  6. winname.document.open('text/html', 'replace');
  7. winname.document.writeln(strHTML);
  8. winname.document.execCommand('saveas','','lmapp.xls'); // excel是导出excel的默认名称
  9. winname.close();
  10. };

 

代码解读

1.window.open('''_blank''top=10000');

用javascript中的window.open()在一个新的窗口打开一个新的空白网页。

window.open(pageURL,name,parameters) 

其中:

pageURL 为子窗口路径 

name 为子窗口句柄 

parameters 为窗口参数(各参数用逗号分隔) 

2.document.all.content_med_statement.innerHTML;

document.all是页面内所有元素的一个集合。如:      

document.all(0)表示页面内第一个元素

document.all可以判断浏览器是否是IE   

  if(document.all){  

    alert("IE!");  

  }

3.winname.document.open('text/html''replace');

open() 方法可打开一个新文档,并擦除当前文档的内容。

document.open(mimetype,replace)

参数描述

mimetype可选。规定正在写的文档的类型。默认值是 "text/html"。

replace 可选。当此参数设置后,可引起新文档从父文档继承历史条目。

说明

该方法将擦除当前 HTML 文档的内容,开始一个新的文档,新文档用 write() 方法或 writeln() 方法编写。

提示和注释

重要事项:调用 open() 方法打开一个新文档并且用 write() 方法设置文档内容后,必须记住用 close 方法关闭文档,并迫使其内容显示出来。

注释:属于被覆盖的文档的一部分的脚本或事件句柄不能调用该方法,因为脚本或事件句柄自身也会被覆盖。

4.winname.document.execCommand('saveas','','lmapp.xls'); 

document.execCommand(sCommand,交互方式, 动态参数])

交互方式参数如果是true的话将显示对话框,如果为false的话,则不显示对话框,动态参数一般为一可用值或属性值。

如果把“.”后面的内容放进去的话就改变文件的格式属性了,从而也就得到了我们所需要的.xls excel格式。

阅读完源码之后,在实际操作过程中还是出现了问题,之间弹出框一闪而过,然后就没有任何效果了。

继续尝试其它方法,发现一个问题:是不是因为自己没有安装微软的excel,因为我知道自己安装的是wps。尝试安装一下微软的excel。

结果发现问题依旧,尝试以下代码:

 


  
  1. <HTML>
  2. <HEAD>
  3. <TITLE>将页面中指定表格的数据导入到Excel中</TITLE>
  4. <SCRIPT LANGUAGE="javascript">
  5. <!--
  6. function AutoExcel(){
  7. var oXL = new ActiveXObject("Excel.Application"); //创建应该对象
  8. var oWB = oXL.Workbooks.Add();//新建一个Excel工作簿
  9. var oSheet = oWB.ActiveSheet;//指定要写入内容的工作表为活动工作表
  10. var table = document.getElementById("data");//指定要写入的数据源的id
  11. var hang = table.rows.length;//取数据源行数
  12. var lie = table.rows(0).cells.length;//取数据源列数
  13. // Add table headers going cell by cell.
  14. for (i=0;i<hang;i++){//在Excel中写行
  15. for (j=0;j<lie;j++){//在Excel中写列
  16. //定义格式
  17. oSheet.Cells(i+1,j+1).NumberFormatLocal = "@";//将单元格的格式定义为文本
  18. //oSheet.Cells(i+1,j+1).Font.Bold = true;//加粗
  19. oSheet.Cells(i+1,j+1).Font.Size = 10;//字体大小
  20. oSheet.Cells(i+1,j+1).value = table.rows(i).cells(j).innerText;//向单元格写入值
  21. }
  22. }
  23. oXL.Visible = true;
  24. oXL.UserControl = true;
  25. oXL=null
  26. }
  27. //-->
  28. </SCRIPT>
  29. </HEAD>
  30. <BODY>
  31. <table border="0" width="300" id="data" bgcolor="black" cellspacing="1">
  32. <tr bgcolor="white">
  33. <td>编号</td>
  34. <td>姓名</td>
  35. <td>年龄</td>
  36. <td>性别</td>
  37. </tr>
  38. <tr bgcolor="white">
  39. <td>0001</td>
  40. <td>张三</td>
  41. <td>22</td>
  42. <td></td>
  43. </tr>
  44. <tr bgcolor="white">
  45. <td>0002</td>
  46. <td>李四</td>
  47. <td>23</td>
  48. <td></td>
  49. </tr>
  50. </table>
  51. <input type="button" name="out_excel" onclick="AutoExcel();" value="导出到excel">
  52. </BODY>
  53. </HTML>

 

      结果发现,其只可以运行在IE浏览器下,估计对IE的版本还会有限制,无语了。结果就是个这吗?难道只有IE才可以吗?更无语的是,下面的数据表格居然无法导出。

 


  
  1. <table class="table" id="body_med_statement" border="1" cellpadding="0" cellspacing="0" style="border-collapse:collapse">
  2. <tbody><tr>
  3. <th>序号</th>
  4. <th>药品名</th>
  5. <th>药品ID</th>
  6. <th>价格</th>
  7. <th>数量</th>
  8. <th>下单时间</th>
  9. <th>订单ID</th>
  10. <th>订单内容</th>
  11. <th>购药者</th>
  12. <th>处方药</th>
  13. <th>药品种类</th>
  14. </tr>
  15. <!-- ngRepeat: item in querydata --><tr ng-repeat="item in querydata" class="ng-scope">
  16. <td ng-bind="$index+1" class="ng-binding">1</td>
  17. <td class="ng-binding">感冒灵颗粒</td>
  18. <td><a ui-sref="#" class="ng-binding">TZ11020480</a></td>
  19. <td class="ng-binding">8</td>
  20. <td class="ng-binding">1</td>
  21. <td class="ng-binding">2015-11-19 11:06:05</td>
  22. <td class="ng-binding">LM2015081700001736</td>
  23. <td class="ng-binding">[感冒灵颗粒]</td>
  24. <td class="ng-binding">U13899990000</td>
  25. <td class="ng-binding">处方</td>
  26. <td class="ng-binding">中药</td>
  27. </tr><!-- end ngRepeat: item in querydata --><tr ng-repeat="item in querydata" class="ng-scope">
  28. <td ng-bind="$index+1" class="ng-binding">2</td>
  29. <td class="ng-binding">感冒灵颗粒</td>
  30. <td><a ui-sref="#" class="ng-binding">TZ11020480</a></td>
  31. <td class="ng-binding">8</td>
  32. <td class="ng-binding">1</td>
  33. <td class="ng-binding">2015-11-19 11:19:38</td>
  34. <td class="ng-binding">LM2015081700001980</td>
  35. <td class="ng-binding">[感冒灵颗粒]</td>
  36. <td class="ng-binding">U13899990000</td>
  37. <td class="ng-binding">处方</td>
  38. <td class="ng-binding">中药</td>
  39. </tr><!-- end ngRepeat: item in querydata -->
  40. </tbody>
  41. </table>

 

继续尝试其它方法:

 


  
  1. </pre><pre name="code" class="javascript">function method1(tableid){
  2. var curTbl = document.getElementById(tableid);
  3. var oXL;
  4. try{
  5. oXL = new ActiveXObject("Excel.Application"); //创建AX对象excel
  6. }catch(e){
  7. alert("无法启动Excel!\n\n如果您确信您的电脑中已经安装了Excel,"+"那么请调整IE的安全级别。\n\n具体操作:\n\n"+"工具 → Internet选项 → 安全 → 自定义级别 → 对没有标记为安全的ActiveX进行初始化和脚本运行 → 启用");
  8. return false;
  9. }
  10. var oWB = oXL.Workbooks.Add(); //获取workbook对象
  11. var oSheet = oWB.ActiveSheet;//激活当前sheet
  12. var sel = document.body.createTextRange();
  13. sel.moveToElementText(curTbl); //把表格中的内容移到TextRange中
  14. sel.select(); //全选TextRange中内容
  15. sel.execCommand("Copy");//复制TextRange中内容
  16. oSheet.Paste();//粘贴到活动的EXCEL中
  17. oXL.Visible = true; //设置excel可见属性
  18. var fname = oXL.Application.GetSaveAsFilename("将table导出到excel.xls", "Excel Spreadsheets (*.xls), *.xls");
  19. oWB.SaveAs(fname);
  20. oWB.Close();
  21. oXL.Quit();
  22. }

 

      经过对比,发现这个方法最实用。决定对之进行改进。改进的第一步首先还是阅读源码。

var fname = oXL.Application.GetSaveAsFilename("lmapp_.xls", "Excel Spreadsheets (*.xls), *.xls");

Application.GetSaveAsFilename 方法:简单来说就是显示另存为对话框,方便用户输入文件名进行保存。

  语法:

  expression.GetSaveAsFilename(InitialFilename, FileFilter, FilterIndex, Title, ButtonText)

  expression 必需。该表达式返回Application类型对象

  InitialFilename Variant类型,可选。指定初始的文件名

  FileFilter       Variant类型,可选。一个指定文件筛选条件的字符串,格式如:"文本文件, *.txt"

  FilterIndex  Variant 类型,可选。指定默认文件筛选条件的索引号,取值范围为 1 到 FileFilter 指定的筛选条件数目之间

  Title Variant 类型,可选。指定对话框标题

  ButtonText Variant 类型,可选。仅用于 Macintosh

  使用的时候请注意如下几项:

  1.如果省略InitialFilename参数,Microsoft Excel 将活动工作簿的名称作为初始文件名

  2.如果省略FileFilter参数,则默认参数值为“所有文件 (*.*),*.*”

  3.如果省略FilterIndex参数,或者取值大于可用筛选数目,则采用第一个文件筛选条件

  4.如果省略Title参数,则使用默认标题。

      接着又发现一个怪现象:开发的管理系统可以在Chrome、FireFox等浏览器上运行,但是在IE上却没有任何效果。

      火狐是最严格执行w3c标准的。你在网页中用到了哪些特殊的html, css, js特性,可以先到w3c网站看看这些特性得到了哪些浏览器的支持。

       new ActiveXObject("Excel.Application"); //创建AX对象excel 

      在FireFox中创建对象时报错。解决方法:IE安全级别降低

      ActiveX控制可以调本机的任何资源,可以实现所有可执行文件的功能,但是这个插件,在第一次从网页上载入时,需要从网上下载(自动),并且需要由用户许可后才行.要显示该程序是安全说明,需要向微软申请. 

      更致命的是:ActiveX 仅限IE浏览器中使用。无解决方案!

      但是问题又来了,系统在IE上跑不起来啊!

      备注

      AngularJS 1.3抛弃了对IE8的支持。可以在我们的博客上了解更多内容。AngularJS 1.2将继续支持IE8,但核心团队已经不打算在解决IE8及之前版本的问题上花时间。

而自己恰好使用的就是1.3系列版本,浏览器就是IE8!无语了都,被兼容性搞的头晕目眩。

尝试着使用更高版本的IE浏览器,例如IE9、IE10。

       有一句话意味深长,粘贴,姑且体会之。

      总而言之,使用了angular.js,就仿佛看到了当初W3C标准化组织对web的远景规划:用XML替代html一样。各种操作声明、自定义标签将使DOM操作和应用逻辑解耦,它能大大改善代码的可调性。Angular信奉的是,当组建视图(UI)同时又要写软件逻辑时,声明式的代码会比命令式的代码好得多。

      随着mvvm逐渐成熟,现在使用jQuery构建web应用已经显得过时了,而且使用jQuery需要编写更多的代码去控制dom的取值、赋值、绑定事件等,而mvvm从底层实现了对以上操作的支持,让程序员可以从原始的复杂、重复的编码中解放出来,让程序员可以将更多的重心放在业务的实现、数据的交互上去,而且大大减少了程序员需要编写的代码量。

      多年来的web经验告诉我们,编写web应用最难的地方主要在于浏览器的兼容问题,而且更多的兼容问题主要体现在ie上,因此只要能解决ie上的问题,那么这个web应用的其他问题都不再是问题了。

参考文献:

http://www.storagelab.org.cn/zhangdi/2013/01/08/angular-js%EF%BC%8Cie789%E5%85%BC%E5%AE%B9%E6%80%A7%E7%9A%84%E5%A4%84%E7%90%86/

http://www.oschina.net/translate/angularjs-ie-compatibility

http://www.cnblogs.com/ahl5esoft/p/3872597.html

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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