次の方法で共有


スプレッドシート ドキュメントに新しいワークシートを挿入する

このトピックでは、Open XML SDK for Office のクラスを使用して、プログラムによって新しいワークシートをスプレッドシート ドキュメントに挿入する方法について説明します。

SpreadsheetDocument オブジェクトを取得する

Open XML SDK では、 SpreadsheetDocument クラスは Excel ドキュメント パッケージを表します。 Excel ドキュメントを開いて操作するには、ドキュメントから SpreadsheetDocument クラスのインスタンスを作成します。 ドキュメントからインスタンスを作成した後、ワークシートが入っているメインのブック パーツにアクセスできます。 ドキュメント内のテキストは、 SpreadsheetML マークアップを使用して XML としてパッケージ内で表されます。

ドキュメントからクラス インスタンスを作成するには、 Open メソッドのいずれかを呼び出します。 メソッドにはいくつかの種類があり、それぞれシグネチャが異なります。 このトピックのサンプル コードでは、2 つのパラメーターを必要とするシグネチャを持つ Open(String, Boolean) メソッドを使用します。 最初のパラメーターは、開くドキュメントを表す完全なパスの文字列を受け取ります。 2 番目のパラメーターは、 true または false であり、編集のためにファイルを開くかどうかを表します。 このパラメーターが falseされている場合、ドキュメントに加えた変更は保存されません。

Open メソッドを呼び出すコードは、次のusing ステートメントに示されています。

// Open the document for editing.
using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true))

spreadsheetML ドキュメントの基本的な構造

SpreadsheetMLドキュメントの基本的なドキュメント構造は、ブック内のワークシートを参照するSheets要素とSheet要素で構成されます。 ワークシートごとに、それぞれの XML ファイルが作成されます。 たとえば、MySheet1 と MySheet2 という名前の 2 つのワークシートがあるWorkbookSpreadsheetMLは、Workbook.xml ファイルにあり、次のコード例に示されています。

    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
    <workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
        <sheets>
            <sheet name="MySheet1" sheetId="1" r:id="rId1" /> 
            <sheet name="MySheet2" sheetId="2" r:id="rId2" /> 
        </sheets>
    </workbook>

ワークシート XML ファイルには、セル テーブルを表 SheetData 1 つ以上のブロック レベル要素が含まれており、1 つ以上の Row 要素が含まれています。 rowには、1 つ以上のCell要素が含まれています。 各セルには、セルの値を表す CellValue 要素が含まれています。 たとえば、セル A1 の値が 100 しかないブックの最初のワークシートの SpreadsheetML は、Sheet1.xml ファイルにあり、次のコード例に示されています。

    <?xml version="1.0" encoding="UTF-8" ?> 
    <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
        <sheetData>
            <row r="1">
                <c r="A1">
                    <v>100</v> 
                </c>
            </row>
        </sheetData>
    </worksheet>

Open XML SDK を使用すると、 SpreadsheetML 要素に対応する厳密に型指定されたクラスを使用するドキュメント構造とコンテンツを作成できます。 これらのクラスは、 DocumentFormat.OpenXML.Spreadsheet 名前空間にあります。 次の表に、 workbooksheetssheetworksheetsheetData の各要素に対応するクラスのクラス名を示します。

SpreadsheetML の要素 Open XML SDK クラス 説明
<workbook/> DocumentFormat.OpenXML.Spreadsheet.Workbook メイン ドキュメント パーツのルート要素。
<sheets/> DocumentFormat.OpenXML.Spreadsheet.Sheets ISO/IEC 29500 の仕様で規定されている、シート、ファイル バージョン、その他のブロック レベル構造のコンテナー。
<sheet/> DocumentFormat.OpenXml.Spreadsheet.Sheet シート定義ファイルを指し示すシート。
<worksheet/> DocumentFormat.OpenXML.Spreadsheet。 Worksheet シート データが含まれているシート定義ファイル。
<sheetData/> DocumentFormat.OpenXML.Spreadsheet.SheetData セルの表。行ごとにグループ化されています。
<row/> DocumentFormat.OpenXml.Spreadsheet.Row セルの表内の行。
<c/> DocumentFormat.OpenXml.Spreadsheet.Cell 行内のセル。
<v/> DocumentFormat.OpenXml.Spreadsheet.CellValue セルの値。

サンプル コード

以下は、C# および Visual Basic の完全なサンプル コードです。

static void InsertWorksheet(string docName)
{
    // Open the document for editing.
    using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true))
    {
        WorkbookPart workbookPart = spreadSheet.WorkbookPart ?? spreadSheet.AddWorkbookPart();
        // Add a blank WorksheetPart.
        WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();
        newWorksheetPart.Worksheet = new Worksheet(new SheetData());

        Sheets sheets = workbookPart.Workbook.GetFirstChild<Sheets>() ?? workbookPart.Workbook.AppendChild(new Sheets());
        string relationshipId = workbookPart.GetIdOfPart(newWorksheetPart);

        // Get a unique ID for the new worksheet.
        uint sheetId = 1;
        if (sheets.Elements<Sheet>().Count() > 0)
        {
            sheetId = (sheets.Elements<Sheet>().Select(s => s.SheetId?.Value).Max() + 1) ?? (uint)sheets.Elements<Sheet>().Count() + 1;
        }

        // Give the new worksheet a name.
        string sheetName = "Sheet" + sheetId;

        // Append the new worksheet and associate it with the workbook.
        Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };
        sheets.Append(sheet);
    }
}

関連項目

Open XML SDK クラス ライブラリ リファレンス