Экспорт данных DataGridView в Excel - PullRequest
6 голосов
/ 23 июня 2011

В моем приложении я экспортирую данные DataGridView в таблицу Excel, теперь хочу передать выбранные значения в выпадающем списке и текстовом поле в таблицу Excel, и мне нужно дать заголовок моей таблице Excel в виде отчета для моего приложения Windows. Как я могу это сделать??

Может ли кто-нибудь помочь мне в этом?

У меня есть код для экспорта данных таблицы данных в Excel:

private void btnexcel_Click(object sender, EventArgs e)    
{

  Excel.Application xlApp;    
  Excel.Workbook xlWorkBook;    
  Excel.Worksheet xlWorkSheet;

  object misValue = System.Reflection.Missing.Value;

  xlApp = new Excel.ApplicationClass();

  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("csharp.net-informations.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);

  MessageBox.Show("Excel file created , you can find the file c:\\csharp.net-informations.xls");

}


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


}
}

Ответы [ 2 ]

0 голосов
/ 05 мая 2014
    private void ExportarDataGridViewExcel(DataGridView grd)
    {
        SaveFileDialog fichero = new SaveFileDialog();
        fichero.Filter = "Excel (*.xls)|*.xls";
        fichero.FileName = "export.xls";
        if (fichero.ShowDialog() == DialogResult.OK)
        {
            Microsoft.Office.Interop.Excel.Application aplicacion;
            Microsoft.Office.Interop.Excel.Workbook libros_trabajo;
            Microsoft.Office.Interop.Excel.Worksheet hoja_trabajo;
            aplicacion = new Microsoft.Office.Interop.Excel.Application();
            libros_trabajo = aplicacion.Workbooks.Add();
            hoja_trabajo =
                (Microsoft.Office.Interop.Excel.Worksheet)libros_trabajo.Worksheets.get_Item(1);

            // changing the name of active sheet
            hoja_trabajo.Name = "Exported from App";
            // storing header part in Excel
            for (int i = 1; i < grd.Columns.Count + 1; i++)
            {
                hoja_trabajo.Cells[1, i] = grd.Columns[i - 1].HeaderText;
            }

            //Recorremos el DataGridView rellenando la hoja de trabajo
            for (int i = 1; i < grd.Rows.Count + 1; i++)
            {
                for (int j = 0; j < grd.Columns.Count; j++)
                {
                    hoja_trabajo.Cells[i + 1, j + 1] = grd.Rows[i-1].Cells[j].Value.ToString();
                }
            }
            libros_trabajo.SaveAs(fichero.FileName,
                Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal);
            libros_trabajo.Close(true);
            aplicacion.Quit();
        }
    }

   //in the click event of button1
    private void button1_Click(object sender, EventArgs e)
    {
        ExportarDataGridViewExcel(dataGridView1);
    }  
0 голосов
/ 23 июня 2011

В коде, где вы берете информацию о ячейке DataGridView, свойство Value дает вам ValueMember для ячейки comboBox, а не DisplayMember в comboBox. Вместо этого вам нужно получить доступ к FormattedValue (который вы можете использовать для всех своих ячеек).

Вот код, показывающий, как это сделать (наряду с некоторыми другими небольшими улучшениями):

for (int i = 0; i < dataGridView1.RowCount; i++)
{
    if (!dataGridView1.Rows[i].IsNewRow)
    {
        for (int j = 0; j < dataGridView1.ColumnCount; j++)
        {        
            DataGridViewCell cell = dataGridView1[j, i];
            MessageBox.Show(cell.FormattedValue.ToString());                    
        }
    }
}

Там я просто беру FormattedValue и отображаю его в MessageBox, но вы можете просто назначить его своей ячейке.

Я также использовал немного более компактный синтаксис для циклов и добавил в проверку NewRow сетки (которая может содержать нулевые значения, которые могут сломать вещи).


Кроме того, одна полезная вещь, которую нужно знать, это то, что, получив ячейку, вы можете получить фактический тип ячейки, например:

if (cell is DataGridViewComboBoxCell)

И это дает вам больше возможностей для работы при решении проблем. В качестве окончательного варианта вы даже можете получить доступ к EditingControl (фактическому DropDown в ComboBoxColumn), и опять же, это дает намного больше возможностей.

Вам не нужно это в вашем случае, но о них полезно знать.

...