web-dev-qa-db-fra.com

C # - Comment ajouter une feuille de calcul Excel par programme - Office XP / 2003

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 et 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 reçois en dessous 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.

23
Jon

Vous devez ajouter une référence COM dans votre projet au "Microsoft Excel 11.0 Object Library" - ou à la version de votre choix.

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 voulez faire très attention à nettoyer et relâcher correctement vos références d'objet COM . Inclus dans cette question StackOverflow est une règle utile: "Ne jamais utiliser 2 points avec des objets COM". Dans votre code vous allez avoir de vrais problèmes avec ça. _ {Mon 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 la recherche sur cette question

Selon MSDN 

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

J'espère que cela pourra aider.

42
AR.

Je voudrais vous remercier pour vos excellentes réponses. @AR., Vous êtes une star et cela fonctionne parfaitement. J'avais remarqué hier soir que le 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();
            }
        }
    }
}

Je vous remercie pour votre aide.

5
Jon

Une 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 il fournit une API très intuitive, entièrement gérée, pour la manipulation de fichiers Excel et semble être gratuit. (du moins pour le moment) SpreadSheetGear est également excellent mais coûteux. 

mes deux centimes.

2
sbeskur

N'oubliez pas d'inclure Reference toMicrosoft 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;
}
1
Gokul

C'est ce que j'avais l'habitude d'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;
0
Dobermaxx99

J'ai rencontré un problème similaire dans le complément d'application au niveau de l'application dans VSTO, l'exception 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 lors de la tentative d'obtention d'une plage avec le nom de la cellule

Puis j'ai finalement réalisé que ThisWorkbook a 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);
0
Jiri Tersel

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

0
Panos

COM n'est certainement pas une bonne solution. Plus précisément, c'est un non-droit si vous avez affaire à l'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 graphique dynamique

0
Leniel Maccaferri