如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
所见即所得的Excel报表生成(二)——从Htmltable到ExcelCell时间:2011-06-1420:42来源:未知作者:admin点击:104次在上一篇文章中,已经解决了如何获取htmltable结构的问题。在本篇文章中,我们着力于table结构的解析。Htmltable的结构我们大家都很熟悉,那么在另一端如何构造一个结构,让Excel可以很好的接受和处理呢?直观的看,一个完整Excel的内容是由位于各个单元在上一篇文章中,已经解决了如何获取htmltable结构的问题。在本篇文章中,我们着力于table结构的解析。Htmltable的结构我们大家都很熟悉,那么在另一端如何构造一个结构,让Excel可以很好的接受和处理呢?直观的看,一个完整Excel的内容是由位于各个单元格(Cell)中的内容组合而成的。而每个单元格(Cell)都有相应X、Y坐标来标示其位置。也就是说,一个Excel文件实质上就是许多Cell构成的集合,每个Cell用坐标属性确定位置,用内容属性存储内容。基于此,我设计了最基本的Cell结构:◆X坐标◆Y坐标◆合并列情况◆合并行情况◆内容构成Excel的最基本的结构已经确定,下一步摆在我们面前的就是将htmltable转化为ExcelCell集合。Htmltable中的每个td节点对应一个Excel单元格,其内容不必说,行、列的合并情况也自可由td的rowspan、colspan属性得出,转化的关键点就在于由table的trtd结构定位Excel单元格位置,即X、Y坐标。Y坐标容易确定,即td所在tr的行数。至于一td的X坐标,其要受到两方面因素的影响:与该td同处一tr,但位于其之前(反映在表格视觉上即其左侧td)td的占位情况和该td所在tr的之前tr中某些td的跨行情况。基于此种考虑,定位td的X坐标需经过两个过程的推导:用于处理左侧td占位影响的横向推导(HorizontalDeduction)和处理之前行跨行td影响的纵向推导(VerticalDeduction)。以下图所示table为例,展示两次推导过程。横向推导(HorizontalDeduction)一次横向推导(HorizontalDeduction)限定在一tr范围内。整个过程基于递归的原理,递归模型如下:核心代码为:1privateintHorizontalDeduction(HtmlNodephnTd)2{3HtmlNodehnPreviousSibling=phnTd.PreviousSibling;4while(hnPreviousSibling!=null&&hnPreviousSibling.Name!=phnTd.Name)5{6hnPreviousSibling=hnPreviousSibling.PreviousSibling;7}89if(hnPreviousSibling!=null)10{11intnColSpan=hnPreviousSibling.GetAttributeValue("colspan",1);12returnHorizontalDeduction(hnPreviousSibling)+nColSpan;13}1415return0;16}经过横向推导,各td的X、Y坐标如下图所示:纵向推导(VerticalDeduction)一次纵向推导的过程可以描述为(当前推导td用A表示):找到A之前的行tr中与A具有相同X坐标的td节点Bif(B.rowspan>(A.Y-B.Y)){X+=B.colspan,即A的X坐标向后推B.colspan的位置同时,与A同处一tr但在其后边的td节点均应向后推B.colspan个位移}对td节点A反复执行这样的一个过程,直到确定A无需再次移动。纵向推导核心代码为:1boolbActedPush=false;23do4{5intnComparedItemIndex=-1;6for(intj=i-1;j>=0;j--)7{8if(plstCells[j]._nStartX==oCurrentCell._nStartX)9{10nComparedItemIndex=j;11break;12}13}1415if(nComparedItemIndex>=0)16{17if(plstCells[nComparedItemIndex]._nRowSpan>(oCurrentCell._nStartY-plstCells[nComparedItemIndex]._nStartY))18{19oCurrentCell._nStartX+=plstCells[nComparedItemIndex]._nC