2012-10-27 49 views
1

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

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

编辑:根据some old pages from 2009,OpenXML无法运行受保护文件存在限制。但是,这也适用于分享吗?

回答

2

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

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

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

下面的代码示例显示了如何在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; 
} 
+0

好的哇。非常感谢你做的这些。我会尽快尝试! – Joe

+0

这实际上效果很好!我用网络上的不同用户尝试过,并且所有更改都同时保存。如果我想摆脱共享,我可以删除修订头部分,还是删除您在此创建的所有内容? – Joe

+0

@Joe:我认为你应该删除一切。但我没有测试它。 – Hans

相关问题