C# 我如何启用;“分享”;Excel工作簿上的选项?

C# 我如何启用;“分享”;Excel工作簿上的选项?,c#,.net,excel,openxml,closedxml,C#,.net,Excel,Openxml,Closedxml,是否可以通过或在excel文档上启用“共享”?或任何其他图书馆,如果它能帮助。。。我相信这通常是在保存文档时执行的(至少在VBA中是这样),但我找不到如何在C#中指定保存参数 我希望避免使用互操作,因为我可能会通过网络在多个文件上批处理此过程 编辑:根据,OpenXML无法操作受保护的文件存在一些限制。然而,这也适用于共享吗?使用OpenXMLSDK共享Excel文档的文档并没有很好的文档记录。 我做了一些测试,发现可以在Excel文档上共享 使用OpenXMLSDK。以下步骤是启用共享所必需的

是否可以通过或在excel文档上启用“共享”?或任何其他图书馆,如果它能帮助。。。我相信这通常是在保存文档时执行的(至少在VBA中是这样),但我找不到如何在C#中指定保存参数

我希望避免使用互操作,因为我可能会通过网络在多个文件上批处理此过程


编辑:根据,OpenXML无法操作受保护的文件存在一些限制。然而,这也适用于共享吗?

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

  • WorkbookUserDataPart
    添加到Excel文档中。添加一个空的
    Users
    集合 我喜欢这个角色。在此集合中,Excel存储当前拥有 此共享工作簿已打开

  • 工作簿修订标题部分添加到Excel文档中。添加
    标题
    集合 我喜欢这个角色。在此集合中,Excel将存储对历史、版本和修订的引用 信息。将第一个元素(
    标题
    )添加到包含
    SheetIdMap
    (用于跟踪修订记录)。在下面的代码示例中 我已经添加了文档中包含的所有工作表。 此外,将
    WorkbookRevisionLogPart
    添加到工作簿的修订标题部分。 在日志部分,将存储对文档所做修订的列表

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

    在启用共享之前,应先创建原始文档的备份

    使用(SpreadsheetDocument sd=SpreadsheetDocument.Open(“c:\\temp\\enable_sharing.xlsx”,true))
    {
    WorkbookPart WorkbookPart=sd.WorkbookPart;
    if(workbookPart.GetPartsUntoftype()!=0)
    {
    Console.Out.WriteLine(“Excel文档已共享!”);
    返回;
    }
    //如果用户数据部件不存在,则创建该部件。
    if(workbookPart.GetPartsUntoftype()==0)
    {
    Console.Out.WriteLine(“添加用户数据部分”);
    WorkbookUserDataPart WorkbookUserDataPart=workbookPart.AddNewPart();
    Users Users=new Users(){Count=(uint32值)0U};
    users.AddNamespaceDeclaration(“r”http://schemas.openxmlformats.org/officeDocument/2006/relationships");
    workbookUserDataPart.Users=用户;
    }
    //创建修订标题部分和修订日志部分。
    WorkbookRevisionHeaderPart WorkbookRevisionHeaderPart=workbookPart.AddNewPart();
    WorkbookRevisionLogPart WorkbookRevisionLogPart=WorkbookRevisionHeaderPart.AddNewPart();
    //创建修订的空集合。
    修订=新修订();
    修订。添加名称空间声明(“r”http://schemas.openxmlformats.org/officeDocument/2006/relationships");
    workbookRevisionLogPart.Revisions=修订版;
    字符串LastSetOfRevisionGUID=Guid.NewGuid().ToString(“B”);
    //创建标题集合(对历史记录、修订的引用)
    Headers Headers=new Headers(){Guid=LastSetOfRevisionGUID};
    headers.AddNamespaceDeclaration(“r”http://schemas.openxmlformats.org/officeDocument/2006/relationships");
    int worksheetpartscont=workbookPart.getpartscontoftype();
    //在headers集合中创建第一个元素
    //其中包含SheetIdMap。
    Header Header=new Header(){Guid=LastSetOfRevisionGUID,DateTime=DateTime。现在,
    MaxSheetId=(uint32值)(uint)工作表partScont+1,UserName=“hans”,Id=“rId1”};
    //创建用于跟踪的图纸ID列表
    //修订记录。针对文件中的每个工作表
    //创建一个图纸ID。
    SheetIdMap SheetIdMap=新SheetIdMap(){Count=(uint32值)(uint)工作表partScont};
    
    对于(uint i=1;我很好哇。非常感谢你。我会尽快试用的!实际上效果很好!我在网络上与不同的用户试用过,所有的更改都同时保存。如果我想摆脱共享,我可以删除修订标题部分,还是删除你在这里创建的所有内容?@Joe:我想你应该删除我爱一切,但我没有测试它。
    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;
    }