是否可以通過OpenXML或ClosedXML在Excel文檔中啓用「共享」?或者任何其他庫,如果它可以幫助...我相信這通常是當你保存文件(至少這是如何在VBA中工作)執行,但我找不到如何在C#中指定保存參數。如何啓用Excel工作簿上的「共享」選項?
我想避免使用InterOp,因爲我可能通過網絡在多個文件上批量執行此過程。
編輯:根據some old pages from 2009,OpenXML無法運行受保護文件存在限制。但是,這也適用於分享嗎?
是否可以通過OpenXML或ClosedXML在Excel文檔中啓用「共享」?或者任何其他庫,如果它可以幫助...我相信這通常是當你保存文件(至少這是如何在VBA中工作)執行,但我找不到如何在C#中指定保存參數。如何啓用Excel工作簿上的「共享」選項?
我想避免使用InterOp,因爲我可能通過網絡在多個文件上批量執行此過程。
編輯:根據some old pages from 2009,OpenXML無法運行受保護文件存在限制。但是,這也適用於分享嗎?
使用OpenXML SDK共享Excel文檔沒有很好的記錄。 我做了一些測試,發現可以使用OpenXML SDK在Excel文檔 上啓用共享。以下步驟是啓用共享所必需的:
將WorkbookUserDataPart
添加到您的Excel文檔中。向零件添加一個空的Users
集合 。在此集合中,Excel將存儲當前已打開此共享工作簿的所有用戶 。
在您的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;
}
好的哇。非常感謝你做的這些。我會盡快嘗試! – Joe
這實際上效果很好!我用網絡上的不同用戶嘗試過,並且所有更改都同時保存。如果我想擺脫共享,我可以刪除修訂頭部分,還是刪除您在此創建的所有內容? – Joe
@Joe:我認爲你應該刪除一切。但我沒有測試它。 – Hans