如何启用Excel工作簿上的“共享”选项?

是否可以通过OpenXML或ClosedXML在Excel文档中启用“共享”? 或者任何其他库,如果它可以帮助…我相信这通常是当您保存文件(至less这是如何在VBA中工作)执行,但我找不到如何在C#中指定保存参数。

我想避免使用InterOp,因为我可能通过networking在多个文件上批量执行此过程。

编辑:根据2009年的一些旧页面 ,OpenXML无法运行受保护的文件是有限制的。 但是,这也适用于分享?

使用OpenXML SDK共享Excel文档没有很好的文档。 我做了一些testing,发现可以使用OpenXML SDK在Excel文档上启用共享。 以下步骤是启用共享所必需的:

  1. WorkbookUserDataPart添加到您的Excel文档。 向零件添加一个空的Users集合。 在此集合中,Excel将存储当前打开此共享工作簿的所有用户。

  2. WorkbookRevisionHeaderPart添加到您的Excel文档。 向部件添加一个Headers集合。 在这个集合中,Excel将存储对历史,版本和修订信息的引用。 将第一个元素( Header )添加到包含SheetIdMap (用于跟踪修订logging)的集合中。 在下面的代码示例中,我添加了文档中包含的所有工作表。 此外,将WorkbookRevisionLogPart添加到工作簿的修订标题部分。 在日志部分存储对文档进行修改的列表。

下面的代码示例显示了如何在Excel文档上启用共享。 该代码还会检查文档上是否已启用共享。

在启用共享之前,您应该创build原始文档的备份。

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