【解決方法】C#でWindowsフォームを使用してExcelシートデータをdatagridviewにインポートする方法


ここでは、Microsoft Excelを使用していないため、接続文字列に問題が発生します。リストボックスが空として表示されます。そこで何が起こっているのかわかりませんが、作成された接続文字列は次のとおりです。

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\FFT-VS\Downloads\BKI13122023.xlsx;Extended Properties="Excel 12.0;HDR=NO;IMEX=1"

私が試したこと:

private void btn_ImpData_Click(object sender, EventArgs e)
       {
           openFileDialog1.Filter = "Excel files (*.xls*, *.xlsx)|*.xls*; *.xlsx";
           openFileDialog1.ShowDialog();

       }
 public void ImportFromExcel(string filename, DataGridView rgvGrid)
        {
            string sConnectionString = "";
            string[] Arr = null;
            Arr = filename.Split('.');
            string _OriginalType = "", _Type = "";
            try
            {
                _OriginalType = checkfiletype(filename);
                _Type = checkfileext(filename);

                sConnectionString = connectionstringwithoutheader(_Type, filename, filename, filename);

                if (_OriginalType == "html")
                {
                    htmlformatrendering_tempfile(filename, rgvGrid);
                    htmlformatrendering_base_Preview(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\IIMS\\data\\temp.html", rgvGrid, 1000);
                }
                else if (_OriginalType == ".xls" || _OriginalType == ".xlsx")
                {

                    lst_Sheets.Items.Clear();
                    filllistbox(lst_Sheets, sConnectionString);
                    fillGrid_reader_preview(lst_Sheets.SelectedItem.ToString().Trim(), rgvGrid, 1000, sConnectionString);
                }

                //end
                //sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
                //                   filename + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
                //OleDbConnection cn1 = new OleDbConnection(sConnectionString);
                //cn1.Open();

            }
            catch (Exception ex)
            {
                ////sConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties='Excel 12.0 Xml;HDR=YES';";
            }
}

public void filllistbox(ListBox lst1, string connectionstring)
      {
          try
          {
              lst1.Items.Clear();


              conn = new OleDbConnection(connectionstring);
              if (conn.State == ConnectionState.Closed)
              {
                  conn.Open();
              }
              string[] restrictionForTable = new string[] { null, null, null, "TABLE" };
              DataTable dataTable1 = conn.GetSchema("TABLES", restrictionForTable);

              //counting number of rows in numberOfRows
              int numberOfRows = dataTable1.Rows.Count;
              object[] obj = new object[99];

              // adding number of tables in combobox
              for (int i = 0; i < numberOfRows; i++)
              {
                  obj = dataTable1.Rows[i].ItemArray;
                  lst1.Items.Add((string)obj[2]);
              }

              string str = (string)lst1.SelectedItem;
              lst1.SelectedIndex = 0;
              // cmb1.Text = (string)cmb1.SelectedItem;
          }
          catch (System.NullReferenceException)
          {
              //tmp1.logfileentry("Error Code :filllistbox: FFC-0053N - " + "Null Exception");

          }
          catch (Exception ex1)
          {
              //tmp1.logfileentry("Error Code :filllistbox: FFC-0053E - " + ex1.ToString());

          }
          finally
          {
              conn.Close();
          }

      }

public void fillGrid_reader_preview(string cmb1string, DataGridView dgv1, int previewrow, string connectionstring)
       {
           OleDbCommand command1 = new OleDbCommand();
           OleDbDataReader reader = null;
           try
           {
               dgv1.Columns.Clear();
               dgv1.Rows.Clear();
               dgv1.DataSource = null;
               conn = new OleDbConnection(connectionstring);
               if (conn.State == ConnectionState.Closed)
               {
                   conn.Open();
               }

               string str = "select Top " + previewrow + " * from [" + cmb1string + "]";
               command1.CommandText = str;

               if (conn.State == ConnectionState.Closed)
               {
                   conn.Open();
               }

               command1.Connection = conn;


               reader = command1.ExecuteReader(CommandBehavior.CloseConnection);


               for (int i = 0; i < reader.FieldCount; i++)
               {
                   dgv1.Columns.Add(Convert.ToString(i + 1), Convert.ToString(i + 1));
               }

               // adding number of tables in combobox
               int row1 = 0;

               while (reader.Read())
               {
                   if (dgv1.Rows.Count < previewrow)
                   {
                       dgv1.Rows.Add();

                       for (int is12 = 0; is12 < reader.FieldCount; is12++)
                       {

                           dgv1[is12, row1].Value = reader[is12].ToString();
                       }
                       row1++;
                   }
                   else
                   {
                       break;
                   }

               }


           }
           catch (System.NullReferenceException)
           {
               //tmp1.logfileentry("Error Code :fillGrid_reader_preview: FFC-0047N - " + "Null Exception");

           }
           catch (Exception ex1)
           {
               //tmp1.logfileentry("Error Code :fillGrid_reader_preview: FFC-0047E - " + ex1.ToString());


           }
           finally
           {
               reader.Dispose();
               command1.Dispose();
               conn.Close();

           }


       }

解決策 1

見る MDAC と Oledb を使用した MS Excel(xls / xlsx) の操作[^] Excel ワークシートを DataGridView にインポートする方法の詳細については、「DataGridView に Excel ワークシートをインポートする方法」を参照してください。

解決策 2

まず、なぜ使うのかというと、 IMEX=1? これにより、Excel はすべてのデータをテキストとして扱います。
詳細については、以下をお読みください。 データをテキストとして扱う – Microsoft.ACE.OLEDB.12.0 – ConnectionStrings.com[^]

次に、なぜすべてのデータを (一度に) 取得するのではなく、一部のデータを取得しようとするのでしょうか? そして… シート名や名前付き範囲は正しく記述されていますか?

C#
string str = "select Top " + previewrow + " * from [" + cmb1string + "]";

例を見てみましょう。

SQL
SELECT [Column Name One], [Column Name Two] FROM [Sheet One$]

ご覧のとおり、Excel ワークシート名の後には「$」が続き、「」で囲まれています。[” “]”ブラケット。
セル A3 から D5000 までのデータの読み取りを開始する場合は、次を使用します。

SQL
SELECT * FROM [Sheet1$A3:D5000]

最後に、こう書くことをお勧めします ダル[^]。 このオブジェクトは、接続の作成やプロセスに役立ちます。 クラッド[^] 操作して接続を閉じます。

コメント

タイトルとURLをコピーしました