读书人

NPOI控件读EXCEL文件时老是少一行?解

发布时间: 2012-06-06 16:44:11 作者: rapoo

NPOI控件读EXCEL文件时老是少一行?
刚接触NPOI控件,表示很喜欢!

但也遇到问题,特在此向各位前辈请教,100分送上。

刚看了一下
http://msdn.microsoft.com/zh-tw/ee818993.aspx
这篇文章。基础易懂,

但是也发现了一几个问题和疑问!

版本是1.2.4版本!

先是操作类:

C# code
public static Stream RenderDataTableToExcel(DataTable SourceTable)    {        HSSFWorkbook workbook = new HSSFWorkbook();        MemoryStream ms = new MemoryStream();        ISheet sheet = workbook.CreateSheet();        IRow headerRow = sheet.CreateRow(0);        // handling header.        foreach (DataColumn column in SourceTable.Columns)            headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);        // handling value.        int rowIndex = 1;        foreach (DataRow row in SourceTable.Rows)        {            IRow dataRow = sheet.CreateRow(rowIndex);            foreach (DataColumn column in SourceTable.Columns)            {                dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());            }            rowIndex++;        }        workbook.Write(ms);        ms.Flush();        ms.Position = 0;        sheet = null;        headerRow = null;        workbook = null;        return ms;    }    public static void RenderDataTableToExcel(DataTable SourceTable, string FileName)    {        MemoryStream ms = RenderDataTableToExcel(SourceTable) as MemoryStream;        FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write);        byte[] data = ms.ToArray();        fs.Write(data, 0, data.Length);        fs.Flush();        fs.Close();        data = null;        ms = null;        fs = null;    }    public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, string SheetName, int HeaderRowIndex)    {        HSSFWorkbook workbook = new HSSFWorkbook(ExcelFileStream);        ISheet sheet = workbook.GetSheet(SheetName);        DataTable table = new DataTable();        IRow headerRow = sheet.GetRow(HeaderRowIndex);        int cellCount = headerRow.LastCellNum;        for (int i = headerRow.FirstCellNum; i < cellCount; i++)        {            DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);            table.Columns.Add(column);        }        int rowCount = sheet.LastRowNum;        for (int i = (sheet.FirstRowNum + 1); i < sheet.LastRowNum; i++)        {            IRow row = sheet.GetRow(i);            DataRow dataRow = table.NewRow();            for (int j = row.FirstCellNum; j < cellCount; j++)                if (row.GetCell(j) != null)                dataRow[j] = row.GetCell(j).ToString();        }        ExcelFileStream.Close();        workbook = null;        sheet = null;        return table;    }    public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, int SheetIndex, int HeaderRowIndex)    {        HSSFWorkbook workbook = new HSSFWorkbook(ExcelFileStream);        ISheet sheet = workbook.GetSheetAt(SheetIndex);        DataTable table = new DataTable();        IRow headerRow = sheet.GetRow(HeaderRowIndex);        int cellCount = headerRow.LastCellNum;        for (int i = headerRow.FirstCellNum; i < cellCount; i++)        {            DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);            table.Columns.Add(column);        }        int rowCount = sheet.LastRowNum;        for (int i = (sheet.FirstRowNum + 1); i < sheet.LastRowNum; i++)        {            IRow row = sheet.GetRow(i);            DataRow dataRow = table.NewRow();            for (int j = row.FirstCellNum; j < cellCount; j++)            {                if (row.GetCell(j) != null)                    dataRow[j] = row.GetCell(j).ToString();            }            table.Rows.Add(dataRow);        }        ExcelFileStream.Close();        workbook = null;        sheet = null;        return table;    }




一,
选择本地文件显示到GRIDVIEW的时候。老是少一行呢?
C# code
protected void Button3_Click(object sender, EventArgs e)    {        if (this.FileUpload1.HasFile)        {            DataTable table = ExcelHelper.RenderDataTableFromExcel(this.FileUpload1.FileContent, 0, 0);            this.GridView1.DataSource = table;            this.GridView1.DataBind();        }    }


如果第一行是标头的话。下面有五行记录,读出来的一直是4条。永远少一条?!



二,

我读取了数据库中的内容,返回DATATABLE导出到EXCEL的时候,如何将导出的EXCEL的标头设置自己想要的显示文字
默认的是数据库里表的字段名

C# code
protected void Button2_Click(object sender, EventArgs e)    {        DataTable table = new DataTable();        // 填充料(由者自行撰)        // 生 Excel 料流。        MemoryStream ms = ExcelHelper.RenderDataTableToExcel(table) as MemoryStream;        // 定制下。        Response.AddHeader("Content-Disposition", string.Format("attachment; filename=Download.xls"));        // 出案。        Response.BinaryWrite(ms.ToArray());        ms.Close();        ms.Dispose();    }



三,

读取EXCEL,然后循环添加到数据库这个没问题,

如果读取EXCEL。然后更新数据库中对应的值。怎么实现呢?

比如表A中有字段
ID
NAME
OLD

EXCEL中。也有这三列,
EID
ENAME
EOLD

希望根据EXCEL中EID更新EOLD到数据库中OLD字段,这个怎么实现呢?

[解决办法]
嗯,不错,表示简单的用过一次,强力推荐,不过楼主的这个问题倒是没有遇到过,顶起!!!
[解决办法]
顶啊。同求解决办法!
[解决办法]
到官方里的QQ群问问有没有人遇到同样的问题。。。
[解决办法]
接分来了.

for (int i = (sheet.FirstRowNum + 1); i < sheet.LastRowNum; i++)

改为

for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)

读书人网 >asp.net

热点推荐