OpenXML SDK를 사용하여 Excel 문서를 공유하는 방법에 대해서는 잘 설명되어 있지 않습니다. 몇 가지 테스트를 수행 한 결과 Excel 문서에서 OpenXML SDK를 사용하여 을 공유 할 수 있음을 알았습니다. 공유를 설정하려면 다음 단계를 수행해야합니다.
Excel 문서에 WorkbookUserDataPart
을 추가하십시오. 빈 Users
컬렉션 을 부품에 추가하십시오. 이 컬렉션에서 Excel은 현재 공유 통합 문서가 열려있는 모든 사용자를 저장합니다.
Excel 문서에 WorkbookRevisionHeaderPart
을 추가하십시오. 부품에 Headers
콜렉션 을 추가하십시오. 이 컬렉션에서 Excel은 기록, 버전 및 수정본에 대한 참조를 정보로 저장합니다. SheetIdMap
(개정 기록 추적에 사용됨)을 포함하는 첫 번째 요소 (Header
)를 콜렉션에 추가하십시오. 아래 코드 샘플 에서 문서에 포함 된 모든 워크 시트를 추가했습니다. 또한 통합 문서의 수정 머리글 부분에 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;
}
Ok 와우. 이것에 정말 감사드립니다. 최대한 빨리 시도해 보겠습니다. – Joe
이것은 실제로 효과적입니다! 나는 네트워크상의 다른 사용자와 함께 시도하고 모든 변경 사항이 동시에 저장되었습니다. 공유를 제거하려면 revisionheader 부분을 제거하거나 여기에서 작성한 모든 것을 제거해야합니까? – Joe
@ Joe : 나는 모든 것을 제거해야한다고 생각합니다. 그러나 나는 그것을 시험하지 않았다. – Hans