C#WinForm Excel检查空表function,但太慢(15张30秒)

我有一个工作函数,检查如果表格从Excel文件是空的。

每个工作表都会调用这个函数。 该function完美地工作。 唯一的问题是,如果我的Excel文件有50张,调用这个函数需要30秒,这太多了。

我可以做些什么来优化这个function,所以在excel中所有表单调用一次? 我应该使用LINQ还是OLEDB。

PS我不会使用Interlop,因为它将三倍的时间检查。

这是我的function

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; } 

当调用函数时,我为该表启用一个button。

 foreach (var i in sheets) { if (ExcelUtil.isEmptySheet2(result) == true) { //set button false i.btnFood = false; } else { i.btnFood = true; } } 

最后,我想启用该表是否为空的button。 上面的代码工作正常,但是

– >我必须为每个表单调用该方法 – >遍历整个表单 – >打开 – >检查 – >closures – >打开需要太多时间

您打开每个工作表的新连接。 这是没有必要的。 您可以将连接对象传递给内部方法。 或者你可以修改你的查询来获取所有的表单,然后从单个dt对象中检查应用程序层中的每个表单。

编辑:你可以像这样传递连接对象:

 public static bool isEmptySheet2(string nameSheet,OleDbConnection conn) { try { DataTable dt = new DataTable(); 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; } 

你的外在方法:

 string filePath = Properties.Resources.ResourceManager.GetString("FilePath"); string fileName = Properties.Resources.ResourceManager.GetString("FileName"); string fileLocation = filePath + fileName; 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); foreach (var i in sheets) { if (ExcelUtil.isEmptySheet2(result,conn) == true) { //set button false i.btnFood = false; } else { i.btnFood = true; } }