首页 新闻 会员 周边

C#使用NPOI工具 ,插入数据到Excel中,第三次插入的时候为何失败!

0
悬赏园豆:200 [待解决问题]

第一次为创建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             }
lzh20151的主页 lzh20151 | 初学一级 | 园豆:4
提问于:2015-12-08 15:10
< >
分享
所有回答(4)
0

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

搁忆 | 园豆:612 (小虾三级) | 2015-12-08 16:44
0

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

lzh20151 | 园豆:4 (初学一级) | 2015-12-08 17:57
0

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

明Lam | 园豆:615 (小虾三级) | 2015-12-09 10:43
0

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

火悬崖 | 园豆:434 (菜鸟二级) | 2015-12-10 10:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册