第一次为创建Excel表格,写入20条数据
第二次用NPOI插入数据,20条。
第三次用NPOI插入数据,20条。
结果:只能显示42行数据,且后面的数据被前面的数据挤没了,发现都是在第三次插入把第一次数据挤没了! 下面是调用NPOI插入数据代码
1 private void DataTableInsertExcel(System.Data.DataTable dt, string saveFileName) 2 { 3 4 int InsertRowIndex = 1;//指定在第几行插入,我们这里测试用第2行,对应NPOI的索引值1,因为从0起 5 int InsertRowCount = 20;//要插入的行数 6 7 8 IWorkbook Workbook = NPOIOpenExcel(saveFileName);//打开工作薄 9 ISheet mySheet = Workbook.GetSheetAt(Workbook.ActiveSheetIndex);//获取工作表 10 IRow mySourceStyleRow = mySheet.GetRow(InsertRowIndex - 1);//获取源格式行 11 12 //调用插入行方法 13 MyInsertRow(mySheet, InsertRowIndex, InsertRowCount, mySourceStyleRow, dt); 14 // WriteToFile(Workbook, saveFileName); 15 MemoryStream ms = new MemoryStream(); 16 Workbook.Write(ms); 17 using (FileStream fs = new FileStream(saveFileName, FileMode.Create, FileAccess.Write)) 18 { 19 byte[] bArr = ms.ToArray(); 20 fs.Write(bArr, 0, bArr.Length); 21 fs.Flush(); 22 fs.Close(); 23 ms.Close(); 24 } 25 file.Close(); 26 27 28 } 29 private IWorkbook NPOIOpenExcel(string FileName) 30 { 31 Stream MyExcelStream = OpenClasspathResource(FileName); 32 33 //MyWorkBook = new HSSFWorkbook(MyExcelStream); 34 35 return new XSSFWorkbook(MyExcelStream); 36 } 37 private Stream OpenClasspathResource(String FileName) 38 { 39 file = new FileStream(FileName, FileMode.Open, FileAccess.Read); 40 return file; 41 } 42 //参数说明 43 //第一个:指定操作的Sheet。 44 //第二个:指定在第几行指入(插入行的位置) 45 //第三个:指定要插入多少行 46 //第四个:源单元格格式的行, 47 private void MyInsertRow(ISheet sheet, int InsertRowIndex, int InsertRowCount, IRow mySourceStyleRow, DataTable dt) 48 { 49 //sheet.ShiftRows(InsertRowIndex, dt.Rows.Count + 1, InsertRowCount, true, false ); 50 sheet.ShiftRows(InsertRowIndex, dt.Rows.Count + 1, InsertRowCount); 51 52 // 对批量移动后空出的空行插,创建相应的行,并以插入行的上一行为格式源(即:插入行-1的那一行) 53 for (int i = InsertRowIndex; i < dt.Rows.Count + 1; i++) 54 { 55 56 ICell sourceCell = null; 57 ICell targetCell = null; 58 IRow targetRow = sheet.CreateRow(i); 59 60 for (int m = mySourceStyleRow.FirstCellNum; m < mySourceStyleRow.LastCellNum; m++) 61 { 62 sourceCell = mySourceStyleRow.GetCell(m); 63 if (sourceCell == null) 64 { 65 continue; 66 } 67 targetCell = targetRow.CreateCell(m); 68 targetCell.CellStyle = sourceCell.CellStyle; 69 targetCell.SetCellType(sourceCell.CellType); 70 targetCell.SetCellValue(dt.Rows[i - 1][m] + ""); 71 } 72 //CopyRow(sourceRow, targetRow); 73 //Util.CopyRow(sheet, sourceRow, targetRow); 74 }
你看下你的行数的增减有没有对的上,一般代码没问题都是行数的问题!
插入方案改为表单的数据最后接着插入即OK
把所有插入的數據改為能識別的有順序的(如:1~60),然後查看插入結果的42行數據的順序,跟你想要的結果有什麽區別,你大概就知道在你代碼的什麽位置出問題了。
能把客户端调用的代码粘出来看看吗?