Componente .NET para la generación de hojas de cálculo de Excel 2003 usando plantillas para formatear
-
05-07-2019 - |
Pregunta
El problema que mi aplicación está tratando de resolver es el siguiente:
Actualmente, se ejecutan varios procedimientos almacenados, los datos se copian manualmente de los resultados de SQL en una hoja de cálculo en blanco y los analistas de informes formatean los datos. Este proceso se ha considerado demasiado largo y costoso.
La solución ideal (en mi opinión) es una aplicación .NET con un componente que puede tomar el resultado de un procedimiento almacenado y escribirlo en un rango de celdas específico en una plantilla de hoja de trabajo (mantener el formato de la plantilla) y luego puedo cotejar el resultados en libros de trabajo en la aplicación .NET.
¿Hay tales aplicaciones por ahí? Aún mejor, ¿alguien tiene mejores soluciones?
Gracias por su consideración.
Solución
Lo que utilizo para configurar los datos
obtener los datos en forma de
object[,] excelSpreadsheetData
luego aplique los datos configurando
public void SetWorksheetData(long rowCount, long columnCount, object[,] excelSpreadsheetData, int startingRow, int startingCol, Worksheet worksheet)
{
if (rowCount == 0 || columnCount == 0) return;
//set the region data.
object m_objOpt = Missing.Value;
Range cellRange = worksheet.get_Range(ExcelGeneratorUtils.ExcelColumnFromNumber(startingCol) + startingRow, m_objOpt);
cellRange = cellRange.get_Resize(rowCount, columnCount);
cellRange.set_Value(m_objOpt, excelSpreadsheetData);
}
Esto debería mantener el formato de la plantilla, y establece los datos de una sola vez, mucho más rápido que configurando la celda, por celda.
Espero que ayude
Otros consejos
SpreadsheetGear for .NET le permitirá abrir libros de Excel, agregar valores y guardar el libro.
Puede ver ejemplos de informes de Excel (es decir, exportar a Excel) aquí y descargue una versión de prueba gratuita aquí .
Exención de responsabilidad: Soy propietario de SpreadsheetGear LLC
Siempre puedes usar Excel Automation a través de interoperabilidad. He hecho esto en ocasiones cuando la salida deseada es Excel. Es sorprendentemente rápido, pero debes tener cuidado de limpiar después de ti mismo y no dejar que se ejecuten las instancias de Excel. Aquí hay una breve muestra.
using Excel = Microsoft.Office.Interop.Excel;
Excel.ApplicationClass _Excel;
Excel.Workbook WB;
Excel.Worksheet WS;
_Excel = new Microsoft.Office.Interop.Excel.ApplicationClass();
WB = _Excel.Workbooks.Add(System.Reflection.Missing.Value);
WS = (Excel.Worksheet)WB.Worksheets[1];
WS.Name = "Test";
try
{
int row;
int col;
WS.Cells[++row, col] = "COL1";
WS.Cells[row, ++col] = "COL2";
WS.get_Range("A1", "A2").Font.Bold = true;
WS.get_Range("A1", "A2").HorizontalAlignment =Excel.XlHAlign.xlHAlignCenter;
WS.Cells[++row, col] = "Customer";
WS.Cells[++row, col] = "Expenses"
WS.get_Range("A1", "B1").Font.Bold = true;
WS.Columns.AutoFit();
WS.Rows.AutoFit();
WS.Activate();
_Excel.Visible = true;
}
catch (Exception ex)
{
WB.Close(false, Type.Missing, Type.Missing);
_Excel.Quit();
throw;
}
finally
{
GC.Collect();
GC.WaitForPendingFinalizers();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(WS);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(WB);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(_Excel);
}
En esta pregunta pedí algo similar. La diferencia es que quiero que algo genere un archivo XML que Excel interprete como una hoja de cálculo. Si pudiera enviar los datos a un archivo XML, luego transforme el XML a SpreadsheetML, entonces esto podría resolver su problema. Sin embargo, SpreadsheetXM tiene algunas limitaciones. No requerirá que se instale Excel y la transformación puede ser muy rápida. Y si usa Excel 2007, hay un segundo formato XML que puede usar, Microsoft Office XML formato. Básicamente, es lento porque sospecho que su código actual está interactuando con Excel a través de COM.