Задать вопрос
@Neks_Minor

Как записать в файл Excel только некоторые столбцы из dataGridView?

В контейнер dataGridView1 помещаю таблицу по SQL-запросу:
SELECT b.ID_B as 'ID', b.NAME_B as 'Название', b.AUTHOR_B as 'Автор', pb.NAME_PB as 'Издательство', b.YEAR_B as 'Год издания', g.NAME_G  as 'Жанр' FROM BOOK b JOIN PUBLISHERS pb ON pb.ID_PB = b.PUBLISH_B JOIN GENRE g ON g.ID_G = bOOK.GENRE_B ORDER BY ID_B

DataTable dt = FirebirdConnect.ExecuteQuery(sql_query, fbConn);
dataGridView1.DataSource = dt;
dataGridView1.Columns[0].Visible = false; // Т.к. мне не нужно, чтобы колонка ID выводилась в контейнере


выходит как-то так:
bdf7c2551f8e4e238ebdbf683c824ad3.png

Когда я сохраняю таблицу из контейнера в Excel-файл, у меня не выводится последняя строчка.

Для работы с Excel я использую библиотеку ClosedXML.

Собственно, проблема заключается только в том, что не выводится последняя строчка.

Вот код, который я использую, чтобы сохранить данные в Excel-файл:
public void Export_Data_To_Excel(string filePath)
        {
                DataTable dt = new DataTable();

                foreach (DataGridViewColumn column in dataGridView1.Columns)
                {
                    if (column.HeaderText!="ID")
                    dt.Columns.Add(column.HeaderText);
                }

                foreach (DataGridViewRow row in dataGridView1.Rows)
                {                    
                    dt.Rows.Add();
                    foreach (DataGridViewCell cell in row.Cells)
                    {
                        if ((dt.Rows.Count - 1) != 0)
                            if (cell.ColumnIndex != 0)
                                dt.Rows[dt.Rows.Count - 2][cell.ColumnIndex-1] = cell.Value.ToString();
                    }
                }

                using (XLWorkbook wb = new XLWorkbook())
                {
                    wb.Worksheets.Add(dt, "Test");
                    wb.SaveAs(filePath);
                }
}
  • Вопрос задан
  • 382 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@oufucom
Программист C#
dt.Rows.Add();
                    foreach (DataGridViewCell cell in row.Cells)
                    {
                        if ((dt.Rows.Count - 1) != 0)
                            if (cell.ColumnIndex != 0)
                                dt.Rows[dt.Rows.Count - 2][cell.ColumnIndex-1] = cell.Value.ToString();
                    }


Потому что вы пишите в предыдущую строку, а не в ту которую только что добавили.
dt.Rows.Count - 2
И из-за условия if ((dt.Rows.Count - 1) != 0)
Первый проход в цикле пропускается. строка где "Старик и море", просто игнорируется.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы