質問

私は始めると、怒ExcelによC#できる自動化の創造は、Excelファイルです。

できるファイルを開くと、更新データの移動を通じて、既存のワークシート私の問題を追加するにはどうしたらよいで新しいシート?

てみました:

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

で取得します以下に COM例外 私googlingいないから南北朝時代にかけて他の答えです。

例外からHRESULT:0x800A03EC源:"Interop.Excel"

思いっきによって私は自分の不幸.

役に立ちましたか?

解決

を追加する必要がありますCOMを参照プロジェクトの "Microsoft Excel 11.0 Object Library" -あ版が適しています。

このコードの作品が私にとって:

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

だいたいうよう十分注意してください約 適切な清掃やリビルトインデータベースオブジェクト参照.に含まれるStackOverflowの質問は、有益な経験則: "使用しな2ドットのCOMオブジェクト".コード;まいまい デモコードにならない適切にクリーン上のExcelアプリでスタート!

その他のリンクからの有用きのこの質問:

にMSDN

使visualが必要にな 管理者またはパワーユーザー安全保障 アクセス権を表します。

い役立っています。

他のヒント

優れた回答をありがとうございます。 @AR。、あなたの星、それは完璧に動作します。昨夜、 Excel.exe が閉じていなかったことに気付きました。そのため、私はいくつかの調査を行い、COMオブジェクトをリリースする方法を見つけました。最終的なコードは次のとおりです。

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

ご協力ありがとうございます。

別の" Up Tick" AR ...の場合、ただし相互運用性を使用する必要がない場合は、完全に回避します。この製品は実際には非常に興味深いものです。 http://www.clearoffice.com/ は、操作のための非常に直感的で完全に管理されたAPIを提供します。ファイルをエクセルし、無料のようです。 (少なくとも当面) SpreadSheetGear も優れていますが、高価です。

私の2セント。

  

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

OLEDBを使用して、Excelファイルを作成および操作できます。リンクとサンプルについては、この質問をご覧ください。

ここに、私が考え出したいくつかのことを示します。

  1. 同じオブジェクトの複数のインスタンスを同時に開くことはできません。たとえば、 xlsheet1 という新しいExcelシートオブジェクトをインスタンス化する場合、別のExcelシートオブジェクトex xlsheet2 を作成する前に、それを解放する必要があります。 COMはオブジェクトの追跡を失い、サーバーにゾンビプロセスを残すようです。

  2. 同じファイルに複数のユーザーがアクセスしている場合、 excel.workbooks に関連付けられたopenメソッドを閉じることも困難になります。代わりにAddメソッドを使用します。ファイルをロックしなくても同じように機能します。例えば。 xlBook = xlBooks.Add(" C:\ location \ XlTemplate.xls")

  3. COMオブジェクトを解放した後、ガベージコレクションを別のブロックまたはメソッドに配置します。

COM は間違いなく良い方法ではありません。より具体的には、ウェブ環境を扱っている場合は手放せません...

次のオープンソースプロジェクトを成功裏に使用しました:

  • OOXML形式のExcelPackage(Office 2007)

  • .XLS形式のNPOI(Office 2003)

これらのブログ投稿をご覧ください:

Excelスプレッドシート.XLSおよび.XLSXの作成C#で

Excelテーブルと動的なNPOIチャート

これは、ワークシートを追加するために使用したものです

Workbook workbook = null;
Worksheet worksheet = null;

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

Worksheet additionalWorksheet = workbook.ActiveSheet;

VSTOでアプリケーションレベルのアドインと同様の問題が発生しました。例外HRESULT:新しいシートを追加するときの0x800A03EC。

  

エラーコード0x800A03EC(または-2146827284)はNAME_NOT_FOUNDを意味します。に   言い換えれば、何かを求めたのに、Excelがそれを見つけることができません。

Dominic Zukiewicz @ ExcelエラーHRESULT:セルの名前で範囲を取得しようとしているときに0x800A03EC

それからようやく ThisWorkbook が例外をトリガーすることに気付きました。 ActiveWorkbook は正常に実行されました。

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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top