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

前言

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

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

<script>
(function(){
    document.getElementById("saveBtn").onclick = function(event){
        event.preventDefault();
        var BB = self.Blob;
        saveAs(
              new BB(
                  ["\ufeff" + document.getElementById("content").value] //\ufeff防止utf8 bom防止中文乱码
                , {type: "text/plain;charset=utf8"}
            )
            , document.getElementById("filename").value
        );
    };
})();
</script>

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

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

获取结果如下:

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

解析代码如下:

      var content = document.getElementById("sunny").innerHTML;
//        alert(content);
        var contentText = "药品名,药品ID,价格(元),数量(盒),下单时间,订单ID,订单内容,购药者,处方药,药品种类\n";
        var obj = JSON.parse(content); // 由JSON字符串转换为JSON对象
//        alert(obj.length);
        var billDtl = '';
        for(k=0; k<obj.length; k++){
        	var bill = obj[k];
        	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);
        	}
        	billDtl += bill.medname + "," + bill.medid + "," + bill.medprice + "," + bill.sellcnt + "," + bill.tx_time + "," + bill.billid + ","
        	+ content + "," + bill.buy_uid + "," + bill.iscf + "," + bill.medtype + "\n";
        }
        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可实现导出功能,唯一的缺陷就是不存在文件命名,存储位置选择的对话框。

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

<span style="color:#ff0000;">(function (){
Downloadify.create('downloadify',{
    filename: function(){
      //return document.getElementById('filename').value;
      return "Sunny.csv";
    },
    data: function(){
        var content = document.getElementById("sunny").innerHTML;
//        alert(content);
        var contentText = "药品名,药品ID,价格(元),数量(盒),下单时间,订单ID,订单内容,购药者,处方药,药品种类\n";
        var obj = JSON.parse(content); // 由JSON字符串转换为JSON对象
//        alert(obj.length);
        var billDtl = '';
        for(k=0; k<obj.length; k++){
        	var bill = obj[k];
        	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";
        }
        alert(billDtl);
        return "\ufeff" + contentText + billDtl;
    },
    onComplete: function(){
      alert('保存成功!');
    },
    onCancel: function(){
    },
    onError: function(){
      alert('保存失败!');
    },
    transparent: false,
    swf: 'img/downloadify.swf',
    downloadImage: 'img/download.png',
    width: 100,
    height: 30,
    transparent: true,
    append: false
  });
})();</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/

有图有真相

美文美图

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

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

    js如何将html表格导出为excel文件        赠人玫瑰,手留余香.若您感觉此篇博文对您有用,请花费2秒时间点个赞,您的鼓励是我不断前进的动力,共勉! jsp页面数据导出成excel的方法很 ...

  2. 网站开发进阶(三十五)JSP页面中的pageEncoding和contentType两种属性

    JSP页面中的pageEncoding和contentType两种属性 本文介绍了在JSP页面中经常用的两种属性,分别是pageEncoding和contentType,希望对你有帮助,一起来看. 关 ...

  3. 网站开发进阶(三十八)Web前端开发规范文档你需要知道的事

    Web前端开发规范文档你需要知道的事 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进 ...

  4. 网站开发进阶(十四)JS实现二维码生成

    JS实现二维码生成 绪 项目开发原语:已然花费半天的时间,仍旧未能将二维码显示在订单中.但是可以在单个页面中显示二维码,结合到angularjs的控制器中就失效了,自己是真的找不到其中的原因了.费解! ...

  5. 网站开发进阶(十二)JS实现打印功能(包括打印预览、打印设置等)

    JS实现打印功能(包括打印预览.打印设置等) 绪 最近在进行项目开发时,需要实现后台管理端打印功能,遂在网上一阵搜索,搜到了很多相关的文章.其中绝大部分文章都是使用的Lodop5.0(Web打印和套打 ...

  6. 网站开发进阶(三十七)JSP页面跳转问题解决

    JSP页面跳转问题解决 PS:本篇博文质量欠佳,仅供个人学习之用. 前言 在做Web开发时,对别人的应用(jsp+servlet)进行服务器部署时出现了页面跳转无效的情况.但是项目在本地未出现此状况. ...

  7. 网站开发进阶(三十六)String.getBytes()方法中的中文编码问题

    String.getBytes()方法中的中文编码问题 String的getBytes()方法是得到一个系统默认的编码格式的字节数组. getBytes("utf-8")得到一个U ...

  8. 网站开发进阶(三十四)编码中的setCharacterEncoding 理解

    编码中的setCharacterEncoding 理解 1.pageEncoding="UTF-8"的作用是设置JSP编译成Servlet时使用的编码. 2.contentType ...

  9. 网站开发进阶(三十)HTML5--本地存储Web Storage

    HTML5--本地存储Web Storage Web Storage功能,顾名思义,就是在Web上针对客户端本地储存数据的功能,具体来说Web Storage分为两种: sessionStorage: ...

随机推荐

  1. Ubuntu 16.04.4 LTS下安装JDK

    写在前面 为什么我又装jdk?今天顺手升级了我的双系统中的ubuntu,开始的时候用的图形化界面升级,后来你懂的,升级软件死锁了.. 用命令行也没有效果了,提示锁被占用,手残重启试试,彻底崩了...我 ...

  2. MySQL系列教程(四)

    文件打开数(open_files) 我们现在处理MySQL故障时,发现当Open_files大于open_files_limit值时,MySQL数据库就会发生卡住的现象,导致Nginx服务器打不开相应 ...

  3. [Boost] 1.57.0 with VS2013 + Intel compiler

    The compiled version can be found below. Do not foget to give me a star. :) http://pan.baidu.com/s/1 ...

  4. CoreText精彩文字轮廓绘制动画的一点改进

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 原文在: http://oleb.net/blog/2010/ ...

  5. [Flask]学习杂记一 Hello程序

    这几天买了本  <Flask Web开发:基于Python的Web应用开发实战>,之前也用过flask 但是不怎么系统,有时候需要搭建一些临时的测试服务,用falsk比较方面,一个文件就可 ...

  6. android 集成微博常见问题

    我们在做微博集成登录.分享.聊天的时候,肯定会遇到很多的坑,这里总结下常见的问题. 文件不存在 C8998 的解决方法 如图我们走微博授权登录的时候如果OAuth2.0 授权设置回调页面设置和本地的不 ...

  7. Linux Debugging (九) 一次生产环境下的“内存泄露”

    一个偶然的机会,发现一个进程使用了超过14G的内存.这个进程是一个RPC server,只是作为中转,绝对不应该使用这么多内存的.即使并发量太多,存在内存中的数据太多,那么在并发减少的情况下,这个内存 ...

  8. 剑指Offer——分治算法

    剑指Offer--分治算法 基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更 ...

  9. Socket层实现系列 — send()类发送函数的实现

    主要内容:socket发送函数的系统调用.Socket层实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 发送流程图 以下是send().sendt ...

  10. XML Schema

    XML Schema 是基于 XML 的 DTD 替代者. XML Schema 描述 XML 文档的结构. XML Schema 语言也称作 XMLSchema 定义(XML Schema Defi ...