- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有使用 EPPlus 将 SQL 表中的所有记录保存到 excel 工作表的功能。如果我导出少量数据,一切正常,但如果有 200 多列和 500 000 多行,我会遇到 OutOfMemory 异常。
我想修改我的代码,使每个文件能够保存 50 000 条记录。
这是我的适用于小数据的代码:
private Task SaveAsync(string tableName)
{
return Task.Run(() =>
{
try
{
using (var conn = new SqlConnection(_connectionString))
{
using (var cmd = new SqlCommand(string.Format(DataQuery, tableName), conn))
{
cmd.CommandType = CommandType.Text;
cmd.CommandTimeout = 360;
conn.Open();
using (SqlDataReader sdr = cmd.ExecuteReader())
{
var fileName = string.Format(TargetFile, tableName);
if (File.Exists(fileName))
{
File.Delete(fileName);
}
sdr.Read();
var numberOfRecordsInTable = sdr.GetInt32(0);
sdr.NextResult();
using (ExcelPackage pck = new ExcelPackage(new FileInfo(fileName)))
{
ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Results");
int count = sdr.FieldCount;
int col = 1, row = 1;
for (int i = 0; i < count; i++)
{
ws.SetValue(row, col++, sdr.GetName(i));
}
row++;
col = 1;
while (sdr.Read())
{
for (int i = 0; i < count; i++)
{
var val = sdr.GetValue(i);
ws.SetValue(row, col++, val);
}
row++;
col = 1;
}
//autosize
ws.Cells[ws.Dimension.Address].AutoFitColumns();
//autofiltr
ws.Cells[1, 1, 1, count].AutoFilter = true;
}
}
conn.Close();
}
}
}
catch (Exception e)
{
Debug.WriteLine("Error at: " + Thread.CurrentThread.ManagedThreadId);
Debug.WriteLine(e);
}
});
}
以及我修改后的代码,将每个文件的记录拆分为 50 000:
private Task SaveAsync2(string tableName)
{
return Task.Run(() =>
{
try
{
using (var conn = new SqlConnection(_connectionString))
{
using (var cmd = new SqlCommand(string.Format(DataQuery, tableName), conn))
{
cmd.CommandType = CommandType.Text;
cmd.CommandTimeout = 360;
conn.Open();
using (SqlDataReader sdr = cmd.ExecuteReader())
{
var fileName = string.Format(TargetFile, tableName,"");
if (File.Exists(fileName))
{
File.Delete(fileName);
}
sdr.Read();
var max = sdr.GetInt32(0);
int filesCount = 1;
if (max > 50000)
{
fileName = string.Format(TargetFile, tableName, filesCount);
}
sdr.NextResult();
ExcelPackage pck = new ExcelPackage(new FileInfo(fileName));
ExcelWorksheet ws = pck.Workbook.Worksheets.Add("RESULTS");
int count = sdr.FieldCount;
int col = 1, row = 1;
for (int i = 0; i < count; i++)
{
ws.SetValue(row, col++, sdr.GetName(i));
}
row++;
col = 1;
while (sdr.Read())
{
for (int i = 0; i < count; i++)
{
var val = sdr.GetValue(i);
ws.SetValue(row, col++, val);
}
row++;
col = 1;
if (row > 50000)
{
pck.Save();
filesCount++;
fileName = string.Format(TargetFile, tableName, filesCount);
pck = new ExcelPackage(new FileInfo(fileName));
ws = pck.Workbook.Worksheets.Add("RESULTS");
count = sdr.FieldCount;
col = 1;
row = 1;
for (int i = 0; i < count; i++)
{
ws.SetValue(row, col++, sdr.GetName(i));
}
row++;
col = 1;
}
}
//autosize
ws.Cells[ws.Dimension.Address].AutoFitColumns();
//autofiltr
ws.Cells[1, 1, 1, count].AutoFilter = true;
pck.Save();
}
}
conn.Close();
}
}
catch (Exception e)
{
Debug.WriteLine("Error at: " + Thread.CurrentThread.ManagedThreadId);
Debug.WriteLine(e);
}
});
}
基本上这工作正常,但在我的代码的第一个版本中,我在 using
语句中使用了所有内容,而在第二个版本中,我调用了相同的代码两次。
行 x 列
?我发现 EPPlus 应该处理超过百万行的信息,但没有我拥有的那么多列。我认为我可以用单列导出百万行,但对于 200 多列来说,50 000 行是限制。我想知道是否有数字(行 x 列)会限制我的导出工作正常。我希望该导出功能是通用的,因此当我传递包含 50 列的数据表时,它将导出例如每个文件 100 000 行,对于 2 列,它将每个文件导出 50 万行。最佳答案
我过去曾遇到过 EPPlus 的内存限制,最终生成了多个 .xlsx 文件作为解决方法(类似于您的方法)。另一种选择是将您的编译器设置更改为仅针对 64 位(如果您可以在不支持 32 位平台的情况下通过)。我记得,EPPlus 是为“任何 CPU”编译的,因此如果您可以将代码更改为目标“x64”,这可能会放宽内存限制并允许您生成单个 .xlsx 文件。以 x64 为目标在我的案例中可能会奏效,但我直到事后才想到它,所以我一直没有机会进行测试。
更新:我刚刚使用 EPPlus 3.1.3 进行了快速测试,创建了 500,000 行,每行 70 列。在生成内存不足异常之前,我的 32 位应用程序能够生成大约 119,000 行。将目标切换到 x64 后,它成功生成了所有 500,000 行,尽管它花了很长时间。创建实际的工作表只花了几分钟,但 ExcelPackage.SaveAs() 花了将近 20 分钟。 RAM 消耗也相当高(大约 11GB 的 RAM)。生成的 .xlsx 为 220MB,32 位 Excel 无法打开(内存不足)。 底线:针对 x64 可能不是一个可行的解决方案;您最好将输出拆分为多个 .xlsx 文件。
我很想删除这个答案,因为它已被证明是一个死胡同,但决定保留它以防它帮助其他人在未来避免这条路。
关于c# - EPPlus 将包含 200 多列数据表的 200 万行保存到多个 excel 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33264040/
是否可以在 EPPlus 中为整个列设置样式?我希望我可以只使用 Column方法,但是当我这样做时,我得到了奇怪的结果: //Sets all cells in all columns to Red
有人知道如何使用 EPPLUS 设置条件格式的字体颜色吗? Using rng = ws.Cells("A7:AD29") Dim condSumLn = ws.ConditionalForm
我正在查看 POST 以使用 EPPlus 在 Excel 中创建多级可折叠分组,但我无法在现有组中创建内部组。 请参阅我在这里使用的示例文件 看来,我需要为第 14-18 行设置 OutlineLe
示例。埃普拉斯怎么样? Sheet.Cells["a1:d1"].Column.Width = 10; 在 Excel 互操作中: Sheet.get_Range("a1", "d1").Column
我在使用 EPPlus 处理 Excel 文档中的注释时遇到了一些问题。我可以添加评论并删除它们,但有时它不成功。 我正在使用注释来显示 Excel 文件处理结果的验证消息,并且当该文件被重新处理时,
我正在将 SSRS 报告导出到单独的 excel 文件中,并使用 EPPlus 将它们合并到一个文件中。合并成功,但当我尝试在 Excel 中打开文件时出现以下错误。 我删除了报告数据以生成空报告,但
我正在使用EPPlus读取excel工作表并将数据加载到数据表中以执行进一步的操作,然后将修改后的数据保存回excel文件中。 下面的代码检查单元格值是否为浮点值,然后将浮点值转换为日期时间。 当单元
通过查看EPPlus随附的示例,我已经成功创建了数据透视表,但是我无法为其设置正确的报告布局。我希望它是“表格格式”,而不是“大纲”或其他格式。在我看来,EPPlus现在不支持此功能,但是也许我缺少了
我使用 EPPlus 阅读工作表。在此工作表中,我需要的数据在列 B-D 中.在栏目A有静态值,我会忽略。 col A 中的值填写到Row 1000 .但是,我需要的数据只会在那里,例如 Row 45
在 EPPlus 中,我可以使用 workSheet.Cells[x, y].AddComment() 将注释添加到工作表中的单元格 但是如何从给定单元格中删除注释 - 没有 workSheet.Ce
设置列的 WrapText=true 后,我想查看行的新高度(即文本是否换行,行数)。行的 Height 属性似乎未更新。 ExcelPackage pkg = new ExcelPa
我目前正在与一位在 Excel 中手动生成发票的客户合作。我已经使用 epplus 自动为他们生成这个文件。 我的要求之一是每个页面周围都应该有一个边框,并以大约 7 行长的标题开始(并且每行具有不同
更改单元格的值时遇到问题。这是我的代码: FileInfo newFile = new FileInfo(file); ExcelPackage pck = new ExcelPackage(newF
当我使用 EPPlus 自动调整格式化为日期字符串的列时,自动调整机制使用未格式化的字符串作为列宽度的度量。 这是一个错误还是我做错了什么? 代码 sheet.Column(2).Style.Numb
using (var pck = new ExcelPackage(new FileInfo(wb_path))) { ExcelWorksheet ws = pck.Workbook.Wor
我有以下代码行,它根据特定列对工作表中的数据进行升序排序。问题是,它考虑了第一行(单元格 A1、B1 等)。 worksheet.Cells["A:AA"].Sort(new int[] { 5, 1
我正在.NET 4.0 命令行应用程序上使用 EPPlus 库创建电子表格。 我成功地从数据库中加载了所有数据,最后我正在创建一个图形,这是我的代码: var chart = sheet.Drawin
如何使用 EPPLus 将图表创建为单独的工作表,而不是作为现有工作表中的绘图? 最佳答案 在 4.0.4.0 版本(从 codeplex 下载代码,以纠正保存文件中的错误),您可以使用: workb
我正在运行一个带有 EPPlus 库的 C# 项目,我需要它检查各个列/行中的数据的单元格,然后找到“关键字”,可以说并将其与其他各个列/行中的数据匹配。 我需要知道一种将一个单元格中的数据与另一个单
我在使用 C# 和 EPPlus 从工作簿中读取某些工作表时遇到问题。 错误信息 name contains invalid characters 即使多次检查工作簿中的工作表名称、文件名和列标题以确
我是一名优秀的程序员,十分优秀!