1

OpenXMLまたはClosedXMLを介してExcelドキュメントで「共有」を有効にすることは可能ですか?または、他のライブラリが役立つ場合は...これは通常、ドキュメントを保存するときに実行されると思います(少なくとも、VBAではこのように機能します)が、C#で保存引数を指定する方法が見つかりません。

ネットワークを介して複数のファイルでこのプロセスをバッチ処理する可能性があるため、InterOpの使用は避けたいと思います。

編集: 2009年の古いページによると、OpenXMLが保護されたファイルを操作できないという制限があります。しかし、それは共有にも当てはまりますか?

4

1 に答える 1

3

OpenXML SDK を使用した Excel ドキュメントの共有については、十分に文書化されていません。いくつかのテストを行ったところ、OpenXML SDK を使用して Excel ドキュメントの共有を有効にできることがわかりました。共有を有効にするには、次の手順が必要です。

  1. WorkbookUserDataPartをExcel ドキュメントに追加します。パーツに空のUsersコレクションを追加します。このコレクションには、現在この共有ブックを開いているすべてのユーザーが保存されます。

  2. WorkbookRevisionHeaderPartをExcel ドキュメントに追加します。Headersパーツにコレクションを追加します。このコレクションでは、Excel は履歴、バージョン、およびリビジョン情報への参照を保存します。(リビジョン レコードの追跡に使用されるHeader) を含むコレクションに 最初の要素 ( ) を追加します。SheetIdMap以下のコード サンプルでは、​​ドキュメントに含まれるすべてのワークシートを追加しました。WorkbookRevisionLogPartさらに、ワークブックのリビジョン ヘッダー部分に a を追加します。ログ部分には、ドキュメントに加えられたリビジョンのリストが保存されます。

次のコード サンプルは、Excel ドキュメントで共有を有効にする方法を示しています。このコードは、ドキュメントで共有が既に有効になっているかどうかも確認します。

共有を有効にする前に、元のドキュメントのバックアップを作成する必要があります。

using (SpreadsheetDocument sd = SpreadsheetDocument.Open("c:\\temp\\enable_sharing.xlsx", true))
{
  WorkbookPart workbookPart = sd.WorkbookPart;

  if (workbookPart.GetPartsCountOfType<WorkbookRevisionHeaderPart>() != 0)
  {
    Console.Out.WriteLine("Excel document already shared!");
    return;
  }

  // Create user data part if it does not exist.
  if (workbookPart.GetPartsCountOfType<WorkbookUserDataPart>() == 0)
  {
    Console.Out.WriteLine("Adding user data part");
    WorkbookUserDataPart workbookUserDataPart = workbookPart.AddNewPart<WorkbookUserDataPart>();

    Users users = new Users() { Count = (UInt32Value)0U };
    users.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");

    workbookUserDataPart.Users = users;
  }

  // Create revision header part and revision log part.
  WorkbookRevisionHeaderPart workbookRevisonHeaderPart = workbookPart.AddNewPart<WorkbookRevisionHeaderPart>();

  WorkbookRevisionLogPart workbookRevisionLogPart = workbookRevisonHeaderPart.AddNewPart<WorkbookRevisionLogPart>();

  // Create empty collection of revisions.
  Revisions revisions = new Revisions();
  revisions.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");

  workbookRevisionLogPart.Revisions = revisions;

  string lastSetOfRevisionsGuid = Guid.NewGuid().ToString("B");

  // Create headers collection (references to history, revisions)
  Headers headers = new Headers() { Guid = lastSetOfRevisionsGuid };
  headers.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");

  int worksheetPartsCount = workbookPart.GetPartsCountOfType<WorksheetPart>();                        

  // Create first element in headers collection
  // which contains the SheetIdMap.
  Header header = new Header() { Guid = lastSetOfRevisionsGuid, DateTime = DateTime.Now, 
                                 MaxSheetId = (UInt32Value)(uint)worksheetPartsCount+1, UserName = "hans", Id = "rId1" };

  // Create the list of sheet IDs that are used for tracking
  // revision records. For every worksheet in the document
  // create one SheetId.
  SheetIdMap sheetIdMap = new SheetIdMap() { Count = (UInt32Value)(uint)worksheetPartsCount };

  for (uint i = 1; i <= worksheetPartsCount; i++)
  {
    SheetId sheetId = new SheetId() { Val = (UInt32Value)i };

    sheetIdMap.Append(sheetId);
  }        

  header.Append(sheetIdMap);
  headers.Append(header);

  workbookRevisonHeaderPart.Headers = headers;
}
于 2012-11-01T09:01:57.403 に答える