Crea file Excel (.XLS e .XLSX) da C #

Come posso creare un foglio di calcolo Excel con C # senza che Excel debba essere installato sulla macchina su cui è in esecuzione il codice?

È ansible utilizzare una libreria denominata ExcelLibrary. È una libreria open source gratuita pubblicata su Google Code:

ExcelLibrary

Questo sembra essere una porta del PHP ExcelWriter che hai menzionato sopra. Non scriverà ancora nel nuovo formato .xlsx, ma stanno lavorando per aggiungere tale funzionalità.

È molto semplice, piccolo e facile da usare. Inoltre, dispone di un DataSetHelper che consente di utilizzare DataSet e DataTables per lavorare facilmente con i dati di Excel.

ExcelLibrary sembra funzionare ancora solo per il formato Excel precedente (file .xls), ma in futuro potrebbe aggiungere supporto per i nuovi formati 2007/2010.

Puoi anche utilizzare EPPlus , che funziona solo con i file in formato Excel 2007/2010 (file .xlsx).

Ci sono alcuni bug noti con ciascuna libreria, come indicato nei commenti. Nel complesso, EPPlus sembra essere la scelta migliore col passare del tempo. Sembra essere più triggersmente aggiornato e documentato.

Inoltre, come notato da @ АртёмЦарионов di seguito, EPPlus supporta le tabelle pivot e ExcelLibrary potrebbe avere qualche supporto ( problema di tabella pivot in ExcelLibrary )

Ecco alcuni link per una rapida consultazione:
ExcelLibrary – GNU Lesser GPL
EPPlus – GNU Lesser General Public License (LGPL)

Ecco alcuni esempi di codice per ExcelLibrary:

Ecco un esempio che prende i dati da un database e crea una cartella di lavoro da esso. Si noti che il codice ExcelLibrary è la singola riga in basso:

//Create the data set and table DataSet ds = new DataSet("New_DataSet"); DataTable dt = new DataTable("New_DataTable"); //Set the locale for each ds.Locale = System.Threading.Thread.CurrentThread.CurrentCulture; dt.Locale = System.Threading.Thread.CurrentThread.CurrentCulture; //Open a DB connection (in this example with OleDB) OleDbConnection con = new OleDbConnection(dbConnectionString); con.Open(); //Create a query and fill the data table with the data from the DB string sql = "SELECT Whatever FROM MyDBTable;"; OleDbCommand cmd = new OleDbCommand(sql, con); OleDbDataAdapter adptr = new OleDbDataAdapter(); adptr.SelectCommand = cmd; adptr.Fill(dt); con.Close(); //Add the table to the data set ds.Tables.Add(dt); //Here's the easy part. Create the Excel worksheet from the data set ExcelLibrary.DataSetHelper.CreateWorkbook("MyExcelFile.xls", ds); 

Creare il file Excel è facile come quello. Puoi anche creare manualmente file Excel, ma la funzionalità di cui sopra è ciò che mi ha veramente impressionato.

Se sei soddisfatto del formato xlsx, prova il mio progetto GitHub codeplex . EPPlus . Iniziato con l’origine da ExcelPackage, ma oggi è una riscrittura totale. Supporta gamme, stile cellulare, grafici, forms, immagini, nomi, autofiltri e molte altre cose.

Ho usato con successo i seguenti progetti open source:

  • ExcelPackage per i formati OOXML (Office 2007)

  • NPOI per il formato .XLS (Office 2003). NPOI 2.0 (Alpha) supporta anche XLSX.

Dai un’occhiata ai miei post sul blog:

Creazione di fogli di calcolo Excel .XLS e .XLSX in C #

NPOI con tabella Excel e grafico dinamico

E che dire dell’utilizzo di Open XML SDK 2.0 per Microsoft Office?

Alcuni vantaggi:

  • Non richiede Office installato
  • Prodotto da Microsoft = documentazione MSDN decente
  • Una sola. Dll da usare nel progetto
  • SDK ha molti strumenti come diff, validator, ecc

