1、 HtmlNode hnPreviousSibling = phnTd.PreviousSibling;4 while (hnPreviousSibling != null & hnPreviousSibling.Name != phnTd.Name)56 hnPreviousSibling = hnPreviousSibling.PreviousSibling;7 8 9 if (hnPreviousSibling != null)1011 int nColSpan = hnPreviousSibling.GetAttributeValue(colspan, 1);12 return Hor
2、izontalDeduction(hnPreviousSibling) + nColSpan;1314 15 return 0;16经过横向推导,各td的X、Y坐标如下图所示:纵向推导(Vertical Deduction)一次纵向推导的过程可以描述为(当前推导td用A表示): 找到A之前的行tr中与A具有相同X坐标的td节点B if (B.rowspan(A.Y-B.Y) X+=B.colspan,即A的X坐标向后推B.colspan的位置 同时,与A同处一tr但在其后边的td节点均应向后推B.colspan个位移对td节点A反复执行这样的一个过程,直到确定A无需再次移动。纵向推导核心代码为
3、:1 bool bActedPush = false;2 3 do4 int nComparedItemIndex = -1; for (int j = i - 1; j = 0; j-)8 if (plstCellsj._nStartX = oCurrentCell._nStartX) nComparedItemIndex = j; break; if (nComparedItemIndex = 0)17 if (plstCellsnComparedItemIndex._nRowSpan (oCurrentCell._nStartY - plstCellsnComparedItemIndex
4、._nStartY)1819 oCurrentCell._nStartX += plstCellsnComparedItemIndex._nColSpan;20 21 bActedPush = true;22 23 for (int k = i + 1; k plstCells.Count; k+)2425 if (plstCellsk._nStartY = oCurrentCell._nStartY)2627 plstCellsk._nStartX += plstCellsnComparedItemIndex._nColSpan;28293031 else3233 bActedPush =
5、false;3435363738394041 while (bActedPush);以示例table中的four td为例,其经过纵向推导过程后的坐标位置情况如下图:关于示例代码的几点说明:1、 在示例代码中,我通过一个Config文件对生成的Excel的文件名、其内报表的内容和位置做了一些控制。基本内容如下: FileNameSample Excel File!-生成Excel的文件名-SheetCount1-Excel中sheet的数量-/BaseInfoTablesExcelTableTableName示例表一-报表名称-WhichSheet/WhichSheet-所在sheet的序号-
6、StartX2-左上角X坐标-StartY/StartY-左上角Y坐标-SourceSample_Page_1.aspx-table所在页面-/ExcelTable/Tables/ExcelDocument2、 在解析html的过程中,我使用了HtmlAgilityPack解析工具。感兴趣的朋友可以研究一下。地址是这里:3、 HtmlAgilityPack解析html的过程中,其将html标签之间的空隙也会看成是一个节点,为内容为空字符串的文本节点,这点大家应注意。4、 该示例代码基本上是一个完整的功能,并且和系统中其他模块耦合度很小。有类似需求的朋友可以拿来直接用。javascript导出e
7、xcel(应用)2008-03-19 15:16:40|分类: 雨天技术 |标签: |字号大中小订阅 div align=rightinput name=exp value=导出页面为EXCEL type=button onclick=tableToExcel() /input type=file name=excelfile导入EXCEL文件readExcel()im/div-TABLE中的内容是JAVASCRIPT自动生成的-table width=100%techTable id= border=0 align=center cellpadding=5 cellspacing=1 bgc
8、olor=D4DBED/tableSCRIPT LANGUAGE=JavaScriptfunction tableToExcel()var rowNum = 0;var oXL = new ActiveXObject(Excel.Application); /创建应该对象 var oWB = oXL.Workbooks.Add();/新建一个Excel工作簿var oSheet = oWB.ActiveSheet;/指定要写入内容的工作表为活动工作表 /var table = pageId;var rows = table.rows.length; / var colSumCols = tab
9、le.rows(0).cells.length;var beginCol = 0;var cols = colSumCols;var rowSpans=1; /行合并var colSpans=1; /列合并oXL.visible = true;oWB.Worksheets(1).Range(B4:D4:F4).ColumnWidth=20; /*表头*/var excRange = oSheet.Range(oSheet.Cells(1,1),oSheet.Cells(1,6);excRange.Merge(true);/获取型号等信息var excelName = %=session.get
10、Attribute(excel)%;excelName = chkrecName+-+excelName+-技术参数excRange.value = excelName;excRange.HorizontalAlignment = 3;/居中 excRange.Font.Name = 黑体rowNum = rowNum+1;/*结束结果设置*/var obj1 = document.getElementById(techTablerowNum = resultToExcel(rowNum, obj1, oSheet, rowNum = rowNum+2;/增加提示,不可以编辑EXCEL的批注v
11、ar excRange2 = oSheet.Range(oSheet.Cells(2,1),oSheet.Cells(2,6);excRange2.Merge(true);excRange2.value = 提示:务必不要编辑下面单元格中批注的内容!否则将无法实现导入!excRange2.HorizontalAlignment = 2;excRange2.Font.Name = 宋体excRange2.Font.Size = 10;tryoWB.SaveAs(c:.xlsoWB.Close;oXL.visible = false;oXL.Quit();alert(文件保存成功!已保存到 C:c
12、atch(e)文件保存失败!function resultToExcel(rowNum, obj, oSheet, tableTile)if(obj=null)return rowNum;var rows = obj.rows.length;var colSumCols = obj.rows(0).cells.length; var beginCol = 0; excRange = oSheet.Range(oSheet.Cells(rowNum+1,1),oSheet.Cells(rowNum+1,colSumCols);excRange.value=tableTile; /寻找列数,考虑到
13、第一行可能存在合并 for (var i=0; i1 ) cols += tmpcolspan-1; /定义2维容器数据,1:行;2:列;值(0 可以填充,1 已被填充) var container=new Array(rows);irows; containeri=new Array(cols); for (j=0;jcols;j+) containerij=0; /将所有单元置为文本,避免非数字列被自动变成科学计数法和丢失前缀的0 oSheet.Range(oSheet.Cells(rowNum+1,1), oSheet.Cells(rowNum+rows,cols).NumberForm
14、at = / Add obj headers going cell by cell./var str= for (i=0;i+)j+) /寻找开始列 for (k=j;k1) /合并 oSheet.Range(oSheet.Cells(i+1+rowNum,beginCol+1), oSheet.Cells(i+1+rowNum,beginCol+colSpans).Merge(); /将当前obj位置填写到对应的容器中 for (k=0; k1) /行合并 oSheet.Range(oSheet.Cells(i+1+rowNum,beginCol+1), oSheet.Cells(i+row
15、Spans+rowNum,beginCol+colSpans).Merge(); for (k=1;rowSpans;k+) /由于第0行已经被colSpans对应的代码填充了,故这里从第1行开始 for (l=0;l=cols) j=cols; catch(e) /字符大小为9 oSheet.Range(oSheet.Cells(rowNum+1,1), oSheet.Cells(rowNum+rows,cols).Font.Size=9; /自动调整列宽 oSheet.Range(oSheet.Cells(1,1), oSheet.Cells(rowNum+rows,cols).Columns.AutoFit(); /自动调整行高 oSheet.Range(oSheet.Cells(rowNum+1,1), oSheet.Cells(rowNum+rows,cols).Rows.AutoFit(); /划边框 oSheet.Range(oSheet.Cells(rowNum+1,1), oSheet.Cells(rowNum+rows,cols).Borders.LineStyle = 1; rowNum = rowNum +rows; return rowNum;function readExcel()
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1