OpenXML SDK を使用した Excel ドキュメントの共有については、十分に文書化されていません。いくつかのテストを行ったところ、OpenXML SDK を使用して Excel ドキュメントの共有を有効にできることがわかりました。共有を有効にするには、次の手順が必要です。
WorkbookUserDataPart
をExcel ドキュメントに追加します。パーツに空のUsers
コレクションを追加します。このコレクションには、現在この共有ブックを開いているすべてのユーザーが保存されます。
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;
}