导出grid panel 数据到Excel

前段时间有个项目需要做导出Excel的功能,后来在网上找到一些文章,但都是1.0版本的,自己改成了2.0版本

前台脚本:

/*
||fomrat: 导出格式(excel, csv, xml)
||grid:要导出的Grid Panel
*/
function doExportData(format, grid) {
    var vExportContent = getGridXml(grid, false);

    if (!Ext.fly('frmDummy')) {
        var frm = document.createElement('form');
        frm.id = 'frmDummy';
        frm.name = 'frmDummy';
        frm.className = 'x-hidden';
        document.body.appendChild(frm);
    }
    Ext.Ajax.useDefaultHeader = false;
    Ext.Ajax.request({
        url: '/Handlers/ExportData.ashx',
        method: 'POST',
        form: Ext.fly('frmDummy'),
        callback: function (o, s, r) {
            alert(r.responseText);
        },
        isUpload: true,
        params: { exportXml: Ext.util.Format.htmlEncode(vExportContent), exportFormat: format }
    });
}
/*
||includeHidden: 包含隐藏列
||grid:要导出的Grid Panel
*/
function getGridXml(grid, includeHidden) {
    var cellType = [];
    var cellTypeClass = [];
    var columns = grid.columns;
    var totalWidthInPixels = 0;
    var headerXml = '';
    var dataXml = '';
    var visibleColumnCountReduction = 0;
    var colCount = columns.length;
    headerXml = "<Columns>";
    for (var i = 0; i < colCount; i++) {
        var col = columns[i];
        if ((col.dataIndex != '')
                && (includeHidden || !col.isHidden())) {
            var w = col.getWidth();
            totalWidthInPixels += w;
            if (col.text === "") {
                cellType.push("None");
                cellTypeClass.push("");
                ++visibleColumnCountReduction;
            }
            else {
                var dataType = '';
                var fld = null;
                var fields = grid.store.model.getFields();
                for (var k = 0, len = fields.length; k < len; k++) {
                    if (col.dataIndex == fields[k].name) {
                        fld = fields[k];
                        break;
                    }
                }
                if (fld != null) {
                    switch (fld.type.type) {
                        case "int":
                            dataType = "Integer";
                            cellType.push("Number");
                            cellTypeClass.push("int");
                            break;
                        case "float":
                            dataType = "Float";
                            cellType.push("Number");
                            cellTypeClass.push("float");
                            break;
                        case "bool":
                        case "boolean":
                            dataType = "String";
                            cellType.push("String");
                            cellTypeClass.push("");
                            break;
                        case "date":
                            dataType = "DateTime";
                            cellType.push("DateTime");
                            cellTypeClass.push("date");
                            break;
                        default:
                            dataType = "String";
                            cellType.push("String");
                            cellTypeClass.push("");
                            break;
                    }
                }
                else {
                    dataType = "String";
                    cellType.push("String");
                    cellTypeClass.push("");
                }
                headerXml += '<Column Name="' + escapeXmlName(col.dataIndex) + '" Header="' + escapeXmlName(col.text) + '" DataType="' + dataType + '" />';
            }
        }
    }
    headerXml += "</Columns>";
    var visibleColumnCount = cellType.length - visibleColumnCountReduction;

    dataXml = '<Records>';
    // Generate the data rows from the data in the Store
    for (var i = 0, it = grid.store.data.items, l = it.length; i < l; i++) {
        dataXml += '<Record>';
        var cellClass = (i & 1) ? 'odd' : 'even';
        r = it[i].data;
        var k = 0;
        for (var j = 0; j < colCount; j++) {
            var col = columns[j];
            if ((col.dataIndex != '')
                    && (includeHidden || !col.isHidden())) {
                var v = r[col.dataIndex];
                if (v == null)
                    v = "";
                if (cellType[k] !== "None") {
                    dataXml += '<' + escapeXmlName(col.dataIndex) + '>';
                    if (cellType[k] == 'DateTime') {
                        dataXml += v.format('Y-m-d H:i:s');
                    } else {
                        dataXml += escapeXml(v);
                    }
                    dataXml += '</' + escapeXmlName(col.dataIndex) + '>';
                }
                k++;
            }
        }
        dataXml += '</Record>';
    }
    dataXml += '</Records>';
    var resultXml = '<ExportData>' + headerXml + dataXml + '</ExportData>';
    return resultXml;
}


