2010-11-06 32 views
6

Necesito poder exportar algunos datos que se reciben de un procedimiento almacenado en SQL Server 2008. Una vez que se devuelven los datos, debo poder exportarlos o exportarlos a una nueva hoja de cálculo de Excel.C#: ¿Cómo exportar a una hoja de cálculo de Excel? usando XSLT/LINQ/Otros métodos?

¿Cuál es la forma más fácil de hacer esto? ¿Puede LINQ hacer esto? o me veo obligado a usar XSLT? Supongo que primero debo convertir mis datos devueltos a XML y luego aplicar XSLT, ya que XSLT funciona contra documentos XML.

XSLT 2 no está disponible en VS 2008, por lo que todavía tenemos que usar XSLT 1, pero ¿es realmente el camino a seguir o la mejor opción?

Creo que sería posible usar un método alternativo, pero tal vez estoy equivocado.

Realmente agradecería cualquier consejo, tutoriales, etc

Gracias

+1

¿Qué pasa con un archivo CSV simple? – dtb

Respuesta

7

para la salida a csv o xml realmente no necesita ninguna funcionalidad que no esté en xpath 1.0 ... es raro que me encontré con una situación que requería algo más complejo.

puede seleccionar en un elemento xe con linq ... sin embargo, hacer esto en una declaración significaría que no puede validar sus datos. Por lo general, termino iterando sobre una colección de elementos para manejar los casos extremos.

HOsimo poner como csv es mas facil y toma menos espacio que xml ... creo que xml es usado en exceso tbh.

Una alternativa (* y no lo recomiendo) sería consultar el servidor SQL desde dentro del documento de Excel. De ese modo, puede seleccionar sus datos directamente en una hoja de cálculo. Esto es bastante viejo y no me gusta mucho tbh.

+0

+1 por decir que XML/XSLT sería excesivo para esto, CSV es el camino a seguir. – Jazza

0

ADO.NET también tiene un controlador para Excel. Entonces, si sus datos son, naturalmente, una base de datos en "forma", probablemente los use.

Puede utilizar la interoperabilidad de Excel si desea hacer el formateo y aprovechar las capacidades de la hoja de cálculo de Excel, pero esto es probablemente demasiado "desordenado" para la transferencia de datos simple.

Además, como indica dtb, si se tratara de un archivo de datos simple de una sola tabla, podría usar el archivo CSV. Aunque no es Excel nativo, se puede importar fácilmente y suele ser la forma más fácil de obtener datos externos en Excel.

+0

creo que xml también funcionaría, pero probablemente tendría que ser un formato de tabla xml. No estoy seguro de cómo se comportaría si tuviera una estructura de objetos variada. –

0

Si necesita un paquete de .NET para escribir archivos de Excel, intente

NExcelAPI

para el formato de archivo de Excel de edad (< = 2,003), o

ExcelPackage

para la nueva Formato de Office Open XML. Para ambas bibliotecas no necesita tener Excel instalado.

EDIT: aquí es otro para el de más edad (Excel 2002/2003) XML formato de archivo basado

http://www.carlosag.net/Tools/ExcelXmlWriter/

1

Su posible empujar hacia afuera a Excel desde SQL Server.

insert into OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=D:\testing.xls;', 
    'SELECT * FROM [SheetName$]') select * from SQLServerTable 

Esto y más ejemplos están disponibles en this source.

0

Si tiene unos pocos dólares para gastar, he usado xPort Tools durante los últimos años y me ha complacido.

2

esto un código que exportar una gran variedad de objetos (se puede llenar fácilmente con sus datos) a un spreadsheat Excel:

public static void SaveToExcel(object[,] data) 
{ 
    Excel = Microsoft.VisualBasic.Interaction.CreateObject("Excel.Application", String.Empty); 
    Excel.ScreenUpdating = false; 
    dynamic workbook = Excel.workbooks; 
    workbook.Add(); 

    dynamic worksheet = Excel.ActiveSheet; 

    const int left = 1; 
    const int top = 1; 
    int height = data.GetLength(0); 
    int width = data.GetLength(1); 
    int bottom = top + height - 1; 
    int right = left + width - 1; 

    if (height == 0 || width == 0) 
     return; 

    dynamic rg = worksheet.Range[worksheet.Cells[top, left], worksheet.Cells[bottom, right]]; 
    rg.Value = data; 

    // Set borders 
    for (var i = 1; i <= 4; i++) 
     rg.Borders[i].LineStyle = 1; 

    // Set header view 
    dynamic rgHeader = worksheet.Range[worksheet.Cells[top, left], worksheet.Cells[top, right]]; 
    rgHeader.Font.Bold = true; 
    rgHeader.Interior.Color = 189 * (int)Math.Pow(16, 4) + 129 * (int)Math.Pow(16, 2) + 78; 
    rg.EntireColumn.AutoFit(); 

    // Show excel app 
    Excel.ScreenUpdating = true; 
    Excel.Visible = true; 
} 
Cuestiones relacionadas