HTML TABLE 转换成Excel多Sheet,C#(补充版)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
arrColIndex[i][x]++; } j+=_sc; } } if (i > 0) { _b = false; while(arrColIndex[i][j]>0){ j++; _b = true; } if (_b) { sXML += ' ss:Index="' + (j + 1) + '"'; } } j++; sXML+=' ss:StyleID="s_col_head">'; sXML+='<Data ss:Type="String">'+$(this).text()+'</Data>'; sXML += '</Cell>\n'; }); sXML += '</Row>\n'; } //tbody
}); });
//将一张报表转换成 Excel 的 XML 格式 var toExcelXmlWorkSheet = function (oReport) {
var oReportBody=oReport.find("table.report"); if(oReportBody.length==0){
alert("无有效报表!"); return false; } if ($("#id_iframe_download").length > 0) { $("#id_iframe_download").remove(); } $("body").append('<iframe id="id_iframe_download" src="to_excel.html?' + (new Date().getTime()) + '" style="width:0;height:0;"></iframe>');
sXML+='<Cell '; var _sc=$(this).attr("rowspan");//跨行 if(typeof(_sc)=="string" && _sc!=""){
_sc = parseInt(_sc) - 1; if (_sc > 0) {
//alert("行 i:"+i+"*SC:"+_sc); sXML += ' ss:MergeDown="' + _sc + '"'; for (var x = i; x <= i + _sc; x++) {
return ""; } var sReport_h1=oReport.find("h1").text(); var sReport_h2=oReport.find("h2").text(); var sReport_notes_1=oReport.find("table.report-notes td:first").text(); var sReport_notes_2=oReport.find("table.report-notes td:last").text(); var nCol=oReport.find("table.report tbody tr:first").children().length; var i, j; var sXML = ""; sXML += '<Row>\n'; sXML += '<Cell ss:MergeAcross="' + (nCol - 1) + '" ss:StyleID="sTitle"><Data ss:Type="String">' + sReport_h1 + '</Data></Cell>\n'; sXML += '</Row>\n'; sXML += '<Row>\n'; sXML += '<Cell ss:MergeAcross="' + (nCol - 1) + '" ss:StyleID="sSTitle"><Data ss:Type="String">' + sReport_h2 + '</Data></Cell>\n'; sXML += '</Row>\n'; sXML += '<Row>\n'; sXML += '<Cell ss:MergeAcross="' + (parseInt(nCol / 2)-1) + '" ss:StyleID="sNote1"><Data ss:Type="String">' + sReport_notes_1 + '</Data></Cell>\n'; sXML += '<Cell ss:MergeAcross="' + (parseInt((nCol+1) / 2)-1) + '" ss:StyleID="sNote2"><Data ss:Type="String">' + sReport_notes_2 + '</Data></Cell>\n'; sXML += '</Row>\n'; var arrColWidth = new Array();//列宽度 //thead var oTR=oReportBody.find("thead tr"); var arrColIndex = new Array();//表头格式矩阵 var _b = false; for(i=0;i<oTR.length;i++){
如上图,打开 xml 文件后,很清晰的看到组织结构, <Style>中定义样式,<Worksheet>是一张工作表 (在 EXCEL 中修改一下 XML 文件,再用文件编辑器打开 XML 就又能看到变化) 因此,具体的方案如下:
文件
使用
to_excel.js
在页面中,将各个报表的 HTML 转换成 XML 格式
});
//footnotes
oReport.find("p.footnotes").each(function () {
if ($(this).text() != "") {
sXML += '<Row>\n';
ቤተ መጻሕፍቲ ባይዱ
sXML += '<Cell ss:MergeAcross="' + (nCol - 1) + '" ss:StyleID="footnotes"><Data
arrColIndex[i]=new Array(); for(j=0;j<nCol;j++){
arrColIndex[i][j] = 0; arrColWidth[j] = 0; //* } } for(i=0;i<oTR.length;i++){ sXML+='<Row>'; j=0; $(oTR[i]).children("th,td").each(function(){
sXML += ' ss:StyleID="' + _style + '"';
sXML += '>';
sXML += '<Data ss:Type="' + _type + '">' + $(this).text() + '</Data>';
sXML += '</Cell>\n';
j++;
});
sXML += '</Row>\n';
为便于说明,以下是页面中报表形式:
显示效果类似:
其中 report-content 有多个,每一个代表一张报表
导出后的结果
------------------------------------------------下面是 JS 文件-------------------------------------------------------jQuery(document).ready(function () {
arrColIndex[x][j]++; } } } _sc=$(this).attr("colspan");//跨列 if(typeof(_sc)=="string" && _sc!=""){ _sc = parseInt(_sc) - 1; if (_sc > 0) { //alert("列 i:" + i + "*SC:" + _sc); sXML += ' ss:MergeAcross="' + _sc + '"'; for(var x=j;x<=j+_sc;x++){
var _style = "", _type = "", _val = "", _class = ""; oTR=oReportBody.find("tbody tr"); oTR.each(function(){
sXML += '<Row>\n'; j = 0; $(this).children("th,td").each(function () {
$("#id_iframe_download").load(function () { var sALL = ""; var i = 0; if (typeof (eval(this.contentWindow.do_download)) == "function") { //f_pop_waitting("正在处理数据..."); data_target.each(function () { sALL += toExcelXmlWorkSheet($(this)); }); this.contentWindow.focus(); this.contentWindow.do_download(sALL,$(".page-title h1").text()); //f_pop_waitting_close("处理结束..."); }
将多个 Table ,导出到一个 Excel 文件中,其中,每一个 Table 作为一个 Sheet
一个小项目,统计几张报表,HTML TABLE 显示在页面中,用标签的方式,要实现把所有报表一次 导出成 Excel 并下载,网上看了些方法,都不完善,索性自己写吧 基本思路:是将 HTML 报表转换成 XML 格式的 EXCEL 存储形式,然后输出给客户端。 先看过用 HTML 格式的 EXCEL,不知道如何实现多 Sheet,放弃;又找到一个 NOPI 的代码,粘 过来有些问题,不愿意研究了,也放弃了;后来,新建了一个两、三个 Sheet 的简单 EXCEL,另 存为 xml,用编辑器打开看了一下,感觉有戏。
to_excel.html to_excel.aspx
当 JS 将 HTML TABLE 等转换成 EXCEL XML 后,用 IFRAME 加载此文件,此文件中 有一个表单,将 EXCEL XML 通过此表单提交到服务器 接收 to_excel.html 提交的数据,组装成完整的 EXCEL XML 返回给客户端下载
///点击页面中的"导出 EXCEL"按钮 $(".f_class_a_expoert_report_excel_all").click(function () {
var data_target = $("div.report-content"); if (data_target.length == 0) {
sXML += '<Cell'; var _sc=$(this).attr("colspan");//报表主体只处理跨列 if (typeof (_sc) == "string" && _sc != "") {
_sc = parseInt(_sc) - 1; if (_sc > 0) {
sXML += ' ss:MergeAcross="' + _sc + '"'; } } _val = $(this).text(); _val_len = _val.replace(/[^\x00-\xff]/g, '__').length+1;//长度,汉字两个 if (_val_len > arrColWidth[j]) { arrColWidth[j] = _val_len; } _class = $(this).attr("class"); if(typeof (_class) != "string"){ _class=""; } _type = _class.toUpperCase() == "NUMBER" ? "Number" : "String"; _style = (this.tagName.toUpperCase() == "TH") ? "s_row_head" : "s_data_" + (_class.toUpperCase() == "GTITLE" ? "gtitle" : _type);
}); });
//将一张报表转换成 Excel 的 XML 格式 var toExcelXmlWorkSheet = function (oReport) {
var oReportBody=oReport.find("table.report"); if(oReportBody.length==0){
alert("无有效报表!"); return false; } if ($("#id_iframe_download").length > 0) { $("#id_iframe_download").remove(); } $("body").append('<iframe id="id_iframe_download" src="to_excel.html?' + (new Date().getTime()) + '" style="width:0;height:0;"></iframe>');
sXML+='<Cell '; var _sc=$(this).attr("rowspan");//跨行 if(typeof(_sc)=="string" && _sc!=""){
_sc = parseInt(_sc) - 1; if (_sc > 0) {
//alert("行 i:"+i+"*SC:"+_sc); sXML += ' ss:MergeDown="' + _sc + '"'; for (var x = i; x <= i + _sc; x++) {
return ""; } var sReport_h1=oReport.find("h1").text(); var sReport_h2=oReport.find("h2").text(); var sReport_notes_1=oReport.find("table.report-notes td:first").text(); var sReport_notes_2=oReport.find("table.report-notes td:last").text(); var nCol=oReport.find("table.report tbody tr:first").children().length; var i, j; var sXML = ""; sXML += '<Row>\n'; sXML += '<Cell ss:MergeAcross="' + (nCol - 1) + '" ss:StyleID="sTitle"><Data ss:Type="String">' + sReport_h1 + '</Data></Cell>\n'; sXML += '</Row>\n'; sXML += '<Row>\n'; sXML += '<Cell ss:MergeAcross="' + (nCol - 1) + '" ss:StyleID="sSTitle"><Data ss:Type="String">' + sReport_h2 + '</Data></Cell>\n'; sXML += '</Row>\n'; sXML += '<Row>\n'; sXML += '<Cell ss:MergeAcross="' + (parseInt(nCol / 2)-1) + '" ss:StyleID="sNote1"><Data ss:Type="String">' + sReport_notes_1 + '</Data></Cell>\n'; sXML += '<Cell ss:MergeAcross="' + (parseInt((nCol+1) / 2)-1) + '" ss:StyleID="sNote2"><Data ss:Type="String">' + sReport_notes_2 + '</Data></Cell>\n'; sXML += '</Row>\n'; var arrColWidth = new Array();//列宽度 //thead var oTR=oReportBody.find("thead tr"); var arrColIndex = new Array();//表头格式矩阵 var _b = false; for(i=0;i<oTR.length;i++){
如上图,打开 xml 文件后,很清晰的看到组织结构, <Style>中定义样式,<Worksheet>是一张工作表 (在 EXCEL 中修改一下 XML 文件,再用文件编辑器打开 XML 就又能看到变化) 因此,具体的方案如下:
文件
使用
to_excel.js
在页面中,将各个报表的 HTML 转换成 XML 格式
});
//footnotes
oReport.find("p.footnotes").each(function () {
if ($(this).text() != "") {
sXML += '<Row>\n';
ቤተ መጻሕፍቲ ባይዱ
sXML += '<Cell ss:MergeAcross="' + (nCol - 1) + '" ss:StyleID="footnotes"><Data
arrColIndex[i]=new Array(); for(j=0;j<nCol;j++){
arrColIndex[i][j] = 0; arrColWidth[j] = 0; //* } } for(i=0;i<oTR.length;i++){ sXML+='<Row>'; j=0; $(oTR[i]).children("th,td").each(function(){
sXML += ' ss:StyleID="' + _style + '"';
sXML += '>';
sXML += '<Data ss:Type="' + _type + '">' + $(this).text() + '</Data>';
sXML += '</Cell>\n';
j++;
});
sXML += '</Row>\n';
为便于说明,以下是页面中报表形式:
显示效果类似:
其中 report-content 有多个,每一个代表一张报表
导出后的结果
------------------------------------------------下面是 JS 文件-------------------------------------------------------jQuery(document).ready(function () {
arrColIndex[x][j]++; } } } _sc=$(this).attr("colspan");//跨列 if(typeof(_sc)=="string" && _sc!=""){ _sc = parseInt(_sc) - 1; if (_sc > 0) { //alert("列 i:" + i + "*SC:" + _sc); sXML += ' ss:MergeAcross="' + _sc + '"'; for(var x=j;x<=j+_sc;x++){
var _style = "", _type = "", _val = "", _class = ""; oTR=oReportBody.find("tbody tr"); oTR.each(function(){
sXML += '<Row>\n'; j = 0; $(this).children("th,td").each(function () {
$("#id_iframe_download").load(function () { var sALL = ""; var i = 0; if (typeof (eval(this.contentWindow.do_download)) == "function") { //f_pop_waitting("正在处理数据..."); data_target.each(function () { sALL += toExcelXmlWorkSheet($(this)); }); this.contentWindow.focus(); this.contentWindow.do_download(sALL,$(".page-title h1").text()); //f_pop_waitting_close("处理结束..."); }
将多个 Table ,导出到一个 Excel 文件中,其中,每一个 Table 作为一个 Sheet
一个小项目,统计几张报表,HTML TABLE 显示在页面中,用标签的方式,要实现把所有报表一次 导出成 Excel 并下载,网上看了些方法,都不完善,索性自己写吧 基本思路:是将 HTML 报表转换成 XML 格式的 EXCEL 存储形式,然后输出给客户端。 先看过用 HTML 格式的 EXCEL,不知道如何实现多 Sheet,放弃;又找到一个 NOPI 的代码,粘 过来有些问题,不愿意研究了,也放弃了;后来,新建了一个两、三个 Sheet 的简单 EXCEL,另 存为 xml,用编辑器打开看了一下,感觉有戏。
to_excel.html to_excel.aspx
当 JS 将 HTML TABLE 等转换成 EXCEL XML 后,用 IFRAME 加载此文件,此文件中 有一个表单,将 EXCEL XML 通过此表单提交到服务器 接收 to_excel.html 提交的数据,组装成完整的 EXCEL XML 返回给客户端下载
///点击页面中的"导出 EXCEL"按钮 $(".f_class_a_expoert_report_excel_all").click(function () {
var data_target = $("div.report-content"); if (data_target.length == 0) {
sXML += '<Cell'; var _sc=$(this).attr("colspan");//报表主体只处理跨列 if (typeof (_sc) == "string" && _sc != "") {
_sc = parseInt(_sc) - 1; if (_sc > 0) {
sXML += ' ss:MergeAcross="' + _sc + '"'; } } _val = $(this).text(); _val_len = _val.replace(/[^\x00-\xff]/g, '__').length+1;//长度,汉字两个 if (_val_len > arrColWidth[j]) { arrColWidth[j] = _val_len; } _class = $(this).attr("class"); if(typeof (_class) != "string"){ _class=""; } _type = _class.toUpperCase() == "NUMBER" ? "Number" : "String"; _style = (this.tagName.toUpperCase() == "TH") ? "s_row_head" : "s_data_" + (_class.toUpperCase() == "GTITLE" ? "gtitle" : _type);