Question

Je commence tout juste à bricoler Excel via C # pour pouvoir automatiser la création et l'ajout à un fichier Excel.

Je peux ouvrir le fichier, mettre à jour ses données et parcourir les feuilles de calcul existantes. Mon problème est comment puis-je ajouter de nouvelles feuilles?

j'ai essayé:

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

Mais je suis sous Exception COM et ma recherche sur Google ne m'a pas donné de réponse.

  

Exception de HRESULT: 0x800A03EC La source est: "Interop.Excel"

J'espère que quelqu'un pourra peut-être me sortir de ma misère.

Était-ce utile?

La solution

Vous devez ajouter une référence COM dans votre projet à la " bibliothèque d'objets Microsoft Excel 11.0 " - ou toute version appropriée.

Ce code fonctionne pour moi:

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;
    }
}
  

Notez que vous devez faire très attention à nettoyer et libérer correctement vos références d'objet COM . Cette question StackOverflow contient une règle empirique utile: "Ne jamais utiliser 2 points avec des objets COM" . Dans votre code vous allez avoir de vrais problèmes avec ça. Le code de démonstration ci-dessus ne nettoie PAS correctement l'application Excel, mais c'est un début!

Quelques autres liens que j'ai trouvés utiles lors de l'examen de cette question:

Selon MSDN

  

Pour utiliser COM Interop, vous devez avoir   sécurité administrateur ou utilisateur privilégié   autorisations.

L’espoir que cela aide.

Autres conseils

Je voudrais vous remercier pour vos excellentes réponses. @AR., Vous êtes une star et cela fonctionne parfaitement. J'avais remarqué hier soir que Excel.exe ne fermait pas; J'ai donc fait des recherches et découvert comment libérer les objets COM. Voici mon code final:

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();
            }
        }
    }
}

Merci pour toute votre aide.

Un autre " Up Tick " pour AR ..., mais si vous n'avez pas à utiliser interop, je l'éviterais tout à fait. Ce produit est en fait assez intéressant: http://www.clearoffice.com/ et fournit une interface de manipulation très intuitive et entièrement gérée Excel fichiers et semble être libre. (du moins pour le moment) SpreadSheetGear est également excellent mais coûteux.

mes deux cents.

  

N'oubliez pas d'inclure la référence à la bibliothèque d'objets Microsoft Excel 12.0 / 11.0

.
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;
}

Vous pouvez utiliser OLEDB pour créer et manipuler des fichiers Excel. Voir cette question pour des liens et des exemples.

Voici quelques points que j'ai compris:

  1. Vous ne pouvez pas ouvrir plus d'une instance du même objet en même temps. Par exemple, si vous installez un nouvel objet feuille Excel appelé xlsheet1 , vous devez le libérer avant de créer un autre objet feuille Excel ex xlsheet2 . Il semble que COM perd la trace de l'objet et laisse un processus zombie sur le serveur.

  2. Il est également difficile de fermer la méthode open associée à excel.workbooks si plusieurs utilisateurs accèdent au même fichier. Utilisez la méthode Add à la place, cela fonctionne aussi bien sans verrouiller le fichier. par exemple. xlBook = xlBooks.Add ("C: \ location \ XlTemplate.xls")

  3. Placez votre collection de place dans un bloc ou une méthode séparé après avoir libéré les objets COM.

COM n'est certainement pas une bonne solution. Plus spécifiquement, c'est un non-droit si vous avez affaire à un environnement Web ...

J'ai utilisé avec succès les projets Open Source suivants:

  • ExcelPackage pour les formats OOXML (Office 2007)

  • NPOI pour le format .XLS (Office 2003)

Jetez un coup d'œil à ces articles de blog:

Création de feuilles de calcul Excel .XLS et .XLSX en C #

NPOI avec tableau Excel et dynamique Graphique

C’est ce que j’ai utilisé pour ajouter une feuille de calcul supplémentaire

Workbook workbook = null;
Worksheet worksheet = null;

workbook = app.Workbooks.Add(1);
workbook.Sheets.Add();

Worksheet additionalWorksheet = workbook.ActiveSheet;

J'ai rencontré un problème similaire avec le complément d'application au niveau de VSTO, à l'exception de HRESULT: 0x800A03EC lors de l'ajout d'une nouvelle feuille.

  

Le code d'erreur 0x800A03EC (ou -2146827284) signifie NAME_NOT_FOUND; dans   En d'autres termes, vous avez demandé quelque chose et Excel ne le trouve pas.

Dominic Zukiewicz @ erreur Excel HRESULT: 0x800A03EC en essayant d'obtenir une plage avec le nom de la cellule

Ensuite, j'ai finalement réalisé que ThisWorkbook avait déclenché l'exception. ActiveWorkbook s'est bien passé.

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top