/// <summary>
/// 获取Table某个TD合并的列数和行数等信息。与Excel中对应Cell的合并行数和列数一致。
/// </summary>
/// <param name="rowIndex">行号</param>
/// <param name="colIndex">列号</param>
/// <param name="colspan">TD中需要合并的行数</param>
/// <param name="rowspan">TD中需要合并的列数</param>
/// <param name="rowspan">此单元格是否被某个行合并包含在内。如果被包含在内,将不输出TD。</param>
/// <returns></returns>
private void GetTdMergedInfo(int rowIndex, int colIndex, out int colspan, out int rowspan, out bool isByRowMerged)
{
colspan = 1;
rowspan = 1;
isByRowMerged = false;
int regionsCuont = sht.NumMergedRegions;
Region region;
for (int i = 0; i < regionsCuont; i++)
{
region = sht.GetMergedRegionAt(i);
if (region.RowFrom == rowIndex && region.ColumnFrom == colIndex)
{
colspan = region.ColumnTo - region.ColumnFrom + 1;
rowspan = region.RowTo - region.RowFrom + 1;
return;
}
else if (rowIndex > region.RowFrom && rowIndex <= region.RowTo && colIndex>=region.ColumnFrom && colIndex<=region.ColumnTo)
{
isByRowMerged = true;
}
}
}
最后在apsx页面中输出构建好的Table:
<%=excelContent %>
执行效果如下:
我们发现,与Excel中的布局完全一样(这里没有处理单元格的样式,只处理了内容,有兴趣的读者也可以将Excel中单元格的样式也应用在HTML中)。这里为保证布局一致,主要是将Excel中的Region信息解析成Table的colSpan和rowSpan属性,如果对这两个属性不太了解,可以结合以下代码和示例加以了解:
<table width="300px" border="1px">
<tr>
<td colspan="2" rowspan="2">0,0</td>
<td>0,3</td>
</tr>
<tr>
<td>1,3</td>
</tr>
<tr>
<td rowspan="2">2,0</td>
<td colspan="2">2,1</td>
</tr>
<tr>
<td>3,1</td>
<td>3,2</td>
</tr>
</table>
以上HTML代码对应的Table展现为:
3.5用NPOI操作EXCEL--巧妙使用Excel Chart
在NPOI中,本身并不支持Chart等高级对象的创建,但通过l模板的方式可以巧妙地利用Excel强大的透视和图表功能,请看以下例子。
首先建立模板文件,定义两列以及指向此区域的名称“sales”:
创建数据表,数据来源填入刚才定义的区域:
最后生成的数据透视表所在Sheet的样式如下: