Export DataGridView data to excel

2020-04-05 08:05发布

In my application I'm exporting DataGridView data to excel sheet now I want to pass the combobox and textbox selected values to excel sheet and I have to give title to my excel sheet as Report for my windows application how can I do that?

Can anyone help me on this?

I have code for exporting datagridview data to 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条回答
干净又极端
2楼-- · 2020-04-05 08:29

In the code where you take the DataGridView cell information the Value property is giving you the ValueMember for the comboBox cell rather than the DisplayMember in the comboBox. Instead you need to access the FormattedValue (which you can actually use for all your cells).

Here is some code showing how to do this (along with some other small improvements):

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

There I just take the FormattedValue and display it with a MessageBox but for you you can simply assign it to your cell.

I've also used a slightly more compact syntax for the loops, and added in a check for the NewRow of the grid (which can contain null values which might break things).


Also, one useful thing to know is that once you have the cell, you can get the actual type of the cell like so:

if (cell is DataGridViewComboBoxCell)

And that gives you more options to work with when solving problems. As a final option you can even access the EditingControl (the actual DropDown in a ComboBoxColumn) and again this gives a lot more options.

You shouldn't need this in your case, but they are useful to know about.

查看更多
可以哭但决不认输i
3楼-- · 2020-04-05 08:48
    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);
    }  
查看更多
登录 后发表回答