Ho alcuni dati tabulari che vorrei trasformare in una tabella di Excel.
Software disponibile:
Informazioni sui dati:
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.
In cima al module aggiungere:
using Microsoft.Office.Interop.Excel;
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)
Implementazione dell'esportzione
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" ); }