link:

  • Scarica SDK
  • Main MSDN Landing
  • “Come faccio …” Pagina iniziale
  • blogs.MSDN brian_jones che annuncia SDK
  • blogs.MSDN brian_jones che descrive l’SDK che gestisce file di grandi dimensioni senza interruzioni (a differenza del metodo DOM)

Puoi usare OLEDB per creare e manipolare file Excel. Verifica questo: lettura e scrittura di Excel tramite OLEDB .

Esempio tipico:

 using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\temp\\test.xls;Extended Properties='Excel 8.0;HDR=Yes'")) { conn.Open(); OleDbCommand cmd = new OleDbCommand("CREATE TABLE [Sheet1] ([Column1] string, [Column2] string)", conn); cmd.ExecuteNonQuery(); } 

MODIFICA – Altri collegamenti:

  • Ehi, Scripting Guy! Come posso leggere da Excel senza utilizzare Excel?
  • Come utilizzare ADO.NET per recuperare e modificare i record in una cartella di lavoro di Excel con Visual Basic .NET
  • Lettura e scrittura di fogli di calcolo Excel con ADO.NET C # DbProviderFactory

La soluzione commerciale, SpreadsheetGear per .NET, lo farà.

Puoi vedere esempi di ASP.NET (C # e VB) dal vivo qui e scaricare qui una versione di valutazione.

Disclaimer: Possiedo SpreadsheetGear LLC

Alcune opzioni che ho usato:

Se XLSX è un must: ExcelPackage è un buon inizio ma si spegne quando lo sviluppatore smette di lavorare su di esso. ExML è stato prelevato da lì e aggiunto alcune funzionalità. ExML non è una ctriggers opzione, lo sto ancora utilizzando in un paio di siti di produzione.

Per tutti i miei nuovi progetti, però, sto usando NPOI , la porta .NET di Apache POI . NPOI 2.0 (Alpha) supporta anche XLSX.

Un’opzione estremamente leggera potrebbe essere l’uso di tabelle HTML. Crea semplicemente tag head, body e table in un file e salvalo come file con estensione .xls. Esistono attributi specifici di Microsoft che è ansible utilizzare per definire l’output, incluse le formule.

Mi rendo conto che potresti non doverlo codificare in un’applicazione web, ma qui c’è un esempio della composizione di un file Excel tramite una tabella HTML. Questa tecnica potrebbe essere utilizzata se si stesse codificando un’app per console, un’applicazione desktop o un servizio.

È ansible utilizzare ExcelXmlWriter .

Funziona bene.

In realtà potresti voler controllare le classi di interoperabilità . Non dici OLE (che non è questo), ma le classi di interoperabilità sono molto facili da usare.

Potresti rimanere colpito se non li hai provati.

Si prega di essere avvisati della posizione di Microsoft su questo:

Microsoft al momento non consiglia, e non supporta, l’automazione delle applicazioni Microsoft Office da qualsiasi applicazione o componente client non interattivo non interattivo (inclusi ASP, ASP.NET, DCOM e NT Services), poiché Office potrebbe presentare un comportamento instabile e / o deadlock quando Office viene eseguito in questo ambiente.

Se stai creando file Excel 2007/2010, prova questo progetto open source: https://github.com/closedxml/closedxml

Fornisce un modo orientato agli oggetti per manipolare i file (simile a VBA) senza affrontare i problemi dei documenti XML. Può essere utilizzato da qualsiasi linguaggio .NET come C # e Visual Basic (VB).

ClosedXML consente di creare file Excel 2007/2010 senza l’applicazione Excel. L’esempio tipico è la creazione di report Excel su un server Web:

 var workbook = new XLWorkbook(); var worksheet = workbook.Worksheets.Add("Sample Sheet"); worksheet.Cell("A1").Value = "Hello World!"; workbook.SaveAs("HelloWorld.xlsx"); 

Ecco una libreria C # completamente gratuita, che consente di esportare da un DataSet , DataTable o List<> in un vero file .xlsx di Excel 2007, utilizzando le librerie OpenXML:

http://mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm

Il codice sorgente completo è fornito – gratuitamente – insieme con le istruzioni e un’applicazione demo.

Dopo aver aggiunto questa class alla tua applicazione, puoi esportare il tuo DataSet in Excel con una sola riga di codice:

 CreateExcelFile.CreateExcelDocument(myDataSet, "C:\\Sample.xlsx"); 

Non diventa molto più semplice di così …

E non richiede nemmeno che Excel sia presente sul tuo server.

Potresti considerare di creare i tuoi file utilizzando il formato XML Spreadsheet 2003 . Questo è un semplice formato XML che utilizza uno schema ben documentato .

Syncfusion Essential XlsIO può farlo. Non ha dipendenza da Microsoft Office e ha anche un supporto specifico per piattaforms diverse.

  • ASP.NET
  • ASP.NET MVC
  • UWP
  • Xamarin
  • WPF e Windows Form
  • Servizio di Windows e operazioni basate su batch

Esempio di codice:

 //Creates a new instance for ExcelEngine. ExcelEngine excelEngine = new ExcelEngine(); //Loads or open an existing workbook through Open method of IWorkbooks IWorkbook workbook = excelEngine.Excel.Workbooks.Open(fileName); //To-Do some manipulation| //To-Do some manipulation //Set the version of the workbook. workbook.Version = ExcelVersion.Excel2013; //Save the workbook in file system as xlsx format workbook.SaveAs(outputFileName); 

L’intera suite di controlli è disponibile gratuitamente tramite il programma di licenza della comunità , se si qualifica (meno di 1 milione di dollari in entrate). Nota: lavoro per Syncfusion.

Potresti dare un’occhiata a GemBox.Spreadsheet .

Hanno una versione gratuita con tutte le funzionalità, ma limitata a 150 righe per foglio e 5 fogli per cartella di lavoro, se ciò rientra nelle tue esigenze.

Non ho ancora avuto bisogno di usarlo da solo, ma sembra interessante.

Sono d’accordo sulla generazione di fogli di calcolo XML, ecco un esempio su come farlo per C # 3 (tutti ne parlano solo in VB 9: P) http://www.aaron-powell.com/linq-to-xml-to- eccellere

Voglio solo aggiungere un altro riferimento a una soluzione di terze parti che affronta direttamente il tuo problema: http://www.officewriter.com

(Disclaimer: Lavoro per SoftArtisans, la società che produce OfficeWriter)

Bene,

puoi anche utilizzare una libreria di terze parti come Aspose .

Questa libreria ha il vantaggio che non richiede l’installazione di Excel sulla tua macchina, che sarebbe l’ideale nel tuo caso.

OpenXML è anche una buona alternativa che consente di evitare l’installazione di MS Excel su Server. L’Open XML SDK 2.0 fornito da Microsoft semplifica l’attività di manipolazione dei pacchetti Open XML e degli elementi dello schema Open XML sottostante all’interno di un pacchetto. L’API (Application Programming Interface) Open XML incapsula molte attività comuni che gli sviluppatori eseguono sui pacchetti Open XML.

Controlla questo OpenXML: alternativa che consente di evitare l’installazione di MS Excel sul server

Le varie librerie XML di Office 2003 disponibili funzionano abbastanza bene per i file Excel più piccoli. Tuttavia, trovo che la dimensione di una grande cartella di lavoro salvata nel formato XML sia un problema. Ad esempio, una cartella di lavoro con cui lavoro sarebbe di 40 MB nel nuovo formato XLSX (e sicuramente più compatto) diventa un file XML 360 MB.

Per quanto riguarda la mia ricerca, ci sono due pacchetti commerciali che consentono l’output nei vecchi formati di file binari. Loro sono:

  • Gembox
  • ComponentOne Excel

Né sono economici (rispettivamente 500USD e 800USD). ma entrambi funzionano indipendentemente da Excel stesso.

Quello di cui sarei curioso è il modulo di output di Excel per OpenOffice.org. Mi chiedo se possano essere portati da Java a .Net.

IKVM + POI

Oppure puoi usare l’Interop …

Ecco un modo per farlo con LINQ to XML, completo di codice di esempio:

Importa ed esporta rapidamente dati Excel con LINQ in XML

È un po ‘complesso, dal momento che devi importare i namespace e così via, ma ti permette di evitare dipendenze esterne.

(Inoltre, naturalmente, è VB .NET, non C #, ma puoi sempre isolare le cose di VB .NET nel proprio progetto per usare XML Literals e fare tutto il resto in C #.)

Alcuni fornitori di componenti di terze parti come Infragistics o Syncfusion offrono ottime capacità di esportazione Excel che non richiedono l’installazione di Microsoft Excel.

Poiché questi fornitori forniscono anche componenti avanzati della griglia dell’interfaccia utente, questi componenti sono particolarmente utili se si desidera lo stile e il layout di un’esportazione excel per simulare lo stato corrente di una griglia nell’interfaccia utente dell’applicazione.

Se la tua esportazione è destinata ad essere eseguita lato server con enfasi sui dati da esportare e senza alcun collegamento all’interfaccia utente, allora opterei per una delle opzioni open source gratuite (ad es. ExcelLibrary).

In precedenza sono stato coinvolto in progetti che tentavano di utilizzare l’automazione lato server nella suite Microsoft Office. Sulla base di questa esperienza, raccomanderei vivamente contro questo approccio.

 public class GridViewExportUtil { public static void Export(string fileName, GridView gv) { HttpContext.Current.Response.Clear(); HttpContext.Current.Response.AddHeader( "content-disposition", string.Format("attachment; filename={0}", fileName)); HttpContext.Current.Response.ContentType = "application/ms-excel"; using (StringWriter sw = new StringWriter()) { using (HtmlTextWriter htw = new HtmlTextWriter(sw)) { // Create a form to contain the grid Table table = new Table(); // add the header row to the table if (gv.HeaderRow != null) { GridViewExportUtil.PrepareControlForExport(gv.HeaderRow); table.Rows.Add(gv.HeaderRow); } // add each of the data rows to the table foreach (GridViewRow row in gv.Rows) { GridViewExportUtil.PrepareControlForExport(row); table.Rows.Add(row); } // add the footer row to the table if (gv.FooterRow != null) { GridViewExportUtil.PrepareControlForExport(gv.FooterRow); table.Rows.Add(gv.FooterRow); } // render the table into the htmlwriter table.RenderControl(htw); // render the htmlwriter into the response HttpContext.Current.Response.Write(sw.ToString()); HttpContext.Current.Response.End(); } } } ///  /// Replace any of the contained controls with literals ///  ///  private static void PrepareControlForExport(Control control) { for (int i = 0; i < control.Controls.Count; i++) { Control current = control.Controls[i]; if (current is LinkButton) { control.Controls.Remove(current); control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text)); } else if (current is ImageButton) { control.Controls.Remove(current); control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText)); } else if (current is HyperLink) { control.Controls.Remove(current); control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text)); } else if (current is DropDownList) { control.Controls.Remove(current); control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text)); } else if (current is CheckBox) { control.Controls.Remove(current); control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False")); } if (current.HasControls()) { GridViewExportUtil.PrepareControlForExport(current); } } } } 

Ciao questa soluzione è quella di esportare la tua vista griglia sul tuo file Excel che potrebbe aiutarti

È ansible creare file Excel ben formattati utilizzando questa libreria: http://officehelper.codeplex.com/documentation
Vedi sotto campione:

 using (ExcelHelper helper = new ExcelHelper(TEMPLATE_FILE_NAME, GENERATED_FILE_NAME)) { helper.Direction = ExcelHelper.DirectionType.TOP_TO_DOWN; helper.CurrentSheetName = "Sheet1"; helper.CurrentPosition = new CellRef("C3"); //the template xlsx should contains the named range "header"; use the command "insert"/"name". helper.InsertRange("header"); //the template xlsx should contains the named range "sample1"; //inside this range you should have cells with these values: // ,  and , which will be replaced by the values from the getSample() CellRangeTemplate sample1 = helper.CreateCellRangeTemplate("sample1", new List {"name", "value", "comment"}); helper.InsertRange(sample1, getSample()); //you could use here other named ranges to insert new cells and call InsertRange as many times you want, //it will be copied one after another; //even you can change direction or the current cell/sheet before you insert //typically you put all your "template ranges" (the names) on the same sheet and then you just delete it helper.DeleteSheet("Sheet3"); } 

dove il campione assomiglia a questo:

 private IEnumerable> getSample() { var random = new Random(); for (int loop = 0; loop < 3000; loop++) { yield return new List {"test", DateTime.Now.AddDays(random.NextDouble()*100 - 50), loop}; } } 

Ho appena usato FlexCel.NET e l’ ho trovata una libreria eccellente! Non lo dico su troppi prodotti software. Inutile dare l’intero campo di vendita qui, puoi leggere tutte le funzionalità sul loro sito web.

È un prodotto commerciale, ma ottieni la fonte completa se lo acquisti. Quindi suppongo che potresti compilarlo nel tuo assieme se lo volessi davvero. Altrimenti è solo un assembly in più per xcopy – nessuna configurazione o installazione o qualcosa del genere.

Non penso che troverai alcun modo per farlo senza librerie di terze parti, dato che .NET framework, ovviamente, non ha il supporto integrato per esso e OLE Automation è solo un intero mondo di dolore.

Qualche utile automazione di Excel in C #, puoi trovare dal seguente link.

http://csharp.net-informations.com/excel/csharp-excel-tutorial.htm

Bolton.

Il modo più semplice e veloce per creare un file Excel da C # è utilizzare lo strumento di produttività Open XML. Open XML Productivity Tool viene fornito con l’installazione Open XML SDK. Lo strumento invertire ingegnerizza qualsiasi file di Excel nel codice C #. Il codice C # può quindi essere utilizzato per rigenerare quel file.

Una panoramica del processo coinvolto è:

  1. Installa Open XML SDK con lo strumento.
  2. Crea un file Excel utilizzando l’ultimo client Excel con l’aspetto desiderato. DesiredLook.xlsx .
  3. Con lo strumento apri DesiredLook.xlsx e fai clic sul pulsante Rifletti codice nella parte superiore. inserisci la descrizione dell'immagine qui
  4. Il codice C # per il tuo file verrà generato nel riquadro destro dello strumento. Aggiungi questo alla tua soluzione C # e genera file con l’aspetto desiderato.

Come bonus, questo metodo funziona per qualsiasi file Word e PowerPoint. Come sviluppatore C #, apporterai le modifiche al codice in base alle tue esigenze.

Ho sviluppato una semplice app WPF su github che verrà eseguita su Windows per questo scopo. Esiste una class segnaposto chiamata GeneratedClass cui è ansible incollare il codice generato. Se torni indietro di una versione del file, genererà un file excel come questo:

inserisci la descrizione dell'immagine qui

Look at samples how to create Excel files.

There are examples in C# and VB.NET

It manages XSL XSLX and CSV Excel files.

http://www.devtriogroup.com/ExcelJetcell/Samples

Have you ever tried sylk?

We used to generate excelsheets in classic asp as sylk and right now we’re searching for an excelgenerater too.

The advantages for sylk are, you can format the cells.