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++)