后台ashx:


  /// <summary>
    /// Summary description for ExportExcel
    /// </summary>
    public class ExportData : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.AddHeader("Expires", "0");
            context.Response.AddHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
            context.Response.ContentType = "application/force-download";
            context.Response.Charset="UTF-8";
            string exportXml = context.Request["exportXml"];
            string exportFormat = context.Request["exportFormat"];
            string exportData = getExcelData(HttpUtility.HtmlDecode(exportXml));
            switch (exportFormat.ToUpper())
            {
                case "EXCEL":
                    exportData = getExcelData(HttpUtility.HtmlDecode(exportXml));
                    context.Response.AddHeader("Content-type", "application/vnd.ms-excel");
                    context.Response.AddHeader("Content-Disposition", "attachment;filename=\"export.xls\"");
                    break;
                case "CSV":
                    exportData = getCsvData(HttpUtility.HtmlDecode(exportXml));
                    context.Response.AddHeader("Content-type", "text/csv");
                    context.Response.AddHeader("Content-Disposition", "attachment;filename=\"export.csv\"");
                    break;
                case "XML":
                    exportData = getXmlData(HttpUtility.HtmlDecode(exportXml));
                    context.Response.AddHeader("Content-type", "text/xml");
                    context.Response.AddHeader("Content-Disposition", "attachment;filename=\"export.xml\"");
                    break;

            }

            context.Response.Write(exportData);
        }
    
        public string getExcelData(string exportXml)
        {
            StringBuilder sbExportData = new StringBuilder();
            XElement xeExport = XElement.Parse(exportXml);
            var qryExportDefinition = from row in xeExport.Descendants("Column")
                                      select new
                                      {
                                          Name = row.Attribute("Name").Value,
                                          Header = row.Attribute("Header").Value,
                                          DataType = row.Attribute("DataType").Value
                                      };
            sbExportData.Append("<meta http-equiv=\"content-type\" content=\"application/ms-excel; charset=UTF-8\"/>");
            sbExportData.Append("<style>\n<!--");
            sbExportData.Append(".exp_table { font-family:Tahoma,sans-serif,Verdana,Arial; font-size:10pt; }");
            sbExportData.Append(".exp_columnheader { font-family:Tahoma,sans-serif,Verdana,Arial; text-align:center; background:silver;  height:28px}");
            sbExportData.Append(".exp_textdata { mso-number-format:\"\\@\";  height:25px}");
            sbExportData.Append(".exp_datedata { mso-number-format:\"yyyy\\/mm\\/dd\"; text-align:center;  height:25px}");
            sbExportData.Append("td { height:28px }");
            sbExportData.Append("-->\n</style>");
            sbExportData.Append("<table cellpadding=0 cellspacing=0 border=1 class=\"exp_table\">");


            string[] css = new string[qryExportDefinition.Count()];
            int i = 0;
            sbExportData.Append("<tr>");
            foreach (var exportDefinition in qryExportDefinition)
            {
                switch (exportDefinition.DataType)
                {
                    case "String":
                        css[i] = "exp_textdata";
                        break;
                    case "DateTime":
                        css[i] = "exp_datedata";
                        break;
                    default:
                        css[i] = "exp_textdata";
                        break;
                }
                sbExportData.AppendFormat("\t<td class=\"exp_columnheader\">{0}</td>", exportDefinition.Header);
                i++;
            }
            sbExportData.Append("\t</tr>");

            var qryDataRows = from row in xeExport.Descendants("Record")
                              select row;

            foreach (var dataRow in qryDataRows)
            {
                sbExportData.Append("<tr>");
                i = 0;
                foreach (var exportDefinition in qryExportDefinition)
                {
                    string val = dataRow.Element(exportDefinition.Name).Value;
                    switch (exportDefinition.DataType)
                    {
                        case "String":
                            css[i] = "exp_textdata";
                            break;
                        case "DateTime":
                            css[i] = "exp_datedata";
                            break;
                        default:
                            css[i] = String.Empty;
                            break;
                    }
                    sbExportData.AppendFormat("\t<td class=\"{0}\">{1}</td>", css[i], val);
                    i++;
                }
                sbExportData.Append("</tr>");
            }
            sbExportData.Append("</table>");
            return sbExportData.ToString();
        }

        public string getCsvData(string exportXml)
        {
            StringBuilder sbExportData = new StringBuilder();
            XElement xeExport = XElement.Parse(exportXml);
            var qryExportDefinition = from row in xeExport.Descendants("Column")
                                      select new
                                      {
                                          Name = row.Attribute("Name").Value,
                                          Header = row.Attribute("Header").Value,
                                          DataType = row.Attribute("DataType").Value
                                      };


            string[] css = new string[qryExportDefinition.Count()];
            //string[] header = new string[qryExportDefinition.Count()];
            int i = 0;
            foreach (var exportDefinition in qryExportDefinition)
            {
                sbExportData.Append(CsvFomratter(exportDefinition.Header));
                i++;
                if (i < qryExportDefinition.Count())
                    sbExportData.Append(",");
            }
            sbExportData.Append("\n");
            var qryDataRows = from row in xeExport.Descendants("Record")
                              select row;

            foreach (var dataRow in qryDataRows)
            {
                i = 0;
                foreach (var exportDefinition in qryExportDefinition)
                {
                    string val = dataRow.Element(exportDefinition.Name).Value;
                    sbExportData.AppendFormat(CsvFomratter(val));
                    i++;
                    if (i < qryExportDefinition.Count())
                        sbExportData.Append(",");
                }
                sbExportData.Append("\n");
            }
            return sbExportData.ToString();
        }

        public string getXmlData(string exportXml)
        {
            StringBuilder sbExportData = new StringBuilder();
            XElement xeExport = XElement.Parse(exportXml);
            var qryExportDefinition = from row in xeExport.Descendants("Column")
                                      select new
                                      {
                                          Name = row.Attribute("Name").Value,
                                          Header = row.Attribute("Header").Value,
                                          DataType = row.Attribute("DataType").Value
                                      };
            sbExportData.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
            sbExportData.Append("<Records>\n");
            var qryDataRows = from row in xeExport.Descendants("Record")
                              select row;
            foreach (var dataRow in qryDataRows)
            {
                sbExportData.Append("\t<Record>\n");
                foreach (var exportDefinition in qryExportDefinition)
                {
                    string val = dataRow.Element(exportDefinition.Name).Value;
                    sbExportData.AppendFormat("\t\t<{0}>{1}</{0}>\n", XmlFomratter(exportDefinition.Header), XmlFomratter(val));
                }
                sbExportData.Append("\t</Record>\n");
            }
            sbExportData.Append("</Records>\n");
            return sbExportData.ToString();
        }

        private string XmlFomratter(string source)
        {
            XmlDocument doc = new XmlDocument();
            var node = doc.CreateElement("root");
            node.InnerText = source;
            return node.InnerXml;
        }
        private string CsvFomratter(string source)
        {
            if (source.IndexOf(',') > -1)
                return "\"" + source + "\"";
            else
                return source;

        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值