3ENGINE

Programación y otros cachivaches

Etiqueta: office

Tecnologia

Cómo generar archivos Excel en C# con Open XML


Office Open XML es un formato de archivo abierto y estándar cuyas extensiones más comunes son .docx, .xlsx y .pptx. Principalmente contiene datos en XML comprimidos en un .zip. .NET dispone de librerias capaces de trabajar con este formato y de esta manera prescindir de instalar Office y sus temidas Microsoft.Office.Interop.

Generar archivos Excel en C# con Open XML

Para la demo es necesario instalar el paquete DocumentFormat.OpenXml:

generar archivos Excel en C# con Open XML

O desde la consola de Nuget:

Install-Package DocumentFormat.OpenXml 

El código es el siguiente:

 
namespace SaveExcelApp
{
    public static class SaveExcel
    {
        
        public static void BuildExcel(DataTable dataTable, string ExcelPath)        
        {
            using (SpreadsheetDocument myWorkbook = 
                SpreadsheetDocument.Create(ExcelPath, 
                SpreadsheetDocumentType.Workbook))
            {
                // workbook Part
                WorkbookPart workbookPart = myWorkbook.AddWorkbookPart();
                var worksheetPart = workbookPart.AddNewPart();
                string relId = workbookPart.GetIdOfPart(worksheetPart);

                // file Version
                var fileVersion = new FileVersion { ApplicationName = "Microsoft Office Excel" };

                // sheets               
                var sheets = new Sheets();
                var sheet = new Sheet { Name = dataTable.TableName, SheetId = 1, Id = relId };
                sheets.Append(sheet);

                // data
                SheetData sheetData = new SheetData(CreateSheetData(dataTable));

                // add the parts to the workbook and save
                var workbook = new Workbook();
                workbook.Append(fileVersion);
                workbook.Append(sheets);
                var worksheet = new Worksheet();
                worksheet.Append(sheetData);
                worksheetPart.Worksheet = worksheet;
                worksheetPart.Worksheet.Save();
                myWorkbook.WorkbookPart.Workbook = workbook;
                myWorkbook.WorkbookPart.Workbook.Save();
                myWorkbook.Close();
            }
        }

        private static List CreateSheetData(DataTable dataTable)
        {
            List elements = new List();

            // row header
            var rowHeader = new Row();
            Cell[] cellsHeader = new Cell[dataTable.Columns.Count];
            for (int i = 0; i < dataTable.Columns.Count; i++)
            {
                cellsHeader[i] = new Cell();
                cellsHeader[i].DataType = CellValues.String;
                cellsHeader[i].CellValue = new CellValue(dataTable.Columns[i].ColumnName);
            }
            rowHeader.Append(cellsHeader);
            elements.Add(rowHeader); 
            
           // rows data
           foreach (DataRow rowDataTable in dataTable.Rows)
           {     
                var row = new Row();
                Cell[] cells = new Cell[dataTable.Columns.Count];

                for (int i = 0; i < dataTable.Columns.Count; i++)
                {
                    cells[i] = new Cell();
                    cells[i].DataType = CellValues.String;
                    cells[i].CellValue = new CellValue((string)rowDataTable[i]);
                }
                row.Append(cells); 
                elements.Add(row);            
            }                      
            return elements;
        }
    }
}

Para mi demo los datos que deseo guardar en el archivo Excel los tengo en un DataTable. Al método BuildExcel se le pasa el DataTable con los datos y la ruta completa del archivo Excel a generar. El método CreateSheetData se encarga de leer los datos del DataTable y generar las celdas. El nombre de la hoja Excel se obtiene del nombre de la tabla.

Se trata de un código sencillo pero que puede servir como punto de partida.

Y ahora una pequeña demo:

var demoTable = new DataTable("mi demo");
demoTable.Columns.Add("name");
demoTable.Columns.Add("surname");
demoTable.Columns.Add("favorite color");
demoTable.Rows.Add(new Object[] { "David", "Miro", "blue" });
demoTable.Rows.Add(new Object[] { "Pablo", "Iglesias", "yellow" });
demoTable.Rows.Add(new Object[] { "Ratoncito", "Perez", "green" });
SaveExcel.BuildExcel(demoTable, "demo.xlsx");

Y el archivo generado:

generar archivos Excel en C# con Open XML

Enlace a la demo: SaveExcel.zip




Tecnologia

Ejecutar una macro externa en un .csv de Excel y grabar el resultado en formato .xls de Excel


Si necesitais darle un poco de vida y colorido a un fichero en formato .csv de Excel. Quizas os sirva este ejemplo. Se trata de ejecutar una macro previamente grabada para darle un nuevo formato a la hoja Excel (colorear columnas, cambiar de tamaño las letras, crear gráficos, etc…) para despues grabar el resultado en formato .xls. Comparto este código escrito en c# por si puede ser útil.

Requisito 1: antes de ejecutar el código es importante habilitar la opción «Confiar en el acceso a proyectos de Visual Basic» en la pestaña «Editores de confianza» que se encuentra en Herramientas>Macro> Seguridad.

Requisito 2: debeis tener instaladas las PIAS para Excel.

Código:


    using Microsoft.Office.Interop.Excel;
    using Microsoft.Vbe.Interop;
    .
    .
    public static class MacroExcel
    {
        /*
         * ejecuta macro sobre un csv y devuelve path del xls resultante
         */        public static string abrirCsvEjecutarMacroyGrabarXls(string pathFicheroCsv, string pathMacro, string nombreFuncionMacro)
        {            
            object missing = System.Reflection.Missing.Value;
            string pathXls = Path.ChangeExtension(pathFicheroCsv, "xls");
            //
            // abrir csv
            //
            ApplicationClass excel = new ApplicationClass();
            Workbooks books = excel.Workbooks;
            _Workbook book = books.Open(pathFicheroCsv, missing, missing, missing, missing, missing, missing, missing, missing,
                            missing, missing, missing, missing, missing, missing);
            try
            {
                //                      
                // abrir macro
                //
                VBComponentClass vbComp = (VBComponentClass)excel.VBE.ActiveVBProject.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule);
                vbComp.CodeModule.AddFromFile(pathMacro);
                //
                // ejecutar macro
                // 
                excel.Run(nombreFuncionMacro, missing, missing, missing, missing, missing, missing, missing,
                    missing, missing, missing, missing, missing, missing, missing, missing, missing, missing,
                    missing, missing, missing, missing, missing, missing, missing, missing, missing, missing,
                    missing, missing, missing);
                //
                // eliminar la macro del xls
                //
                vbComp.CodeModule.DeleteLines(1, vbComp.CodeModule.CountOfLines);
                //
                // grabar xls
                //
                File.Delete(pathXls);
                book.SaveAs(pathXls, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, missing,
                    missing, missing, missing, XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing);
            }
            finally
            {
                books.Close();
            }
            return pathXls;
        }
    }

Referencias:
Enlace 2
Enlace 1




Tecnologia

Ocultar/mostrar filas/columnas en un documento Excel


Puedes ocultar o mostrar filas y/o columnas Excel con estas siguientes combinaciones de teclas:

  • Ocultar Fila:     Ctrl + 9
  • Mostrar Fila:     Ctrl + Shift + 8
  • Ocultar Columna:  Ctrl + 0
  • Mostrar Columna:  Ctrl + Shift + 9