次の方法で共有


ストリームからスプレッドシート ドキュメントを開く

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


ストリームから開く場合

ストリームの入出力を使用してドキュメントを操作するアプリケーション (Microsoft SharePoint Foundation 2010 など) があり、Open XML SDK を使用していずれかのドキュメントを操作する場合、これは簡単に実行できるように設計されています。 これは、ドキュメントが存在し、Open XML SDK を使用して開くことができる場合に特に当てはまります。 しかし、ドキュメントが、開いているストリームであり、コードの中で SDK を使用して操作する必要がある場合はどうすればよいでしょうか。 このトピックではそのようなシナリオについて説明します。 サンプル コードのサンプル メソッドは、オープン ストリームをパラメーターとして受け入れ、Open XML SDK を使用してストリームの背後にあるドキュメントにテキストを追加します。


SpreadsheetDocument オブジェクト

SpreadsheetML ドキュメントの基本的なドキュメント構造は、Workbook内のワークシートを参照するSheets要素とSheet要素で構成されます。 Worksheetごとに個別の XML ファイルが作成されます。 たとえば、MySheet1 と MySheet2 という名前の 2 つのワークシートがあるブックの SpreadsheetML は 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 つ以上のブロック レベル要素が含まれています。 sheetData はセル テーブルを表し、1 つ以上の Row 要素を含みます。 rowには、1 つ以上のCell要素が含まれています。 各セルには、セルの値を表す CellValue 要素が含まれています。 たとえば、ブック内の最初のワークシートの SpreadsheetML (セル A1 に値 100 があるのみ) は、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/> Workbook メイン ドキュメント パーツのルート要素。
<sheets/> Sheets sheet、fileVersion、および などのブロック レベル構造体のコンテナー ISO /IEC 29500 仕様で指定されているその他。
<sheet/> Sheet シート定義ファイルを指し示すシート。
<worksheet/> Worksheet シート データが含まれているシート定義ファイル。
<sheetData/> SheetData セルの表。行ごとにグループ化されています。
<row/> Row セルの表内の行。
<c/> Cell 行内のセル。
<v/> CellValue セルの値。

SpreadsheetML マークアップを生成してワークシートを追加する

メイン ドキュメント パーツの本文にアクセスできる場合は、AddNewPart メソッドを呼び出して新しいWorksheetPartを作成することでワークシートを追加します。 次のコード例では、新しい WorksheetPartを追加します。


// Add a new worksheet.
WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());


サンプル コード

この例では、 OpenAndAddToSpreadsheetStream メソッドを使用して、既に開いているストリームからスプレッドシート ドキュメントを開き、テキストを追加できます。 以下に、C# と Visual Basic による完全なサンプル コードを示します。

using (FileStream fileStream = new FileStream(args[0], FileMode.Open, FileAccess.ReadWrite))
{
    OpenAndAddToSpreadsheetStream(fileStream);
}

OpenAddAndAddToSpreadsheetStream メソッドでは、渡されたストリームが閉じられないことに注意してください。 呼び出し元のコードは、手動で、または using ステートメントを使用してこれを行う必要があります。

以下に、C# と Visual Basic による完全なサンプル コードを示します。

static void OpenAndAddToSpreadsheetStream(Stream stream)
{
    // Open a SpreadsheetDocument based on a stream.
    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(stream, true))
    {

        if (spreadsheetDocument is not null)
        {
            // Get or create the WorkbookPart
            WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart ?? spreadsheetDocument.AddWorkbookPart();


            // Add a new worksheet.
            WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();
            newWorksheetPart.Worksheet = new Worksheet(new SheetData());


            Workbook workbook = workbookPart.Workbook ?? new Workbook();

            if (workbookPart.Workbook is null)
            {
                workbookPart.Workbook = workbook;
            }

            Sheets sheets = workbook.GetFirstChild<Sheets>() ?? 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);
        }
    }
}


関連項目