npoi 删除多行 操作excel_使用NPOI导出Excel ICell调用过剩 内存溢出

使用NPOI导出六万多行Excel时遇到内存溢出问题,通过调整代码实现每次只处理一部分数据,或者切换到xlsx格式以支持更多数据,或者分多个工作簿存储来避免内存溢出。建议每处理1000行数据后保存并释放资源。
摘要由CSDN通过智能技术生成

使用NPOI导出Excel ICell调用过多 内存溢出

使用NPOI导出Excel ICell调用过多 内存溢出

datagridview一共有七十多列、六万多行   进行到四万多行的时候就提示'引发类型为“System.OutOfMemoryException”的异常。'

求高手帮忙看下

private void button3_Click(object sender, EventArgs e)

{

if (dgExcel.Rows.Count > 0)

{

SaveFileDialog save = new SaveFileDialog();

save.Filter = "xls文件|*.xls|所有文件|*.*";

save.FileName = "Demo.xls";

if (save.ShowDialog() == DialogResult.OK)

{

int irow = dgExcel.Rows.Count;

int n = (irow + 30000 - 1) / 30000;

using (HSSFWorkbook workbook = new HSSFWorkbook())

{

for (int i = 1; i <= n; i++)

{

if (i == n)

OutIntoExcel(workbook, i, i * 30000 - 30000, irow - 1);

else

OutIntoExcel(workbook, i, i * 30000 - 30000, i * 30000 - 1);

}

FileStream file = new FileStream(save.FileName, FileMode.Create);

workbook.Write(file);

file.Close();

}

MessageBox.Show("数据导出成功,请查看!", "数据导出", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

}

}

public void OutIntoExcel(HSSFWorkbook workbook, int i, int rowf, int rowt)

{

ISheet sheet1 = workbook.CreateSheet("Sheet" + i.ToString());

IRow row;

ICell cell;

int rows = rowf;

for (int rowIndex = 0; rowIndex 

{

row = sheet1.CreateRow(rowIndex);

for (int colIndex = 0; colIndex 

{

cell = row.CreateCell(colIndex);

if (rowIndex == 0)

cell.SetCellValue(dgExcel.Columns[colIndex].HeaderText);

else

cell.SetCellValue(dgExcel[colIndex, rows].Value.ToString());

}

if (rowIndex != 0)

rows += 1;

if (rows == rowt + 1)

break;

}

}

------解决思路----------------------

每次更新1000条,循环更新

------解决思路----------------------

xls格式是03,它不支持那么多数据

你需要改成xlsx,也就是07

当然07也有限制,但是至少要比03大的多了

------解决思路----------------------

要么就自己做判断,如果超过了多少数据,就创建新的工作簿存放,不要都放一个工作簿里

------解决思路----------------------

if(i==1000) //每当到1000行时写入一次

{

....

FileStream file = new FileStream(save.FileName, FileMode.OpenOrCreate);

workbook.Write(file);

file.close();

GC.Collect();

workbook = new HSSFWorkbook();//重新打开workbook

}

大概就是这个意思吧..

------解决思路----------------------

看看这个吧

https://npoi.codeplex.com/discussions/540101

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值