jqgrid导出CSV

来源:互联网 发布:tensorflow pdf下载 编辑:程序博客网 时间:2024/06/08 01:54

       最近一直在弄jqgrid,都是准备在新的项目上的难点。在此过程中遇到了jqgrid需要导出数据至csv,在网上查找了各种资料,没有现成的样例,网上只有导出当前页面上的表格,而项目需要导出所有的数据,所以只有自己在前辈的基础上修改了

以下代码根据网上js导出csv修改而成

$("#del").click(function () {        var title = "人员信息";        var array = new Array();        //alert($("thead").html());查看jqgrid形成的table的html样子$("th").each(function (i, item) {//遍历jqgrid表头 var idTemp = $(item).attr("id");//获取表头的字段,显示时是如list2_name,其中list2为table的id  if ($("#" + idTemp).css("display") != "none") {//获取显示的字段和列名,由于此项目可以让客户配置列的显示和顺序,所以导出数据时也要判断哪些列需要导出,哪些不需要导出 var id = idTemp.replace("list2_", "");                var colName = $(item).text();                var obj = colName + "," + id;                array.push(obj);            }        });        $.ajax({//获取返回的json数据,data是传递后台所需要查询的字段    type: "POST",            url: "Account/Export",            data: { "ID": "id", "UserNo": "userNo", "Name": "Name", "Password": "Password", "Email": "Email" },            dataType: "json",            success: function (data) {                getXlsFromTbl(array, data, title)            }        });                    });    function getXlsFromTbl(array, data, title) {        try {            var allStr = "";            var curStr = "";            if (array != null && data != null) {                curStr = getTblData(array, data, title);            }             if (curStr != null) {                allStr += curStr;            } else {                alert("你要导出的表不存在!");                return;            }                        var fileName = getExcelFileName(title);            doFileExport(fileName, allStr);        }        catch (e) {            alert("导出发生异常:" + e.name + "->" + e.description + "!");        }    }
function getTblData(array, data, title) {        var outStr = "";        for (i = 0; i < array.length; i++) {//这里是写入列名,即在页面上显示的名称            var temp=(array[i].split(','))[0];            if (temp != null && temp != "") {                outStr += temp + "\t";            }        }        outStr += "\r\n";        for (i = 0; i < data.length; i++) {//这里是界面上的字段和返回的json中的数据字段匹配,匹配的就是界面要求显示的,不匹配的就不输出            var dataObj = data[i];            for (j = 0; j < array.length; j++) {                for (var temp in dataObj) {                    if (temp == (array[j].split(','))[1]) {                        outStr += dataObj[temp] + "\t";                    }                }            }            outStr += "\r\n";        }        return outStr;    }    function getExcelFileName(title) {        var d = new Date();        var curYear = d.getYear();        var curMonth = "" + (d.getMonth() + 1);        var curDate = "" + d.getDate();        var curHour = "" + d.getHours();        var curMinute = "" + d.getMinutes();        var curSecond = "" + d.getSeconds();        if (curMonth.length == 1) {            curMonth = "0" + curMonth;        }        if (curDate.length == 1) {            curDate = "0" + curDate;        }        if (curHour.length == 1) {            curHour = "0" + curHour;        }        if (curMinute.length == 1) {            curMinute = "0" + curMinute;        }        if (curSecond.length == 1) {            curSecond = "0" + curSecond;        }        var fileName = title + "_" + curYear + curMonth + curDate + "_"            + curHour + curMinute + curSecond + ".csv";        //alert(fileName);         return fileName;    }    function doFileExport(inName, inStr) {//这段是抄袭网上的,在html中一定要有<iframe id="HideFrm" style="display: none"></iframe>         var xlsWin = null;        if (!!document.all("HideFrm")) {            xlsWin = HideFrm;        }        else {            var width = 6;            var height = 4;            var openPara = "left=" + (window.screen.width / 2 - width / 2)                + ",top=" + (window.screen.height / 2 - height / 2)                + ",scrollbars=no,width=" + width + ",height=" + height;            xlsWin = window.open("", "_blank", openPara);        }        xlsWin.document.write(inStr);        xlsWin.document.close();              xlsWin.document.execCommand('Saveas', false, inName);//这儿方法看了很久,没有找到具体参数的意义xlsWin.close();}    

这段js能实现导出csv形式的文件,但只是形似。通过比较,一般的csv文件是以逗号分隔开,而且编码格式是ANSI,但以上导出的是以空格分隔开,编码格式是以UNICODE所以说只能说是形似。由于本项目需要导出后再导入进去,所以需要标准的csv格式,就需要想另一种方法保存。

function doFileExport(inName, inStr) {//这段是抄袭网上的,在html中一定要有<iframe id="HideFrm" style="display: none"></iframe>         var file_name=window.prompt("请指定输出文件名称(.txt)","C://ExportTxt.txt");        file_name=file_name.split("//").join("////");        alert(inStr);        var FSO=new ActiveXObject("Scripting.FileSystemObject");        var f1 = FSO.CreateTextFile("c:\\testfile.csv", true);         f1.write(inStr);         f1.close();    } 

以上运行会发现报参数错误的问题,在网上找FSO.CreateTextFile的方法也没找到能使我理解什么地方出的问题(是由于字符串空格造成的原因),最后经过调试,发现是由于形成字符串的表头有问题,不知道是空格的原因还是什么情况,把表头那字符串去掉就能正常形成标准的csv文件(当如,字符串的空格分隔符都换成逗号才行)

最后在想到由于导入还需要操作,把导入和导出都写在前台似乎太不安全了,于是确定都写到后台去,只是把以上的js方法保留下来,供以后的朋友少走弯路!

目前导出改成在后台进行,把前台的列顺序,可见列的列名及列值传到后台,在后台先生成csv文件,再通过下载到客户端电脑,以下是下载文件到客户端电脑的方法

一.public FilePathResult GetFileFromDisk()//此方法不能下载后删除源文件
        {
            string path = @"C:\Users\jiangxk\Desktop\";
            string fileName = "20120801_095853.csv";
            return File(path + fileName, "text/plain", "20120801_101039.csv");//或者return File(new FileStream(path+fileName, FileMode.Open), "application/octet-stream", Server.UrlEncode(fileName));
        }

或者

二.FileInfo file = new FileInfo(filePath);//此方法能删除源文件
                Response.Clear(); //清除缓冲区流中的所有内容输出
                Response.ClearHeaders(); //清除缓冲区流中的所有头,不知道为什么,不写这句会显示错误页面
                Response.ClearContent();
                Response.Buffer = true;//设置缓冲输出为false
                //设置输出流的 HTTP MIME 类型为application/octet-stream
                Response.ContentType = "application/octet-stream";
                //将 HTTP 头添加到输出流
                Response.AppendHeader("Content-Disposition", "attachment;filename=" + DateTime.Now.ToString("yyyMMdd_hhmmss") + ".csv");
                Response.AppendHeader("Content-Length", file.Length.ToString());
                //将指定的文件直接写入 HTTP 内容输出流。
                //一定要注意是WriteFile不是Write
                Response.WriteFile(file.FullName);
                Response.Flush();        //向客户端发送当前所有缓冲的输出
                Response.End();

                 file.Delete();//删除源文件