C#使用NPOI工具 ,插入数据到Excel中,第三次插入的时候为何失败!
2016-01-29 来自:左圈&圈 4 人回应

第一次为创建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             }
2016-01-29 来自:kathydodo

能把客户端调用的代码粘出来看看吗?

2016-01-29 来自:赠品是银条喔

插入方案改为表单的数据最后接着插入即OK

2016-01-29 来自:狐狸爸爸

你看下你的行数的增减有没有对的上,一般代码没问题都是行数的问题!

2016-01-29 来自:、Exㄟ

把所有插入的數據改為能識別的有順序的(如:1~60),然後查看插入結果的42行數據的順序,跟你想要的結果有什麽區別,你大概就知道在你代碼的什麽位置出問題了。

您的回应

你还未登陆,不能回应!登陆