saving/creating/exporting excel sheet 时出现 OutOfMemoryException
OutOfMemoryException while saving/creating/exporting excel sheet
开发环境:
- OS - Windows 7 64 位
- CPU - i5 460M
- RAM - 8GB
- .NET 框架 - 4.0
- Excel-Interop - Microsoft Excel 14.0 对象库
我正在使用 Excel-Interop 从 DataGridView (dgv) 导出 excel 文件。
当我保存超过 150,000 行时
OutOfMemoryException
被抛出。
{
object[,] valueObjArray = new object[rowCnt, colCnt];
int rowCnt = dgv.Rows.Count;
int colCnt = dgv.Columns.Count;
for (int rowIndex = 0; rowIndex < rowCnt; rowIndex++)
{
for (int colIndex = 0; colIndex < colCnt; colIndex++)
{
valueObjArray[rowIndex, colIndex] = dgv[colIndex, rowIndex].Value;
}
}
_workSheet.get_Range("A1", Convert.ToChar(colCnt + 64).ToString() + "1").Value2 = headerObjArray;
_workSheet.get_Range("A2", Convert.ToChar(colCnt + 64).ToString() + (rowCnt + 1).ToString()).Value2 = valueObjArray;
_workSheet.get_Range("B2", "B" + (rowCnt+1).ToString()).NumberFormat = "yyyy-mm-dd hh:mm";
_workBook.SaveAs(path);
}
这是我所知道的最好的加速方式。
但是,在监控 RAM 后,我认为它会导致内存增加。当内存使用量达到大约 900Mb 时抛出异常。
如何捕捉这个异常?
尝试分批进行:
//We will call SaveAs method many times and we don't want to be asked
//if a file should be overwritten every time.
xlApp.DisplayAlerts = false
int rowCnt = dgv.Rows.Count;
int colCnt = dgv.Columns.Count;
int batchSize = 100000; //Try to experiment with other values
int currentRow = 0;
object[,] valueObjArray = new object[batchSize, colCnt];
_workSheet.get_Range("A1", Convert.ToChar(colCnt + 64).ToString() + "1").Value2 = headerObjArray;
while (currentRow < rowCnt)
{
for (int rowIndex = 0; rowIndex < batchSize && currentRow + rowIndex < rowCnt; rowIndex++)
{
for (int colIndex = 0; colIndex < colCnt; colIndex++)
{
valueObjArray[rowIndex, colIndex] =
dgv[colIndex, currentRow + rowIndex].Value;
}
}
ws.get_Range("A2", Convert.ToChar(colCnt + 64).ToString() + (currentRow + batchSize + 1).ToString()).Value2 = valueObjArray;
ws.get_Range("B2", "B" + (currentRow + batchSize + 1).ToString()).NumberFormat = "yyyy-mm-dd hh:mm";
wb.SaveAs("a.xlsx");
currentRow += batchSize;
}
我用这种方法保存了 100 万行。我使用假数据对其进行了测试,因此可能需要进行一些小的更改/修复。
尝试这样做....
我有20万及以上的大量数据。首先,我使用 excel 包并且 Microsoft.Office.Interop.Excel 本地系统工作正常,
但是在 (worksheet.cells/worksheet.range) OutOfMemoryeException 错误之后托管 iis(静态 IP 地址)。所以我正在使用 StreamWriter 并写入 .xls 文件。 .xls 转换为 .xlsx 文件后删除 .xls 文件。它为我工作。我英文不太好 。请理解。
private void ExportxlFile(DataTable dt)
{
try
{
//open file
//non english not support(ex: Bangla Language)"সালাউদ্দিন স্টোর";
// StreamWriter wr = new StreamWriter(@"D:\TestBook.xls");
//non english support(ex: Bangla Language)
StreamWriter wr = new StreamWriter(@"D:\TestBook.xls", true, Encoding.Unicode); // Encoding.Unicode or Encoding.UTF32
for (int i = 0; i < dt.Columns.Count; i++)
{
wr.Write(dt.Columns[i].ToString().ToUpper() + "\t");
}
wr.WriteLine();
//write rows to excel file
for (int i = 0; i < (dt.Rows.Count); i++)
{
for (int j = 0; j < dt.Columns.Count; j++)
{
if (dt.Rows[i][j] != null)
{
wr.Write(Convert.ToString(dt.Rows[i][j]) + "\t");
}
else
{
wr.Write("\t");
}
}
//go to next line
wr.WriteLine();
}
//close file
wr.Close();
//xls to xlsx convertion
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Open(@"D:\TestBook.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
wb.SaveAs(@"D:\TestBook.xlsx", Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
wb.Close();
app.Quit();
//delete xls file
System.IO.File.Delete(@"D:\TestBook.xls");
}
catch (Exception ex)
{
throw ex;
}
}
开发环境:
- OS - Windows 7 64 位
- CPU - i5 460M
- RAM - 8GB
- .NET 框架 - 4.0
- Excel-Interop - Microsoft Excel 14.0 对象库
我正在使用 Excel-Interop 从 DataGridView (dgv) 导出 excel 文件。
当我保存超过 150,000 行时
OutOfMemoryException
被抛出。
{
object[,] valueObjArray = new object[rowCnt, colCnt];
int rowCnt = dgv.Rows.Count;
int colCnt = dgv.Columns.Count;
for (int rowIndex = 0; rowIndex < rowCnt; rowIndex++)
{
for (int colIndex = 0; colIndex < colCnt; colIndex++)
{
valueObjArray[rowIndex, colIndex] = dgv[colIndex, rowIndex].Value;
}
}
_workSheet.get_Range("A1", Convert.ToChar(colCnt + 64).ToString() + "1").Value2 = headerObjArray;
_workSheet.get_Range("A2", Convert.ToChar(colCnt + 64).ToString() + (rowCnt + 1).ToString()).Value2 = valueObjArray;
_workSheet.get_Range("B2", "B" + (rowCnt+1).ToString()).NumberFormat = "yyyy-mm-dd hh:mm";
_workBook.SaveAs(path);
}
这是我所知道的最好的加速方式。
但是,在监控 RAM 后,我认为它会导致内存增加。当内存使用量达到大约 900Mb 时抛出异常。
如何捕捉这个异常?
尝试分批进行:
//We will call SaveAs method many times and we don't want to be asked
//if a file should be overwritten every time.
xlApp.DisplayAlerts = false
int rowCnt = dgv.Rows.Count;
int colCnt = dgv.Columns.Count;
int batchSize = 100000; //Try to experiment with other values
int currentRow = 0;
object[,] valueObjArray = new object[batchSize, colCnt];
_workSheet.get_Range("A1", Convert.ToChar(colCnt + 64).ToString() + "1").Value2 = headerObjArray;
while (currentRow < rowCnt)
{
for (int rowIndex = 0; rowIndex < batchSize && currentRow + rowIndex < rowCnt; rowIndex++)
{
for (int colIndex = 0; colIndex < colCnt; colIndex++)
{
valueObjArray[rowIndex, colIndex] =
dgv[colIndex, currentRow + rowIndex].Value;
}
}
ws.get_Range("A2", Convert.ToChar(colCnt + 64).ToString() + (currentRow + batchSize + 1).ToString()).Value2 = valueObjArray;
ws.get_Range("B2", "B" + (currentRow + batchSize + 1).ToString()).NumberFormat = "yyyy-mm-dd hh:mm";
wb.SaveAs("a.xlsx");
currentRow += batchSize;
}
我用这种方法保存了 100 万行。我使用假数据对其进行了测试,因此可能需要进行一些小的更改/修复。
尝试这样做....
我有20万及以上的大量数据。首先,我使用 excel 包并且 Microsoft.Office.Interop.Excel 本地系统工作正常, 但是在 (worksheet.cells/worksheet.range) OutOfMemoryeException 错误之后托管 iis(静态 IP 地址)。所以我正在使用 StreamWriter 并写入 .xls 文件。 .xls 转换为 .xlsx 文件后删除 .xls 文件。它为我工作。我英文不太好 。请理解。
private void ExportxlFile(DataTable dt)
{
try
{
//open file
//non english not support(ex: Bangla Language)"সালাউদ্দিন স্টোর";
// StreamWriter wr = new StreamWriter(@"D:\TestBook.xls");
//non english support(ex: Bangla Language)
StreamWriter wr = new StreamWriter(@"D:\TestBook.xls", true, Encoding.Unicode); // Encoding.Unicode or Encoding.UTF32
for (int i = 0; i < dt.Columns.Count; i++)
{
wr.Write(dt.Columns[i].ToString().ToUpper() + "\t");
}
wr.WriteLine();
//write rows to excel file
for (int i = 0; i < (dt.Rows.Count); i++)
{
for (int j = 0; j < dt.Columns.Count; j++)
{
if (dt.Rows[i][j] != null)
{
wr.Write(Convert.ToString(dt.Rows[i][j]) + "\t");
}
else
{
wr.Write("\t");
}
}
//go to next line
wr.WriteLine();
}
//close file
wr.Close();
//xls to xlsx convertion
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Open(@"D:\TestBook.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
wb.SaveAs(@"D:\TestBook.xlsx", Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
wb.Close();
app.Quit();
//delete xls file
System.IO.File.Delete(@"D:\TestBook.xls");
}
catch (Exception ex)
{
throw ex;
}
}