簡體   English   中英

如何將特定的 excel 單元格值導入 C# 中的現有 datagridview 單元格

[英]How do I import specific excel cell values to existing datagridview cells in C#

我在如何使用從 excel 導入的特定 excel 單元格值(不是 excel 表)更新加載了來自 mysql 的數據的現有 datagridview 時遇到了麻煩。 可用的解決方案縫合導入整個工作表並替換現有的數據網格視圖。 而其他人只是使列空白。

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        OpenFileDialog dlg = new OpenFileDialog();
        dlg.Filter = "Excel File|*.xlx;*.xlsx;*.xlsm;";
        if (dlg.ShowDialog() == DialogResult.OK)
        {
            textBox1.Text = dlg.FileName;

            string name = "sheet1";
            string constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + textBox1.Text + "; Extended Properties='Excel 12.0 XML;HDR=YES;';";
            OleDbConnection Con = new OleDbConnection(constr);
            OleDbCommand OleCon = new OleDbCommand("SELECT * FROM [" + name + "$]", Con);
            Con.Open();
            OleDbDataAdapter sda = new OleDbDataAdapter(OleCon);
            DataTable data = new DataTable();

            sda.Fill(data);

            dataGridView1.DataSource = data;

            for (int i = 0; i < dataGridView1.RowCount - 1; i++)
            {
                dataGridView1.Rows[i].Cells["Ab"].Value = sda;
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

嘗試直接在 OLEDB 命令中查詢列:

OleDbCommand OleCon = new OleDbCommand("SELECT * FROM [" + name + " Index$AB]", Con);

我仍然不明白你想要做什么。 據我所知,有一個DataGridView有一個DataSource DataSource是一個DataTable是從查詢到一個數據庫中創建。 此外,還有一個 Excel 工作簿,其中包含一些您想用來“覆蓋”或添加到DataGridView ……這還不清楚。

根據您的評論,我猜您想打開 Excel 文件並只閱讀工作簿的特定部分。 如前所述,發布的代碼正在讀取名為“Sheet1”的整個工作表。 如果這是正確的,那么這將專注於閱讀工作簿的特定部分。

在您的描述中,您聲明要獲取…… “從 excel 導入的特定 excel 單元格值(不是 excel 表)” ... 這聽起來很奇怪,因為工作簿中的每個單元格都在“工作表”上。 因此,如果您想從工作簿中獲取特定單元格……那么您還必須指定一個工作表。

根據我的測試,使用 OLEDB 是可行的,但是您可能需要記住一些注意事項。 此外,除非您被迫使用 OLEDB,否則您可能需要考慮使用第三方 Excel 庫閱讀器。 有很多是免費的,根據我的理解,它們在很多方面都一樣好,如果不是更好。 但是,我知道這可能不是一種選擇。

如果您想從 Excel 工作表中獲取“特定”數據列,則 select 語句可能類似於……

OleDbCommand OleCon = new OleDbCommand("SELECT Ab FROM [" + name + "$]", Con);

為了使上述 select 語句起作用,正如您的代碼所做的那樣……是在提供程序初始化中將標題行設置為: HDR=YES 此外,列名 ( Ab ) 不能有空格。 如果標題有空格,則必須用單引號“`”將其括起來。 這是波浪號“~”鍵的單引號。 雙引號“””鍵不起作用。 如果您使用雙引號鍵,它將被解釋為文字,並且只會用該值填充該列。 您可以從中選擇您想要的任何一列或多列。

OleDbCommand OleCon = new OleDbCommand("SELECT Ab, 'Expense Description' FROM [" + name + "$]", Con);

現在壞消息是,Excel 有一個壞習慣,即在單元格不包含值時將它們報告為“包含”值。 例如,在只有 1000 行數據的現有 Excel 工作表上使用上述選擇語句返回 49,999 行。 我創建了一個新工作簿並添加了一些數據,上面的命令只返回包含數據的單元格。 重點是……如果你使用這個策略,檢查返回的內容可能是謹慎的。 我相信當Fill需要 15 秒或更長時間時,這將是顯而易見的。

另一種方法是使用 Excel 的范圍類型定義來選擇單元格。 就像是…

OleDbCommand OleCon = new OleDbCommand("SELECT * FROM [" + name + "$B1:C1000]", Con);

在這里,您可以定義一系列單元格。 這里的缺點是列必須是連續的,或者至少我無法創建非連續的范圍。 我知道您可以使用工作簿中的“定義”命名范圍,但是我無法實現這一點。

擁有這些單元格后,我不確定如何將每一行與網格中的行進行匹配,但我認為這將是下一步。

我希望這有幫助。

暫無
暫無

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

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