I am trying to save an excel that is created with the data in a list, but it does not save it. I would also like to know how to give that Excel a specific name, for example, what is it called "Respaldo " + Dia/Mes/Año
and how to make the file that is generated be .xlsx
and not .xls
.
Here is the code I am using:
private void btn_exportar_excel_Click(object sender, EventArgs e)
{
string ruta = "c:\\Respaldo";
SaveFileDialog fichero = new SaveFileDialog();
fichero.Filter = "Excel (*.xls)|*.xls";
IList<DTO_Inscripcion> inscripciones = svInscripcion.getInscripciones();
if (!Directory.Exists("c:\\Respaldo"))
{
Directory.CreateDirectory("c:\\Respaldo");
//Valido que la lista tenga valores para guardar
if (inscripciones != null && inscripciones.Count > 0)
{
// este try es para capturar algun error que pueda suceder al momento de crear y dar formato al Excel
try
{
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);
for (int i = 0; i < dgv_inscripciones.Rows.Count; i++)
{
for (int j = 0; j < dgv_inscripciones.Columns.Count; j++)
{
hoja_trabajo.Cells[i + 2, j + 1] = dgv_inscripciones.Rows[i].Cells[j].Value.ToString();
}
}
hoja_trabajo.Cells[1, "A"] = "Socio";
hoja_trabajo.Cells[1, "B"] = "Nombre";
hoja_trabajo.Cells[1, "C"] = "Apellido";
hoja_trabajo.Cells[1, "D"] = "Vencimiento";
hoja_trabajo.Cells[1, "E"] = "Estado";
hoja_trabajo.Cells[1, "F"] = "Fecha Pago";
//hoja_trabajo.Range["A5", "F5"].Merge();
hoja_trabajo.Range["A1", "F" + dgv_inscripciones.Rows.Count.ToString()].HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
hoja_trabajo.Range["A1", "F" + dgv_inscripciones.Rows.Count.ToString()].Font.Bold = true;
hoja_trabajo.Range["A1", "F" + dgv_inscripciones.Rows.Count.ToString()].Font.Size = 20;
//este try es para capturar algun error al momento de intentar guardar el archivo
try
{
libros_trabajo.SaveAs(ruta, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal);
libros_trabajo.Close(true);
aplicacion.Quit();
}
catch(Exception exsave)
{
MessageBox.Show("Error al intentar guardar el archivo", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch(Exception ex)
{
MessageBox.Show("Error al intentar generar el archivo Excel", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
MessageBox.Show("No hay datos para guardar", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
When I run the code I get the following exception and is caught by the first Catch:
System.Runtime.InteropServices.COMException: 'Microsoft Excel no puede obtener acceso al archivo 'c:\'. Puede haber varios motivos:
• El nombre o la ruta del archivo no existen.
• Otro programa está usando el archivo.
• El libro que está intentando guardar tiene el mismo nombre que otro libro que está abierto en estos momentos.'
Your code has several details that will have to be resolved so that it works correctly and achieves what you want, I will try to solve the aspects that I have been able to detect.
First of all, in the first
if
, you verify that the route does not exist and then you create it, but the whole export procedure is inside the blockif
, so if the route exists, no export will be performed, the export procedure must be removed of the blockif
.Below is the corrected and commented code.