C# 我如何启用;“分享”;Excel工作簿上的选项?
是否可以通过或在excel文档上启用“共享”?或任何其他图书馆,如果它能帮助。。。我相信这通常是在保存文档时执行的(至少在VBA中是这样),但我找不到如何在C#中指定保存参数 我希望避免使用互操作,因为我可能会通过网络在多个文件上批处理此过程C# 我如何启用;“分享”;Excel工作簿上的选项?,c#,.net,excel,openxml,closedxml,C#,.net,Excel,Openxml,Closedxml,是否可以通过或在excel文档上启用“共享”?或任何其他图书馆,如果它能帮助。。。我相信这通常是在保存文档时执行的(至少在VBA中是这样),但我找不到如何在C#中指定保存参数 我希望避免使用互操作,因为我可能会通过网络在多个文件上批处理此过程 编辑:根据,OpenXML无法操作受保护的文件存在一些限制。然而,这也适用于共享吗?使用OpenXMLSDK共享Excel文档的文档并没有很好的文档记录。 我做了一些测试,发现可以在Excel文档上共享 使用OpenXMLSDK。以下步骤是启用共享所必需的
编辑:根据,OpenXML无法操作受保护的文件存在一些限制。然而,这也适用于共享吗?使用OpenXMLSDK共享Excel文档的文档并没有很好的文档记录。 我做了一些测试,发现可以在Excel文档上共享 使用OpenXMLSDK。以下步骤是启用共享所必需的:
WorkbookUserDataPart
添加到Excel文档中。添加一个空的Users
集合
我喜欢这个角色。在此集合中,Excel存储当前拥有
此共享工作簿已打开工作簿修订标题部分添加到Excel文档中。添加标题
集合
我喜欢这个角色。在此集合中,Excel将存储对历史、版本和修订的引用
信息。将第一个元素(标题
)添加到包含
SheetIdMap
(用于跟踪修订记录)。在下面的代码示例中
我已经添加了文档中包含的所有工作表。
此外,将WorkbookRevisionLogPart
添加到工作簿的修订标题部分。
在日志部分,将存储对文档所做修订的列表
使用(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;
}