其实基本思想也很简单,就是通过NPOI读取每个Cell中的内容,然后以HTML的形式输出。但要保证输出的HTML页面布局与Excel中的一致,还有点小技巧。下面是构造Table的代码:
private HSSFSheet sht;
protected String excelContent;
protected void Page_Load(object sender, EventArgs e)
{
HSSFWorkbook wb = new HSSFWorkbook(new FileStream(Server.MapPath("App_Data/quotation.xls"), FileMode.Open));
sht = wb.GetSheet("Sheet1");
//取行Excel的最大行数
int rowsCount = sht.PhysicalNumberOfRows;
//为保证Table布局与Excel一样,这里应该取所有行中的最大列数(需要遍历整个Sheet)。
//为少一交全Excel遍历,提高性能,我们可以人为把第0行的列数调整至所有行中的最大列数。
int colsCount = sht.GetRow(0).PhysicalNumberOfCells;
int colSpan;
int rowSpan;
bool isByRowMerged;
StringBuilder table = new StringBuilder(rowsCount * 32);
table.Append("<table border=\'1px\'>");
for (int rowIndex = 0; rowIndex < rowsCount; rowIndex++)
{
table.Append("<tr>");
for (int colIndex = 0; colIndex < colsCount; colIndex++)
{
GetTdMergedInfo(rowIndex, colIndex, out colSpan, out rowSpan, out isByRowMerged);
//如果已经被行合并包含进去了就不输出TD了。
//注意被合并的行或列不输出的处理方式不一样,见下面一处的注释说明了列合并后不输出TD的处理方式。
if (isByRowMerged)
{
continue;
}
table.Append("<td");
if (colSpan > 1)
table.Append(string.Format(" colSpan={0}", colSpan));
if (rowSpan > 1)
table.Append(string.Format(" rowSpan={0}", rowSpan));
table.Append(">");
table.Append(sht.GetRow(rowIndex).GetCell(colIndex));
//列被合并之后此行将少输出colSpan-1个TD。
if (colSpan > 1)
colIndex += colSpan - 1;
table.Append("</td>");
}
table.Append("</tr>");
}
table.Append("</table>");
this.excelContent = table.ToString();
}
其中用到的GetTdMergedInfo方法代码如下: