簡體   English   中英

如何在C#中使用oledb僅上傳非空行的Excel電子表格?

[英]How to upload only non-empty rows of Excel spreadsheet using oledb in C#?

我正在使用oledb連接將Excel工作表導入DataTable,如下所示。

private static DataTable UploadExcelSheet(string fileName)
    {
        DataTable uploadDataTable;
        using (OleDbConnection objXConn = new OleDbConnection())
        {
            objXConn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName +
                                            ";Extended Properties=\"Excel 12.0;IMEX=1\"";

            objXConn.Open();

            OleDbCommand objCommand =
                new OleDbCommand("SELECT * FROM Template$ ", objXConn);
            OleDbDataAdapter objDataAdapter = new OleDbDataAdapter();

            // retrieve the Select command for the Spreadsheet
            objDataAdapter.SelectCommand = objCommand;

            // Create a DataSet
            DataSet objDataSet = new DataSet();

            // Populate the DataSet with the spreadsheet worksheet data
            objDataAdapter.Fill(objDataSet);
            uploadDataTable = objDataSet.Tables[0];
        }

        return uploadDataTable;
    }

一切都運行正常,但是當用戶在上傳excel之前刪除幾行內容時會出現問題。 它還會讀取這些空行以及非空行,並且由於業務規則違規(缺少必填字段),因此在數據庫中保存數據失敗。 我嘗試的是在查詢中放置條件:

"SELECT * FROM  WHERE  not [CandidateId*] = 0 or not [Firstname*] = '' or not [Lastname] = '' or not [type*] = '' or not [DOB*] =" + DBNull.Value

所以它只會選擇那些有數據的行。 但是我無法比較非字符串字段,即Date,Integer等。當空時,它們將作為DBNull進行比較。 任何人都可以建議的方法,我不想使用DataReader。

擴展vc的答案,這將刪除每個列包含任何內容或空格的所有行:

dataTable = dataTable.Rows.Cast<DataRow>().Where(row => !row.ItemArray.All(field => field is System.DBNull || string.Compare((field as string).Trim(), string.Empty) == 0)).CopyToDataTable();

在使用Linq對象執行查詢后過濾行怎么樣:

var filteredRows = uploadDataTable.Rows.Cast<DataRow>().Where(
  row => row.ItemArray.Any(field => !(field is System.DBNull)));

使用

".. WHERE NOT ([Lastname] = '' OR [DOB*] IS NULL OR ... )

擴展之前的答案,這對我有用。 刪除所有字段為空的行。

Dim deleteRows = From row In result.AsEnumerable
                 Where row.ItemArray.All(Function(field) Equals(field, DBNull.Value))

For Each deleteRow In deleteRows
    deleteRow.Delete()
Next

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM