0

Estoy tratando de exportar un datagridview a excel, funciona perfecto en la primer línea pero cuando entra en la segunda me envía el error "Referencia a objeto no establecida como instancia de un objeto"

mi código es el siguiente:

 private void ExportToExcel()
        {
            // Creating a Excel object.
            Microsoft.Office.Interop.Excel._Application excel = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel._Workbook workbook = excel.Workbooks.Add(Type.Missing);
            Microsoft.Office.Interop.Excel._Worksheet worksheet = null;

            try
            {

                worksheet = workbook.ActiveSheet;

                worksheet.Name = "ExportedFromDatGrid";

                int cellRowIndex = 1;
                int cellColumnIndex = 1;

                //Loop through each row and read value from each column.
                for (int i = 0; i <= dataGridView1 .Rows.Count ; i++)
                {
                    for (int j = 0; j < dataGridView1 .Columns.Count; j++)
                    {
                        // Excel index starts from 1,1. As first Row would have the Column headers, adding a condition check.
                        if (cellRowIndex == 1)
                        {
                            worksheet.Cells[cellRowIndex, cellColumnIndex] = dataGridView1 .Columns[j].HeaderText;
                        }
                        else
                        {
                            j = 1;
                           worksheet.Cells[cellRowIndex, cellColumnIndex] = dataGridView1 .Rows[i].Cells[j].Value.ToString();
                        }
                        cellColumnIndex++;
                    }
                    cellColumnIndex = 1;
                    cellRowIndex++;
                }

                //Getting the location and file name of the excel to save from user.
                SaveFileDialog saveDialog = new SaveFileDialog();
                saveDialog.Filter = "Excel files (*.xlsx)|*.xlsx|All files (*.*)|*.*";
                saveDialog.FilterIndex = 2;

                if (saveDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    workbook.SaveAs(saveDialog.FileName);
                    MessageBox.Show("Export Successful");
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                excel.Quit();
                workbook = null;
                excel = null;
            }

        
        }
  • no se cuentas rows o columans tendras el grid pero recomendaria que iteres usando `foreach (var row in dataGridView1 .Rows){...` ya que al ierar por el valor deberias restar uno al Count, recuerda `i` comienza en cero, pero el Count seria uno mas – Leandro Tuttini Feb 07 '19 at 23:30

1 Answers1

1

quizá te funcione esto

            RegistryKey RK = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Office\\12.0");
        if (RK == null)
        {
            RK = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Office\\15.0");
        }

        if (RK != null)
        {
            try
            {
                //Encabezados del reporte
                DataTable ExcelTabla = new DataTable();
                for (int i = 0; i < GridAux.Columns.Count; i++)
                {
                    ExcelTabla.Columns.Add(GridAux.Columns[i].HeaderText);
                }

                //Datos del reporte
                for (int r = 0; r < GridAux.Rows.Count; r++)
                {
                    ExcelTabla.Rows.Add();
                    for (int c = 0; c < GridAux.Columns.Count; c++)
                    {
                        ExcelTabla.Rows[ExcelTabla.Rows.Count - 1][c] = (GridAux.Rows[r].Cells[c].Value != null ? GridAux.Rows[r].Cells[c].Value : "").ToString().Replace((char)(0x1F),' ');
                    }
                }

                //Tratamos de guardarlo
                SaveFileDialog fichero = new SaveFileDialog();
                fichero.Filter = "Excel (*.xlsx)|*.xlsx";
                fichero.FileName = name;
                if (fichero.ShowDialog() == DialogResult.OK)
                {
                    using (XLWorkbook wb = new XLWorkbook())
                    {
                        wb.Worksheets.Add(ExcelTabla, "Sheet1");
                        wb.SaveAs(fichero.FileName);
                    }
                    MessageBox.Show("Archivo exportado correctamente", "CORRECTO", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception xls)
            {
                MessageBox.Show("Error al exportar a excel: " + xls.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
        }
        else
        {
            MessageBox.Show("Error al exportar a excel: no tienes excel instalado", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
        }
Samael
  • 111
  • 5
  • 1
    Las respuestas que son solo codigo sin ninguna explicación se consideran de baja calidad. Igual, esta pregunta esta respondida ya por una respuesta generica. – gbianchi Feb 08 '19 at 16:49
  • 1
    quizá, pero el código esta mas que claro lo que hace, no vi mayor necesidad, pero gracias por el consejo. – Samael Feb 08 '19 at 16:57