2012-10-27 2 views
1

엑셀 문서에서 "공유"를 활성화 할 수 있습니까? OpenXML 또는 ClosedXML? 아니면 도움이 될 수있는 다른 라이브러리 ... 나는 이것이 일반적으로 문서를 저장하면 (적어도 그것은 VBA에서 작동하는 방식으로) 수행되지만, C#에서 저장 인수를 지정하는 방법을 찾을 수 없다고 생각합니다.Excel 통합 문서에서 "공유"옵션을 어떻게 활성화 할 수 있습니까?

네트워크를 통해 여러 파일에이 프로세스를 배치 할 수 있으므로 InterOp를 사용하지 않는 것이 좋습니다.

편집 : some old pages from 2009에 따르면 OpenXML이 보호 된 파일을 작동 할 수없는 제한 사항이 있습니다. 그러나, 그것은 공유에도 적용됩니까?

답변

2

OpenXML SDK를 사용하여 Excel 문서를 공유하는 방법에 대해서는 잘 설명되어 있지 않습니다. 몇 가지 테스트를 수행 한 결과 Excel 문서에서 OpenXML SDK를 사용하여 을 공유 할 수 있음을 알았습니다. 공유를 설정하려면 다음 단계를 수행해야합니다.

  1. Excel 문서에 WorkbookUserDataPart을 추가하십시오. 빈 Users 컬렉션 을 부품에 추가하십시오. 이 컬렉션에서 Excel은 현재 공유 통합 문서가 열려있는 모든 사용자를 저장합니다.

  2. 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; 
} 
+0

Ok 와우. 이것에 정말 감사드립니다. 최대한 빨리 시도해 보겠습니다. – Joe

+0

이것은 실제로 효과적입니다! 나는 네트워크상의 다른 사용자와 함께 시도하고 모든 변경 사항이 동시에 저장되었습니다. 공유를 제거하려면 revisionheader 부분을 제거하거나 여기에서 작성한 모든 것을 제거해야합니까? – Joe

+0

@ Joe : 나는 모든 것을 제거해야한다고 생각합니다. 그러나 나는 그것을 시험하지 않았다. – Hans