C # – Come aggiungere un foglio di lavoro Excel a livello di codice – Office XP / 2003

Sto solo cominciando a giocherellare con Excel tramite C # per poter automatizzare la creazione e l’aggiunta a un file Excel.

Posso aprire il file e aggiornare i suoi dati e spostarmi tra i fogli di lavoro esistenti. Il mio problema è come posso aggiungere nuovi fogli?

Provai:

Excel.Worksheet newWorksheet; newWorksheet = (Excel.Worksheet)excelApp.ThisWorkbook.Worksheets.Add( Type.Missing, Type.Missing, Type.Missing, Type.Missing); 

Ma ottengo sotto COM Eccezione e il mio googling non mi ha dato alcuna risposta.

Eccezione da HRESULT: 0x800A03EC La fonte è: “Interop.Excel”

Spero che qualcuno riesca a farmi uscire dalla mia infelicità.

È necessario aggiungere un riferimento COM nel progetto alla Microsoft Excel 11.0 Object Library o qualsiasi altra versione sia appropriata.

Questo codice funziona per me:

 private void AddWorksheetToExcelWorkbook(string fullFilename,string worksheetName) { Microsoft.Office.Interop.Excel.Application xlApp = null; Workbook xlWorkbook = null; Sheets xlSheets = null; Worksheet xlNewSheet = null; try { xlApp = new Microsoft.Office.Interop.Excel.Application(); if (xlApp == null) return; // Uncomment the line below if you want to see what's happening in Excel // xlApp.Visible = true; xlWorkbook = xlApp.Workbooks.Open(fullFilename, 0, false, 5, "", "", false, XlPlatform.xlWindows, "", true, false, 0, true, false, false); xlSheets = xlWorkbook.Sheets as Sheets; // The first argument below inserts the new worksheet as the first one xlNewSheet = (Worksheet)xlSheets.Add(xlSheets[1], Type.Missing, Type.Missing, Type.Missing); xlNewSheet.Name = worksheetName; xlWorkbook.Save(); xlWorkbook.Close(Type.Missing,Type.Missing,Type.Missing); xlApp.Quit(); } finally { Marshal.ReleaseComObject(xlNewSheet); Marshal.ReleaseComObject(xlSheets); Marshal.ReleaseComObject(xlWorkbook); Marshal.ReleaseComObject(xlApp); xlApp = null; } } 

Si noti che si vuole fare molta attenzione a pulire e rilasciare correttamente i riferimenti agli oggetti COM . Incluso in quella domanda StackOverflow è una utile regola empirica: “Non utilizzare mai 2 punti con oggetti COM” . Nel tuo codice; avrai davvero problemi con questo. Il mio codice demo sopra NON pulisce correttamente l’app Excel, ma è un inizio!

Alcuni altri link che ho trovato utili quando si esamina questa domanda:

  • Apertura e navigazione in Excel con C #
  • Procedura: utilizzare COM Interop per creare un foglio di calcolo Excel (Guida alla programmazione C #)
  • Procedura: aggiungere nuovi fogli di lavoro alla cartella di lavoro

Secondo MSDN

Per utilizzare l’interoperabilità COM, è necessario disporre delle autorizzazioni di sicurezza di amministratore o Power User.

Spero possa aiutare.

Vorrei ringraziarvi per alcune risposte eccellenti. @AR., Sei una stella e funziona perfettamente. Ho notato la scorsa notte che Excel.exe non si stava chiudendo; così ho fatto delle ricerche e ho scoperto come rilasciare gli oggetti COM. Ecco il mio codice finale:

 using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.IO; using Excel; namespace testExcelconsoleApp { class Program { private String fileLoc = @"C:\temp\test.xls"; static void Main(string[] args) { Program p = new Program(); p.createExcel(); } private void createExcel() { Excel.Application excelApp = null; Excel.Workbook workbook = null; Excel.Sheets sheets = null; Excel.Worksheet newSheet = null; try { FileInfo file = new FileInfo(fileLoc); if (file.Exists) { excelApp = new Excel.Application(); workbook = excelApp.Workbooks.Open(fileLoc, 0, false, 5, "", "", false, XlPlatform.xlWindows, "", true, false, 0, true, false, false); sheets = workbook.Sheets; //check columns exist foreach (Excel.Worksheet sheet in sheets) { Console.WriteLine(sheet.Name); sheet.Select(Type.Missing); System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet); } newSheet = (Worksheet)sheets.Add(sheets[1], Type.Missing, Type.Missing, Type.Missing); newSheet.Name = "My New Sheet"; newSheet.Cells[1, 1] = "BOO!"; workbook.Save(); workbook.Close(null, null, null); excelApp.Quit(); } } finally { System.Runtime.InteropServices.Marshal.ReleaseComObject(newSheet); System.Runtime.InteropServices.Marshal.ReleaseComObject(sheets); System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook); System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp); newSheet = null; sheets = null; workbook = null; excelApp = null; GC.Collect(); } } } } 

Grazie per tutto il tuo aiuto.

Un altro “Up Tick” per AR …, ma se non dovessi usare Interop, lo eviterei del tutto. Questo prodotto è in realtà piuttosto interessante: http://www.clearoffice.com/ e fornisce un API molto intuitivo, completamente gestito, per la manipolazione dei file excel e sembra essere gratuito. (almeno per ora) SpreadSheetGear è anche eccellente ma costoso.

i miei due centesimi.

Non dimenticare di includere il riferimento alla Microsoft Excel 12.0/11.0 object Library di Microsoft Excel 12.0/11.0 object Library

 using Excel = Microsoft.Office.Interop.Excel; // Include this Namespace 

 Microsoft.Office.Interop.Excel.Application xlApp = null; Excel.Workbook xlWorkbook = null; Excel.Sheets xlSheets = null; Excel.Worksheet xlNewSheet = null; string worksheetName ="Sheet_Name"; object readOnly1 = false; object isVisible = true; object missing = System.Reflection.Missing.Value; try { xlApp = new Microsoft.Office.Interop.Excel.Application(); if (xlApp == null) return; // Uncomment the line below if you want to see what's happening in Excel // xlApp.Visible = true; xlWorkbook = xlApp.Workbooks.Open(@"C:\Book1.xls", missing, readOnly1, missing, missing, missing, missing, missing, missing, missing, missing, isVisible, missing, missing, missing); xlSheets = (Excel.Sheets)xlWorkbook.Sheets; // The first argument below inserts the new worksheet as the first one xlNewSheet = (Excel.Worksheet)xlSheets.Add(xlSheets[1], Type.Missing, Type.Missing, Type.Missing); xlNewSheet.Name = worksheetName; xlWorkbook.Save(); xlWorkbook.Close(Type.Missing, Type.Missing, Type.Missing); xlApp.Quit(); } finally { System.Runtime.InteropServices.Marshal.ReleaseComObject(xlNewSheet); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); //xlApp = null; } 

Puoi usare OLEDB per creare e manipolare file Excel. Vedi questa domanda per link e campioni.

Ecco un paio di cose che ho scoperto:

  1. Non è ansible aprire più di un’istanza dello stesso object nello stesso momento. Ad esempio, se instanziate un nuovo object excel chiamato xlsheet1 dovete rilasciarlo prima di creare un altro object excel xlsheet2 . Sembra che COM perdi la traccia dell’object e lasci un processo zombie sul server.

  2. Anche l’utilizzo del metodo aperto associato a excel.workbooks diventa difficile da chiudere se si dispone di più utenti che accedono allo stesso file. Usa invece il metodo Aggiungi, funziona altrettanto bene senza bloccare il file. per esempio. xlBook = xlBooks.Add("C:\location\XlTemplate.xls")

  3. Metti la tua garbage collection in un blocco o metodo separato dopo aver rilasciato gli oggetti COM.

COM non è sicuramente un buon modo per andare. Più specificamente, è un no go se hai a che fare con l’ambiente web …

Ho usato con successo i seguenti progetti open source:

  • ExcelPackage per i formati OOXML (Office 2007)

  • NPOI per il formato .XLS (Office 2003)

Dai uno sguardo a questi post del blog:

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

NPOI con tabella Excel e grafico dinamico

Questo è quello che ho usato per aggiungere un foglio di lavoro aggiuntivo

 Workbook workbook = null; Worksheet worksheet = null; workbook = app.Workbooks.Add(1); workbook.Sheets.Add(); Worksheet additionalWorksheet = workbook.ActiveSheet; 

Ho avuto un problema simile a livello di applicazione aggiuntivo in VSTO, l’eccezione HRESULT: 0x800A03EC quando si aggiunge un nuovo foglio.

Il codice di errore 0x800A03EC (o -2146827284) indica NAME_NOT_FOUND; in altre parole, hai chiesto qualcosa e Excel non riesce a trovarlo.

Dominic Zukiewicz @ Errore Excel HRESULT: 0x800A03EC durante il tentativo di ottenere intervallo con il nome della cella

Poi alla fine ho capito che ThisWorkbook ha triggersto l’eccezione. ActiveWorkbook è andato bene.

 Excel.Worksheet newSheetException = Globals.ThisAddIn.Application.ThisWorkbook.Worksheets.Add(Type.Missing, sheet, Type.Missing, Type.Missing); Excel.Worksheet newSheetNoException = Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets.Add(Type.Missing, sheet, Type.Missing, Type.Missing);