Amar chand123 Ответов: 1

Столбцы Datagridview не отображаются при экспорте данных в excel C# winform


я пытаюсь использовать этот код для экспорта данных datagridview в excel но каждый раз когда я экспортирую excel только экспорт строк datagridview

Что я уже пробовал:

private void button1_Click(object sender, EventArgs e)
{
    Excel.Application xlApp;
    Excel.Workbook xlWorkBook;
    Excel.Worksheet xlWorkSheet;
    object misValue = System.Reflection.Missing.Value;

    xlApp = new Excel.Application();
    xlWorkBook = xlApp.Workbooks.Add(misValue);
    xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
    int i = 0;
    int j = 0;

    for (i = 0; i <= dataGridView1.RowCount - 1; i++)
    {
        for (j = 0; j <= dataGridView1.ColumnCount - 1; j++)
        {
            DataGridViewCell cell = dataGridView1[j, i];
            xlWorkSheet.Cells[i + 1, j + 1] = cell.Value;
        }
    }
    
    xlWorkBook.SaveAs("Test.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
    xlWorkBook.Close(true, misValue, misValue);
    xlApp.Quit();

    releaseObject(xlWorkSheet);
    releaseObject(xlWorkBook);
    releaseObject(xlApp);
}

private void releaseObject(object obj)
{
    try
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
        obj = null;
    }
    catch (Exception ex)
    {
        obj = null;
        MessageBox.Show("Exception Occured While releasing object" + ex.ToString());
    }
    finally
    {
        GC.Collect();
    }
}

Richard MacCutchan

Запустите код в отладчике, чтобы убедиться, что он правильно подсчитывает количество столбцов.

Amar chand123

Количество столбцов правильно

Datagridview1.RowCount показать 8

Richard MacCutchan

Ну, вы должны дать нам еще несколько подсказок. Мы не можем догадаться, что происходит, когда вы запускаете код.

Amar chand123

У меня есть datagridview в datagridview data show из базы данных access. И в компоненте datagridview у меня есть 8 столбцов и 12 строк, и, если я использую closedxml на экспорт затем правильно экспортировать данные, но я не хочу использовать closedxml, потому что я не знаю, как я экспортирую же данных текстовое поле перед экспортом объекта datagridview данных

Richard MacCutchan

Очень интересно, но это все еще не объясняет, что на самом деле происходит, когда вы запускаете код. У меня есть приложение, которое делает почти то же самое: оно создает DataGridView и заполняет его данными из различных источников. При нажатии кнопки он сохраняет всю информацию в книге Excel. Так что ваш код должен делать то же самое, но я никак не могу догадаться, почему он этого не делает.

Amar chand123

Сэр, у вас есть какие-нибудь хорошие предложения? Как и те же коды для экспорта textbox и datagridview в экспорте

0x01AA

Не совсем понятно, в чем проблема. Вы хотите сказать, что не видите имен столбцов в excel?Если это так, то вам необходимо получить доступ к именам столбцов с помощью dataGridView1.Columns

Richard MacCutchan

DataGridViewCell cell = dataGridView1[j, i]; получает ячейку в строке i, столбце j, Поэтому она должна захватить все ячейки.

0x01AA

Включая имена столбцов, я имею в виду строку заголовка? Я так не думаю, может быть, попробую. Я бы сказал, что код OP возвращает только строки данных.

0x01AA

Поэтому я бы сказал, что строка заголовка должна обрабатываться отдельно, как описано здесь: Экспорт DataGridView В Excel На Языке C#[^]


// storing header part in Excel
for (int i = 1; i < dataGridView1.Columns.Count + 1; i++)
{
worksheet.Cells[1, i] = dataGridView1.Columns[i - 1].HeaderText;
}

Amar chand123

Я использую это но когда я использую этот столбец показать но первую строку заменить текстом заголовка столбца

0x01AA

Да, конечно. Вам нужно добавить еще один +1 для индекса строки после этого для строки excel.

xlWorkSheet.Cells[i + 1 + 1, j + 1] = cell.Value;

Amar chand123

Не работает я уже пробую но проблема в том что когда я использую это в моем файле excel в первой строке столбец show и во второй строке пустой show

0x01AA

Я почти уверен, что это работает, если вы не путаетесь с индексом. Еще раз внимательно проверьте исходный код.

Amar chand123

вот мой код


for (int i = 1; i < dataGridView1.Columns.Count + 1; i++)
{
xlWorkSheet.Ячейки[1, i] = dataGridView1.столбцы[i - 1].HeaderText;
}

for (int i = 1; i <= dataGridView1.Rows.Граф - 1; i++)
{
for (int j = 0; j <= dataGridView1.Columns.Количество - 1; j++)
{
Ячейка DataGridViewCell = dataGridView1[j, i];
xlWorkSheet.Ячейки[i + 1, j + 1] = ячейка.Ценность;
}
}

0x01AA

+1 больше для строки excel решит эту проблему:

xlWorkSheet.Cells[i + 1 + 1, j + 1] = cell.Value;

Amar chand123

спасибо за напоминание Я понимаю свою ошибку
for (int i = 1; i <= dataGridView1.Rows.Граф - 1; i++)
заменить на
for (int i = 0; i <= dataGridView1.Rows.Граф - 1; i++)

и это прекрасно работает

0x01AA

Мы всегда рады вам. И спасибо, что приняли мой ответ.

Amar chand123

Спасибо вам обоим сэр без ваших предложений я сам не понимаю проблемы

1 Ответов

Рейтинг:
4

0x01AA

Ведь комментарии к вопросу вот код, который работает.

// Column titles to Excel
for (int i= 0; i < dataGridView1.Columns.Count; i++)
{
   // Here i + 1 because Excel cell index starts at 1
   xlWorkSheet.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText;
}

// Data to Excel
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
   for (int j = 0; j < dataGridView1.Columns.Count; j++)
   {
      DataGridViewCell cell = dataGridView1[j, i];
      // Here i + 1 + 1. One +1 for excel index and another +1 for header row offset
      xlWorkSheet.Cells[i + 1 + 1, j + 1] = cell.Value;
   }
}


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


Maciej Los

5ed!

0x01AA

Спасибо, Мацей.