C # - Hvordan legge til et Excel-regneark programma - Office XP / 2003

stemmer
23

Jeg bare begynner å fikle med Excel via C # for å kunne automatisere oppretting, og tillegg til en Excel-fil.

Jeg kan åpne filen og oppdatere sine data og gå gjennom de eksisterende regneark. Problemet mitt er hvordan kan jeg legge til nye ark?

Jeg prøvde:

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

Men jeg får under COM Unntak og min googling har ikke gitt meg noen svar.

Unntak fra HRESULT: 0x800A03EC Kilde er: Interop.Excel

Jeg håper noen kanskje kunne sette meg ut av min elendighet.

Publisert på 10/10/2008 klokken 19:30
kilden bruker
På andre språk...                            


9 svar

stemmer
42

Du må legge til en COM referanse i prosjektet til " Microsoft Excel 11.0 Object Library" - eller hva versjonen er hensiktsmessig.

Denne koden fungerer for meg:

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

Legg merke til at du ønsker å være veldig forsiktig med riktig rydde opp og slippe COM objekt referanser . Inkludert i at Stackoverflow spørsmålet er en nyttig tommelfingerregel: "Aldri bruke 2 prikker med COM-objekter" . I koden din; du kommer til å ha reelle problemer med det. Min demo koden ovenfor IKKE skal rydde opp i Excel app, men det er en start!

Noen andre linker som jeg fant nyttig når man ser på dette spørsmålet:

Ifølge MSDN

For å bruke COM Interop, må du ha administrator eller Power User sikkerhetstillatelser.

Håper det hjelper.

Svarte 10/10/2008 kl. 21:19
kilden bruker

stemmer
0

Du kan bruke OLEDB å opprette og manipulere Excel-filer. Se på dette spørsmålet for lenker og prøver.

Svarte 10/10/2008 kl. 22:21
kilden bruker

stemmer
2

En annen "Up Tick" for AR ..., men hvis du ikke trenger å bruke Interop jeg ville unngå det helt. Dette produktet er faktisk ganske interessant: http://www.clearoffice.com/ og det gir en veldig intuitiv, fullstendig styrt, api for manipulasjon Excel-filer og ser ut til å være gratis. (i hvert fall for tiden) SpreadSheetGear er også utmerket, men kostbar.

mine to cents.

Svarte 11/10/2008 kl. 04:39
kilden bruker

stemmer
4

Vil gjerne takke deg for noen gode svar. @AR., Din en stjerne, og det fungerer perfekt. Jeg hadde lagt merke til i går kveld at det Excel.exeikke var stenge; så jeg gjorde noen undersøkelser og funnet ut om hvordan du kan frigjøre COM-objekter. Her er mitt endelige koden:

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

Takk for all hjelp.

Svarte 11/10/2008 kl. 06:38
kilden bruker

stemmer
0

Her er et par ting jeg har funnet ut:

  1. Du kan ikke åpne mer enn én forekomst av samme objekt på samme tid. For eksempel hvis du instanciate en ny excel ark objekt kalt xlsheet1du har å løsne det før du oppretter en annen excel-ark objekt ex xlsheet2. Det synes som COM mister oversikten over objektet og etterlater en zombie prosess på serveren.

  2. Bruk av åpen metoden forbundet med excel.workbooksogså blir vanskelig å lukke hvis du har flere brukere som bruker den samme filen. Bruk Legg til metoden i stedet, det fungerer like bra uten å låse filen. f.eks.xlBook = xlBooks.Add("C:\location\XlTemplate.xls")

  3. Plasser søppelrydding i en egen blokk eller metode etter slippe COM-objekter.

Svarte 21/01/2010 kl. 15:51
kilden bruker

stemmer
0

COM er definitivt ikke en god vei å gå. Mer spesifikt er det en no gå hvis du arbeider med web miljø ...

Jeg har brukt med suksess følgende åpen kildekode-prosjekter:

  • ExcelPackage for OOXML-format (Office 2007)

  • NPOI for XLS format (Office 2003)

Ta en titt på disse blogginnleggene:

Opprette Excel regneark XLS og XLSX i C #

NPOI med Excel tabell og dynamisk figur

Svarte 16/02/2012 kl. 10:20
kilden bruker

stemmer
1

Ikke glem å inkludere referanse tilMicrosoft 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;
}
Svarte 31/03/2012 kl. 19:49
kilden bruker

stemmer
0

Dette er hva jeg pleide å legge tredjepart regneark

Workbook workbook = null;
Worksheet worksheet = null;

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

Worksheet additionalWorksheet = workbook.ActiveSheet;
Svarte 10/12/2013 kl. 04:41
kilden bruker

stemmer
0

Jeg hadde et lignende problem program-nivå-tillegget i VSTO, unntak HRESULT: 0x800A03EC når du legger til et nytt ark.

Feilkoden 0x800A03EC (eller -2146827284) betyr NAME_NOT_FOUND; med andre ord, du har bedt om noe, og Excel kan ikke finne den.

Dominic Zukiewicz @ Excel feil HRESULT: 0x800A03EC mens du prøver å få serien med celle navn

Da jeg endelig skjønte Thisworkbook utløste unntak. Active gikk OK.

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);
Svarte 03/10/2014 kl. 11:59
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more