[英]How to import specific cells of an Excel file into datagridview using c#
[英]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.