まず、ExcelシートのデータをDataGridViewに読み込みます。ComboBoxで選択したシートをExcelから読み込むDataGridview
private void btnChooseAndRead_Click(object sender, EventArgs e)
{
Refresh();
string filePath = string.Empty;
string fileExt = string.Empty;
OpenFileDialog file = new OpenFileDialog();//open dialog to choose file
if (file.ShowDialog() == System.Windows.Forms.DialogResult.OK)//if there is a file choosen by the user
{
filePath = file.FileName;//get the path of the file
fileExt = Path.GetExtension(filePath);//get the file extension
if (fileExt.CompareTo(".xls") == 0 || fileExt.CompareTo(".xlsx") == 0)
{
try
{
cmbSheetName.Text = "";
cmbSheetName.Items.Clear();
string[] names = GetExcelSheetNames(file.FileName);
//Populate Combobox with Sheet names
foreach (string name in names)
{
cmbSheetName.Items.Add(name);
}
DataTable dtExcel = new DataTable();
dtExcel = ReadExcel(filePath, fileExt); //read excel file
cmbSheetName.Visible = true;
lblFileName.Text = file.SafeFileName.ToString();
BindingSource theBindingSource = new BindingSource();
dgvViewData.Visible = true;
dgvViewData.DataSource = dtExcel;
//dgvViewData.ColumnDisplayIndexChanged = true;
//cmbSheetName_SelectedIndexChanged(sender, e);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
else
{
MessageBox.Show("Please choose .xls or .xlsx file only.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error);//custom messageBox to show error
}
}
}
public DataTable ReadExcel(string fileName, string fileExt)
{
string conn = string.Empty;
DataTable dtexcel = new DataTable();
if (fileExt.CompareTo(".xls") == 0)//compare the extension of the file
conn = @"provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties='Excel 8.0;HRD=Yes;IMEX=1';";//for below excel 2007
else
conn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1';";//for above excel 2007
using (OleDbConnection con = new OleDbConnection(conn))
{
try
{
OleDbDataAdapter oleAdpt = new OleDbDataAdapter("select * from [Sheet1$]", con);//here we read data from sheet1
oleAdpt.Fill(dtexcel);//fill excel data into dataTable
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
return dtexcel;
}
これはうまくいきます。私が読んでいるExcelファイルには複数のシートがあります。
ユーザーがコンボから「Sheet5」を選択すると、選択したシートの詳細でGridviewをリフレッシュする必要があります。これはどうすればいいですか?すべてのシートがすべてGridviewに入っていることを私はどのように知っていますか?
Excelファイルを開き、シートごとに1つのDataTableでデータセット(またはリスト)を初期化するよりも手順を作成します。特定のシートを選択すると、DataGridView.DataSourceを変更するだけです。 –
Graffito
@Graffitoそれはうまくいくように聞こえます、あなたはさらに助けてくださいできますか?私はすべての私の読書方法を廃止していますか?または、私はまだそれを編集することができます...あなたはいくつかのコードを持っている場合は共有してください。 –
dtexcelをリストとして定義します(変数はフォームに属し、nullに初期化されている必要があります)。 * oleDbAdapt = OleDbDataAdapter( "sheet" + sheetIndex + "1 $]"、con)*を初期化するときにエラー/例外が発生するまで、ReadExcel(リストを返します)でシートをループします。 dtexcelがnullの場合にのみReadExcelを呼び出します。そうでない場合、データ型は保持され、DataSourceとして使用することができます。別のExcelファイルを処理する前に、dtexcelをnullにリセットしてください。 –
Graffito