Qual è il modo più semplice per creare una tabella di Excel con C #?

Ho alcuni dati tabulari che vorrei trasformare in una tabella di Excel.

Software disponibile:

  • .NET 4 (C #)
  • Excel 2010 (utilizzando l'API di Excel è OK)
  • Preferisco non utilizzare librerie di terze parti

Informazioni sui dati:

  • Un paio di milioni di righe
  • 5 colonne, tutte le stringhe (struttura molto semplice e regolare della tabella)
  • Nel mio script sto attualmente utilizzando una struttura dati nidificata di dati, ma posso modificarla
  • La performance dello script non è critica

La ricerca online offre tanti risultati, e sono confuso se devo utilizzare OleDb, ADO RecordSets o qualcos'altro. Alcune di queste tecnologie sembrano overkill per il mio scenario, e alcuni sembrano che potrebbero essere obsoleti.

Qual è il modo più semplice per farlo?

Modifica : questo è uno script di una volta che ho intenzione di eseguire dal mio desktop atteso.

Onorando la tua richiesta di evitare strumenti di terze parti e utilizzando oggetti COM, ecco come farlo.

  1. Aggiungi riferimento al progetto: Com object Microsoft Excel 11.0.
  2. In cima al module aggiungere:

    using Microsoft.Office.Interop.Excel; 
  3. Aggiungere una logica di events come questa:

     private void DoThatExcelThing() { ApplicationClass myExcel; try { myExcel = GetObject(,"Excel.Application") } catch (Exception ex) { myExcel = New ApplicationClass() } myExcel.Visible = true; Workbook wb1 = myExcel.Workbooks.Add(""); Worksheet ws1 = (Worksheet)wb1.Worksheets[1]; //Read the connection string from App.Config string strConn = System.Configuration.ConfigurationManager.ConnectionStrings["NewConnString"].ConnectionString; //Open a connection to the database SqlConnection myConn = new SqlConnection(); myConn.ConnectionString = strConn; myConn.Open(); //Establish the query SqlCommand myCmd = new SqlCommand("select * from employees", myConn); SqlDataReader myRdr = myCmd.ExecuteReader(); //Read the data and put into the spreadsheet. int j = 3; while (myRdr.Read()) { for (int i=0 ; i < myRdr.FieldCount; i++) { ws1.Cells[j, i+1] = myRdr[i].ToString(); } j++; } //Populate the column names for (int i = 0; i < myRdr.FieldCount ; i++) { ws1.Cells[2, i+1] = myRdr.GetName(i); } myRdr.Close(); myConn.Close(); //Add some formatting Range rng1 = ws1.get_Range("A1", "H1"); rng1.Font.Bold = true; rng1.Font.ColorIndex = 3; rng1.HorizontalAlignment = XlHAlign.xlHAlignCenter; Range rng2 = ws1.get_Range("A2", "H50"); rng2.WrapText = false; rng2.EntireColumn.AutoFit(); //Add a header row ws1.get_Range("A1", "H1").EntireRow.Insert(XlInsertShiftDirection.xlShiftDown, Missing.Value); ws1.Cells[1, 1] = "Employee Contact List"; Range rng3 = ws1.get_Range("A1", "H1"); rng3.Merge(Missing.Value); rng3.Font.Size = 16; rng3.Font.ColorIndex = 3; rng3.Font.Underline = true; rng3.Font.Bold = true; rng3.VerticalAlignment = XlVAlign.xlVAlignCenter; //Save and close string strFileName = String.Format("Employees{0}.xlsx", DateTime.Now.ToString("HHmmss")); System.IO.File.Delete(strFileName); wb1.SaveAs(strFileName, XlFileFormat.xlWorkbookDefault, Missing.Value, Missing.Value, Missing.Value, Missing.Value, XlSaveAsAccessMode.xlExclusive, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value); myExcel.Quit(); } 

Evitare di utilizzare COM integerp a tutti i costi. Utilizza un'API di terze parti. Veramente. Infatti, se stai facendo questo lato server, devi praticamente farlo. Ci sono molte opzioni gratuite. Consiglio vivamente l'utilizzo di EPPlus, ma sono disponibili anche soluzioni a livello enterprise. Ho usato EPPlus un importo equo, e funziona ottimamente. A differenza di integerp, consente di generare i file Excel senza richiedere che Excel sia installato sulla macchina, il che significa anche che non si deve preoccupare degli oggetti COM che si attaccano come processi di background. Anche con un appropriato smaltimento degli oggetti, i processi Excel non sempre terminano.

http://epplus.codeplex.com/releases/view/42439

So che hai detto di voler evitare le librerie di terze parti, ma sono veramente la strada da percorrere. Microsoft non consiglia di automatizzare Office. Non è affatto destinato ad essere automatizzato comunque.

http://support.microsoft.com/kb/257757

Tuttavia, si consiglia di riconsiderare l'inserimento di "un paio di milioni di righe" in un singolo foglio di calcolo.

Una volta ho letto che il modo più semplice per creare una tabella di Excel era quello di scrivere in realtà una tabella HTML, compresa la struttura e i dati, e semplicemente denominare il file .xls .

Excel sarà in grado di convertire, ma visualizzerà un avviso che indica che il contenuto non corrisponde all'estensione.

Alcune cose per la tua considerazione …

Se si tratta di una soluzione lato client, non c'è niente di sbagliato nell'uso di Interop. Se si tratta di una soluzione lato server, non utilizzare Interop. Buona alternativa è OpenXML SDK da Microsoft se non si desidera una soluzione di terze parti. È gratis. Credo che l'ultimo ha un model di oggetti simili che Excel possiede. E 'molto più veloce, un LOTTO, nel generare la cartella di lavoro rispetto al modo integerperante che può bloccare il tuo server.

Sono d'accordo che un dll di terza parte sarebbe più pulito del com, ma se andate al path integerp …

Le mani in giù il modo migliore per popolare un foglio di excel è quello di mettere i dati in un arrays di stringhe 2 dimensionali, quindi get un object di excel gamma con le stesse size e impostarlo (range.set_value2 (oarrays) penso). L'utilizzo di qualsiasi altro metodo è orribilmente lento.

Anche assicurarsi di utilizzare il codice di pulizia appropriato nel tuo block finale.

ho implementato "esport in Excel" con il ms-access-ole-db-driver che può anche leggere e scrivere file excel il modo follwoing:

preparazione (fatta una volta)

  • creare un file excel che contiene tutto (intestazione, formattazione, formule, diagrammi) con un'area dati vuota come model da compilare
  • dare all'area dati (incluse le intestazioni) un nome (ad esempio "MyData")

Implementazione dell'esportzione

  • copiare il file di model nella cartella di destinazione
  • aprire una connessione del database oledb al file di destinazione
  • utilizzare sql per inserire dati

Esempio

 Excel table with Named area "MyData" Name, FamilyName, Birthday open System.Data.OleDb.OleDbConnection execute sql "Insert into MyData(Name, FamilyName, Birthday) values(...)" 

Ho usato questa string di connessione

 private const string FORMAT_EXCEL_CONNECT = // @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR={1}"""; @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0;HDR={1}"""; private static string GetExcelConnectionString(string excelFilePath, bool header) { return string.Format(FORMAT_EXCEL_CONNECT, excelFilePath, (header) ? "Yes" : "No" ); }