【发布时间】:2016-07-12 13:56:54
【问题描述】:
我有一个工作函数,用于检查 excel 文件中的工作表是否为空。
每个工作表都调用此函数。该功能完美运行。唯一的问题是,如果我的 Excel 文件有 50 张,调用此函数需要 30 秒,这太长了。
我可以做些什么来优化这个函数,所以这个函数要为 excel 中的所有工作表调用一次?我应该使用 linq 还是仍然使用 OLEDB。
P.S 我不会使用 Interlop,因为它要检查三倍。
这是我的功能
public static bool isEmptySheet2(string nameSheet)
{
string filePath = Properties.Resources.ResourceManager.GetString("FilePath");
string fileName = Properties.Resources.ResourceManager.GetString("FileName");
string fileLocation = filePath + fileName;
try
{
DataTable dt = new DataTable();
string connstr = @"Provider=Microsoft.ACE.OLEDB.12.0;" +
"Data Source=" + fileLocation + ";" + "Extended Properties=" + "\"" + "Excel 12.0 Xml;IMEX=1;HDR=NO;" + "\"";
OleDbConnection conn = new OleDbConnection(connstr);
string strSQL = "SELECT * FROM [" + nameSheet +"] WHERE [F17]='OK';";
// string strSQL = "SELECT * FROM [" + "ThisIsSheet5$D4:D4" +"] WHERE [F17]='OK';";
OleDbCommand cmd = new OleDbCommand(strSQL, conn);
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
da.Fill(dt);
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn col in dt.Columns)
{
//test for null here
if (row[col] != DBNull.Value)
{
return false;
}
}
}
return true;
}
catch (Exception ex)
{
Console.WriteLine(ex);
} return false;
}
当调用函数时,我为该工作表启用了一个按钮。
foreach (var i in sheets)
{
if (ExcelUtil.isEmptySheet2(result) == true)
{
//set button false
i.btnFood = false;
}
else
{
i.btnFood = true;
}
}
最后,我想为该表启用按钮,它是否为空。上面的代码工作正常,但是
-> 我必须为每张纸调用该方法 ->遍历所有工作表->打开->检查->关闭->打开需要太多时间
【问题讨论】:
-
您正在阅读的所有工作簿都是 XLSX 还是旧格式(如 XLS)?
-
@hype8912 ,仅限xlsx
-
@hype8912 请给我一个解决方案
-
我没有任何关于这个确切用例的示例,但当我必须使用 Excel 进行任何工作时,我总是使用 ClosedXML、EPPlus、Aspose.Cells。所有这些库都可以从 nuget.org 引用。如果您真的只是检查单元格 F17 的值是否为“OK”,那么您可以使用我提到的库更快地遍历工作表。
标签: c# excel winforms linq oledb