С#: выбор нескольких данных из листа excel в datagridview

Я пытаюсь импортировать выбранные строки из листа Excel в datagridview. В ходе поиска я узнал, что метод OLEDB предназначен для импорта данных. Диапазон ячеек, которые я могу импортировать, но если у меня есть огромный лист Excel и я хочу импортировать только ограниченные столбцы, например, c6: c10 и d6: d10. Как я могу достичь этого? мой код выглядит следующим образом:

public void demoread (string FileName, string SheetName, string StartCell, string EndCell)
{
    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    System.Data.DataTable dt = new System.Data.DataTable();
    OleDbConnection cn = new OleDbConnection { ConnectionString = ConnectionString(FileName, "No") };

    try
    {
        List<string> jop = new List<string>();
        cn.Open();
         string SelectStatement = string.Format(@"SELECT * FROM [{0}${1}:{2}]", SheetName, StartCell, EndCell);
        //OleDbDataAdapter mydataadapter = new OleDbDataAdapter("Select * from [" + "Salary Sheet" + "$B4:H10 +$c7:c10]", cn);
        //mydataadapter.Fill(dt);
        //dataGridView1.DataSource = dt;
        //string[] data = dt.;

        OleDbCommand cmd = new OleDbCommand { CommandText = SelectStatement,Connection = cn };
        OleDbDataReader dr = cmd.ExecuteReader();

          if (dr.HasRows)
          {
              while (dr.Read())
              {

                for (int i = 0; i < 100; i++)
                {

                    MessageBox.Show(dr.GetString(0));
                    jop[i] = dr.GetString(0).ToString();
                    // MessageBox.Show(dr.GetString(0));

                    // dataGridView1.DataSource = dr;
                }
              }
          }
          else
          {
              //Console.WriteLine("No rows!!!");
          }

    }
    catch(Exception er)
    {
        MessageBox.Show(er.ToString());
    }
}       

в комментариях я также пробовал с командой oledbdataadapter. Я даже пытался сохранить результаты в определенном списке, чтобы позже использовать их как одну таблицу данных в datagridview. Пожалуйста, помогите мне, и даже если мой подход правильный.


person pranjal khanduri    schedule 22.05.2017    source источник


Ответы (2)


Следующее даст вам то, что вы хотите, если я правильно понял вашу проблему:

string excelConnectString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\...\\Book2.xlsx;Extended Properties=\"Excel 12.0 Xml;HDR=NO\";";

OleDbConnection objConn = new OleDbConnection(excelConnectString);
OleDbCommand objCmd1 = new OleDbCommand("Select * From [Sheet1$C6:C10]", objConn);
OleDbCommand objCmd2 = new OleDbCommand("Select * From [Sheet1$D6:D10]", objConn);

OleDbDataAdapter objDatAdap = new OleDbDataAdapter();
objDatAdap.SelectCommand = objCmd1;
DataTable dt = new DataTable();
objDatAdap.Fill(dt);

objDatAdap.SelectCommand = objCmd2;
DataTable dt2 = new DataTable();
objDatAdap.Fill(dt2);

dt.Merge(dt2);

Правильный подход или нет, зависит от вашего приложения и требований. Если это просто чтение данных, то использование OleDb в порядке. Но если вы хотите узнать об используемых стилях и многом другом, то OleDb не подходит, и вам, вероятно, следует изучить OpenXML.

person FortyTwo    schedule 22.05.2017

Вы можете выполнять операции с файлом Excel так же, как и с любой базой данных, поэтому вы можете выполнять запрос типа SELECT TOP 5 * FROM..

Я не уверен в чтении строк в определенном диапазоне, но если вы хотите прочитать начальные строки, вы можете сделать что-то вроде

 string SelectStatement = string.Format(@"SELECT TOP {0} * FROM [{1}${2}:{3}]", numOfTopRowsToRead, SheetName, StartCell, EndCell);
person Krishnan    schedule 22.05.2017
comment
да, что я сделал, я вызвал свою демонстрационную функцию чтения (RENAMED: Excel_Read) отдельно для каждого диапазона ячеек Excel_Read(textBox1.Text, "Salary Sheet", "D3", "E3", 8); Excel_Read(textBox1.Text, "Salary Sheet", "c5", "c12",0); и сохранил значения в списке. а позже поместите его в datagridview, используя свойство datatable. . - person pranjal khanduri; 23.05.2017