2014-01-30 2 views
1

.xlsm 파일을 처리 중이며 openXML 및 C#을 사용하여 데이터 유효성 검사를 위해 다른 시트에서 목록을 사용하는 방법을 알아야합니다.OpenXML을 사용하여 데이터 유효성 검사를 위해 목록을 연결하는 방법

시작하려면 두 개의 빈 시트와 매크로가있는 .xlsm 파일이 있습니다. 내 프로그램에서 파일을 열고 Sheet1에 열 머리글을 만든 다음 sheet2에 유효성 검사 목록을 만듭니다. 그래서, 내 프로그램을 실행 한 후 Sheet1 "A1"은 "Color"텍스트를 포함하고 Sheet2 "A1 : A4"는 "Blue", "Green", "Red", "Yellow"를 포함합니다. 나는 이것을 아주 잘한다.

4 가지 색상이 포함 된 sheet1의 열 "A"의 모든 셀에 드롭 다운 목록이 있으므로 유일한 입력으로 적용하도록하겠습니다. Microsoft Excel에서는 "데이터"탭으로 이동하여 "데이터 유효성 검사"를 선택하여 "목록"을 선택하고 사용할 셀을 강조 표시합니다. 이 연관성을 프로그래밍 방식으로 만들어야합니다.

내가 수동으로 할 경우 Microsoft Excel에서이 작성하는 (희망) XML

은 이것이다 :

<extLst> 
    <ext uri="{CCE6A557-97BC-4b89-ADB6-D9C93CAAB3DF}" xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"> 

     <x14:dataValidations count="1" xmlns:xm="http://schemas.microsoft.com/office/excel/2006/main"> 

      <x14:dataValidation type="list" allowBlank="1" showInputMessage="1" showErrorMessage="1"> 

       <x14:formula1> 
        <xm:f>'Validation Data'!$A$1:$A$4</xm:f> 
       </x14:formula1> 

       <xm:sqref>A1:A1048576</xm:sqref> 

      </x14:dataValidation> 

     </x14:dataValidations> 

    </ext> 
</extLst> 

다음 방법 및 결과는 내가 노력 무언가이다. 내가하려고하는 것에 대한 더 나은 아이디어를 줄 수 있습니다.

여기서 "sheet2 '! $ A $ 1 : $ A $ 4"를 "validationListCells"매개 변수로 전달합니다. 이 예제에서는 "Red", "Green"... 등의 색상 이름을 포함하는 "Sheet2"의 셀을 나타냅니다.

"cellsToValidate"매개 변수로 "A2 : A1048576"을 전달합니다. 이것은 유효성 검사를 시행하고자하는 Sheet1 열 "A"의 모든 셀을 나타냅니다.

"sheet1"을 worksheetName 매개 변수로 전달합니다.

private void InsertValidation(String worksheetName, String validationListCells, String cellsToValidate) 
{ 

    DataValidations dataValidations1 = new DataValidations() { Count = (UInt32Value)1U }; 
    DataValidation dataValidation1 = new DataValidation() 
    { 

     Formula1 = new Formula1(validationListCells), 
     Type = DataValidationValues.List, 
     ShowInputMessage = true, 
     ShowErrorMessage = true, 
     SequenceOfReferences = new ListValue<StringValue>() { InnerText = cellsToValidate } 
    }; 

    dataValidations1.Append(dataValidation1); 
    using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(_documentPath, true)) 
    { 
     WorksheetPart worksheetPart = GetWorksheetPartByName(spreadSheet, worksheetName); 
     worksheetPart.Worksheet.Append(dataValidations1); 
     worksheetPart.Worksheet.Save(); 
    } 
} 

결과적으로이 XML은 Sheet1.xml에 있습니다. 어떤 Excel에서 오류가 발생합니다. 이 Excel에서 만든 XML과 유사하기 시작 이후는 바른 길에있을 수 있습니다처럼

<x:dataValidations count="1"> 

    <x:dataValidation type="list" showInputMessage="1" showErrorMessage="1" sqref="A2: A1048576"> 
     <x:formula1>'Sheet2'!$A$1:$A$5</x:formula1> 
    </x:dataValidation> 

</x:dataValidations> 

그것은 보이는,하지만 난 OPENXML에 완전히 새로운 그리고 난 그물에이 주제에 대해 조금을 찾는거야.

미리 감사드립니다.

+0

는 여러 XML 파일 또는 하나를 위해이 작업을 수행해야합니까? search와 replace를 사용하여이 작업을 수행해야하는 경우 이미이 작업을 수행하기에 충분할 수 있습니다. – FlyingFoX

+0

글쎄, 한 번에 하나의 스프레드 시트 만 처리합니다. 검색을 사용하고 바꾸는 것이 무슨 뜻인지 확실하지 않습니다. 처음에 이것을 알아 내려고 노력하면서 openXML DataValidation 및 DataValidations 클래스와 수식 클래스를 사용해야하는 것처럼 보였습니다. 편집 된 게시물을 참조하십시오. – user3251089

+1

해결 되었습니까?정확히 같은 문제가 있지만 최종 범위 값에 +1 대신 + 20이 있습니다. 제 경우에는 +20 항목 카탈로그에서만 발생합니다. 짧은 것들은 잘 작동합니다. –

답변

0

이 코드를 필요로하는 다른 사용자는 아래 코드를 사용했습니다. 거기에 user3251089의 변수 이름을 넣었습니다.

일반적으로 프로그래밍 방식으로 Excel "기능"을 만들려고 할 때 수동으로 그 기능이있는 기본 Excel을 수동으로 만듭니다 (추가 시트 삭제). 그런 다음 코드를 반영하고 더 예쁘게 만듭니다.

누군가에게 제공되기를 바랍니다.

using Excel = DocumentFormat.OpenXml.Office.Excel; 
using X14 = DocumentFormat.OpenXml.Office2010.Excel; 

.....

Worksheet worksheet = worksheetPart.Worksheet; 
WorksheetExtensionList worksheetExtensionList = new WorksheetExtensionList(); 
WorksheetExtension worksheetExtension = new WorksheetExtension() { Uri = "{CCE6A557-97BC-4b89-ADB6-D9C93CAAB3DF}" }; 
worksheetExtension.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"); 

X14.DataValidations dataValidations = new X14.DataValidations() { Count = (UInt32Value)3U }; 
dataValidations.AddNamespaceDeclaration("xm", "http://schemas.microsoft.com/office/excel/2006/main"); 

//sites validation 
dataValidations.Append(new X14.DataValidation() 
{ 
    Type = DataValidationValues.List, 
    AllowBlank = true, 
    ShowInputMessage = true, 
    ShowErrorMessage = true, 
    DataValidationForumla1 = new X14.DataValidationForumla1() { Formula = new Excel.Formula(validationListCells) }, 
    ReferenceSequence = new Excel.ReferenceSequence(cellsToValidate) 
}); 

worksheetExtension.Append(dataValidations); 
worksheetExtensionList.Append(worksheetExtension); 
worksheet.Append(worksheetExtensionList); 
worksheet.Save(); 
관련 문제