NPOI使用手册[转] (34)

  其实基本思想也很简单,就是通过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方法代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwwpg.html