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

丶莫问 2015-03-13 09:30:57
使用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 < 30001; rowIndex++)
{
row = sheet1.CreateRow(rowIndex);
for (int colIndex = 0; colIndex < dgExcel.Columns.Count; 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;
}
}
...全文
1261 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
x1927 2017-11-29
  • 打赏
  • 举报
回复
楼主,问一句当年怎么解决的?我也遇到这样的问题,85个字段,也是3-4w时内存溢出
gxxloveszj 2015-07-21
  • 打赏
  • 举报
回复
解决了吗,我是执行到20万条数据才报这个错
丶莫问 2015-04-03
  • 打赏
  • 举报
回复
就没有一个能解答下的啊
丶莫问 2015-03-24
  • 打赏
  • 举报
回复
再顶一下 求解答
丶莫问 2015-03-19
  • 打赏
  • 举报
回复
引用 11 楼 SPFarm 的回复:
看看这个吧 https://npoi.codeplex.com/discussions/540101
那个好像是读一个大数据量的Excel吧 我这个是要写啊 全英文的看不懂啊 貌似也没解决方法吧
SPFarmer 2015-03-18
  • 打赏
  • 举报
回复
看看这个吧 https://npoi.codeplex.com/discussions/540101
丶莫问 2015-03-18
  • 打赏
  • 举报
回复
看来没人知道怎么搞啊 网上查了好久,看到一个文件说是先分多个Excel文件导出来,然后再合并的方法 前半部分比较好实现,后面合并还是弄不出来,有高手知道怎么弄的不
丶莫问 2015-03-17
  • 打赏
  • 举报
回复
引用 8 楼 subufan 的回复:
if(i==1000) //每当到1000行时写入一次 { .... FileStream file = new FileStream(save.FileName, FileMode.OpenOrCreate); workbook.Write(file); file.close(); GC.Collect(); workbook = new HSSFWorkbook();//重新打开workbook } 大概就是这个意思吧..
测试了一下 现在内存溢出的变成workbook.Write(file); 这一段了
subufan 2015-03-17
  • 打赏
  • 举报
回复
if(i==1000) //每当到1000行时写入一次 { .... FileStream file = new FileStream(save.FileName, FileMode.OpenOrCreate); workbook.Write(file); file.close(); GC.Collect(); workbook = new HSSFWorkbook();//重新打开workbook } 大概就是这个意思吧..
丶莫问 2015-03-13
  • 打赏
  • 举报
回复
顶一下 求高手帮帮忙啊
丶莫问 2015-03-13
  • 打赏
  • 举报
回复
引用 1 楼 mimiooo1003 的回复:
每次更新1000条,循环更新
怎么循环? 没太懂
丶莫问 2015-03-13
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
xls格式是03,它不支持那么多数据 你需要改成xlsx,也就是07 当然07也有限制,但是至少要比03大的多了
我是分页的啊 3W一个sheet 这样03总支持的吧
於黾 2015-03-13
  • 打赏
  • 举报
回复
要么就自己做判断,如果超过了多少数据,就创建新的工作簿存放,不要都放一个工作簿里
於黾 2015-03-13
  • 打赏
  • 举报
回复
xls格式是03,它不支持那么多数据 你需要改成xlsx,也就是07 当然07也有限制,但是至少要比03大的多了
mimiooo1003 2015-03-13
  • 打赏
  • 举报
回复
每次更新1000条,循环更新

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