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. asp.net使用session完成: 从哪个页面进入登录页面,登录成功还回到那个页面

    1.在Login.aspx页面Load中加入 if (!IsPostBack && Request.UrlReferrer != null) {      Session[ " ...

  2. Node.js 实用工具

    稳定性: 4 - 锁定 这些函数都在'util' 模块里.使用 require('util') 来访问他们. util 模块原先设计的初衷是用来支持 node 的内部 API 的.这里的很多的函数对你 ...

  3. 从输入url到页面返回到底发生了什么

    1. 前言 Google应该是开发者平日里用得最多的网站之一,今早笔者在浏览器地址栏里键入www.google.com的时候,突然想了解下这背后的网络通信过程究竟是怎么样的.毕竟自己也算是一名Web开 ...

  4. Python教学相关资料

    Python教学调查链接 一.专题 1.绘图 如何开始使用Python来画图 Python画图总结 2.科学计算与数据分析 3.可视化 4.网络爬虫 5. 做笔记 Python-Jupyter Not ...

  5. Android Support库——support annotations

    Android Support库是官方出的支持扩展库,包含了丰富的组件.工具类等,通过在Android SDK Manager中勾选以下两项来获取到. 其中,Android Support Libra ...

  6. 潜谈IT从业人员在传统IT和互联网之间的择业问题(上)-传统乙方形公司

    外包能去吗?项目型公司如何?甲方比乙方好?互联网公司就一定好吗? 相信许多从业者在经历了3-5年的工作期后都会带着这样的疑问或者疑惑. 2012年-2014年间,曾经面试过500人,亲身面试的也有15 ...

  7. Web自动化框架LazyUI使用手册(3)--单个xpath抓取插件详解(selenium元素抓取,有此插件,便再无所求!)

    概述 前面的一篇博文粗略介绍了基于lazyUI的第一个demo,本文将详细描述此工具的设计和使用. 元素获取插件:LazyUI Elements Extractor,作为Chrome插件,用于抓取页面 ...

  8. property干嘛的

    >>> import datetime >>> class c(): @property def noww(self): return datetime.datet ...

  9. Redis 学习笔记1:CentOS 6.7下安装Redis

    在linux环境搭建Redis环境,首先从官网(http://redis.io/)下载Redis 版本,本人使用的3.21版本. 1. 将redis 解压到  /usr/local目录下. [root ...

  10. 22 Notification样式设置内部按钮点击事件

    package com.exam1ple.demo1; import android.app.Activity; import android.app.NotificationManager; imp ...