C# WinForm Excel 检查空表功能有效但速度太慢(15 张 30 秒)

C# WinForm Excel check empty sheets function-works but too slow(15 sheets 30 seconds)

我有一个工作函数,用于检查 excel 文件中的 sheet 是否为空。

每个 sheet 都会调用此函数。该功能完美运行。唯一的问题是如果我的 Excel 文件有 50 sheets,调用这个函数需要 30 秒,这太多了。

我可以做些什么来优化这个函数,让这个函数在 excel 中被所有 sheet 调用一次?我应该使用 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;
        }

调用函数时,我为那个 sheet 启用了一个按钮。

foreach (var i in sheets)
            {
        if (ExcelUtil.isEmptySheet2(result) == true)
                {

                    //set button false
                    i.btnFood = false;
                }
                else
                {
                    i.btnFood = true;
                }
            }

最后,我想为 sheet 启用是否为空的按钮。上面的代码工作正常,但是

-> 我必须为每个 sheet 调用该方法 ->遍历所有 sheet->opening->checking->closing->opening 花费太多时间

您为每个 sheet 打开新连接。完全没有必要。您可以将连接对象传递给内部方法。或者您可以修改您的查询以在一个 select 中获取所有 sheet,然后从单个 dt 对象检查应用程序层中的每个 sheet。

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

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