Как импортировать указанные c значения ячеек Excel в существующие ячейки таблицы данных в C# - PullRequest
0 голосов
/ 10 января 2020

У меня проблемы с обновлением существующего представления данных, загруженного данными из mysql, с указанием c значений ячеек Excel (не листов Excel), импортированных из Excel. Доступные решения сшиваются для импорта всего листа и замены существующего представления данных. А другие просто делают столбец пустым.

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());
    }
}

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Я все еще не понимаю, что вы пытаетесь сделать. Из того, что я могу расшифровать, есть DataGridView, который имеет DataSource. DataSource - это DataTable, который создается из запроса к базе данных. Кроме того, есть книга Excel, в которой есть данные, которые вы хотите использовать для «перезаписи» или добавления к DataGridView… это неясно.

Из ваших комментариев я предполагаю, что вы хотите открыть Excel файл и читать только определенную часть рабочей книги. Как уже отмечалось, опубликованный код читает весь лист с именем «Лист1». Если это правильно, тогда основное внимание будет уделено чтению только определенной части рабочей книги.

В своем описании вы заявляете, что хотите получить… ”, заданные c значения ячеек Excel (не листы Excel) ) импортировано из Excel ”? … Это звучит странно, поскольку каждая ячейка в рабочей книге находится на «рабочем листе». Поэтому, если вы хотите получить указанные c ячейки из рабочей книги ... тогда вы ДОЛЖНЫ также указать рабочую таблицу.

Из моих тестов это выполнимо с помощью 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 имеет неприятную привычку сообщать о ячейках, как о «содержащих» значение, когда они этого не делают. Например, используя приведенные выше операторы выбора на существующем листе Excel, в котором только 1000 строк данных, возвращено 49 999 строк. Я создал новую книгу и добавил некоторые данные, а приведенная выше команда вернула только те ячейки, которые содержали данные. Суть в том, что ... если вы используете эту стратегию, может быть разумно проверить, что возвращается. Я уверен, что это станет очевидным, когда Fill займет 15 секунд или более.

Другой подход заключается в выборе ячеек с использованием определения типа диапазона в Excel. Что-то вроде ...

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

Здесь вы можете определить диапазон ячеек. Недостатком здесь является то, что столбцы должны быть смежными, или, по крайней мере, я не смог создать несмежные диапазоны. Я понимаю, что вы можете использовать «определенный» именованный диапазон из рабочей книги, однако я не смог этого достичь.

После того, как у вас есть эти ячейки, я не уверен, как вы будете сопоставлять каждую строку со строками в сетка, однако я предполагаю, что это будет следующим шагом.

Надеюсь, это поможет.

0 голосов
/ 10 января 2020

Попробуйте запросить столбец непосредственно в команде OLEDB:

OleDbCommand OleCon = new OleDbCommand("SELECT * FROM [" + name + " Index$AB]", Con);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...