如何提高 EPPlus 或 NPOI和导出效率?

[大楚] 2016-07-06 12:12:55
25000条记录,150列,使用 EPPlus 或 NPOI和导出到Exce,不设置样式,时间都在3分钟以上,有没有办法提高一下导出效率呀?谢谢


//EPPlus
private void Exp2Excel(DataTable dt)
{
string xlsFileName = string.Empty; ;
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Excel文件(*.xlsx)|*.xlsx";

if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
xlsFileName = sfd.FileName;
else
return;

using (ExcelPackage package = new ExcelPackage(new FileInfo(xlsFileName)))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Sheet1");


Console.WriteLine("1-- " + DateTime.Now.ToLongTimeString());
foreach (DataColumn column in dt.Columns)
{
if (column.ColumnName.Equals("cinvcode_03") || column.ColumnName.Equals("cinvcode_04"))
{
continue;
}
worksheet.Cells[1, column.Ordinal+1].Value = column.ColumnName;
}

string drValue;
int iRow;
int iCol;

for (int i = 0; i < dt.Rows.Count; i++)
{
foreach (DataColumn column in dt.Columns)
{
iRow = i + 2;
iCol = column.Ordinal + 1;

if (column.ColumnName.Equals("cinvcode_03") || column.ColumnName.Equals("cinvcode_04"))
{
continue;
}

drValue = dt.Rows[i][column].ToString();

switch (column.DataType.ToString())
{
case "System.Decimal":
case "System.Double":
double doubV = 0;
double.TryParse(drValue, out doubV);
if (doubV == 0)
worksheet.Cells[iRow, iCol].Value = "";
else
worksheet.Cells[iRow, iCol].Value = doubV;
break;

case "System.DBNull":
worksheet.Cells[iRow, iCol].Value = "";
break;

default:
worksheet.Cells[iRow, iCol].Value = dt.Rows[i][column].ToString();
break;
}
}
}

Console.WriteLine("2-- " + DateTime.Now.ToLongTimeString());
package.Save();

MessageBox.Show("成功导出为Excel!", "系统信息", MessageBoxButtons.OK, MessageBoxIcon.Information);

}
...全文
1552 8 打赏 收藏 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
showjim 2016-07-14
  • 打赏
  • 举报
回复
Microsoft.ACE.OLEDB
Poopaye 2016-07-14
  • 打赏
  • 举报
回复
你觉得瓶颈真的在epplus或者npoi上吗?先吧worksheet有关的内容注释掉看看要花多少时间吧
[大楚] 2016-07-14
  • 打赏
  • 举报
回复
引用 2 楼 x8bits 的回复:
此外,使用类似以下代码也可以优化掉字符串比较
	if (column.Ordinal == 3 || column.Ordinal == 4) // Use zero-based index instead of string for comparison
	{
	    continue;
	}
替换掉
                    if (column.ColumnName.Equals("cinvcode_03") || column.ColumnName.Equals("cinvcode_04"))
                    {
                        continue;
                    }
位置不固定
[大楚] 2016-07-14
  • 打赏
  • 举报
回复
引用 4 楼 u012837409 的回复:
你找个太久了! 大数据最好用EPPlus,更节约内容! 我130万行,11列,大概几十秒吧
现在就是用的EPPlus,导出的文件以NPOI小,但速度差不太多,我的列比较多,不知道是不是影响效率。 回头测试一下。
by_封爱 版主 2016-07-07
  • 打赏
  • 举报
回复
sql bcp 几百万瞬间导出
x8bits 2016-07-07
  • 打赏
  • 举报
回复
此外,使用类似以下代码也可以优化掉字符串比较
	if (column.Ordinal == 3 || column.Ordinal == 4) // Use zero-based index instead of string for comparison
	{
	    continue;
	}
替换掉
                    if (column.ColumnName.Equals("cinvcode_03") || column.ColumnName.Equals("cinvcode_04"))
                    {
                        continue;
                    }
x8bits 2016-07-07
  • 打赏
  • 举报
回复
试试把switch语句改成if...else...以避免循环里过多字符串比较,应该会有所改善
	Type dataType = column.DataType;
	if (dataType == typeof(System.Decimal) || dataType == typeof(System.Double))
	{
	}
	else if (dataType == typeof(System.DBNull))
	{
	}
	else
	{
		
	}
带头大哥_ 2016-07-07
  • 打赏
  • 举报
回复
你找个太久了! 大数据最好用EPPlus,更节约内容! 我130万行,11列,大概几十秒吧

111,128

社区成员

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

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

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