2017-03-01 1 views
1

Ich habe eine Arbeitsmappe mit einer Anzahl von Zellen, für die eine Datenvalidierung als Dropdown-Liste zulässiger Werte angegeben ist. Mit EPPlus möchte ich für jede Zelle die Liste der zulässigen Werte erhalten.So finden Sie die DataValidation-Liste für eine Excel-Zelle mit EPPlus

Bisher hat ich bekomme:

  • ExcelWorkSheet.DataValidations gibt mir ein ExcelDataValidationCollection, die eine Sammlung von IExcelDataValidation Elementen für das Arbeitsblatt ist.

  • Jede IExcelDataValidation hat eine Address-Eigenschaft vom Typ , die vermutlich auf alle Zellen verweist, die diese Validierungsregel haben.

  • Der Schritt, den ich auf bin stecken ist zu finden, wenn eine gegebene Zelle eine der Zellen in den ExcelAddress

Jeder Abnehmer enthalten ist?

Ich verwende derzeit EPPlus 3.1.1.0, kann aber bei Bedarf auf eine neuere Version aktualisieren.

UPDATE

ich diese deutlich genug, um nicht zu erklären haben. Hier ist meine Situation im Detail.

  • Angenommen, Spalte C hat einige Zellen mit Listendatenüberprüfung. Einige Zellen erlauben, sagen wir, "A, B, C"; andere Zellen erlauben "D, E, F", usw. Der Bereich von Zellen für jeden Datenüberprüfungsliste nicht zusammenhängend ist, so zum Beispiel:

    • C2, C4, C7-C10, C20 kann „A ermöglicht, B, C“
    • C3, C5-C6" , kann C15 erlauben "D, E, F"
  • ich versuche, welche Zellen zu bestimmen erlauben "A, B, C", und die es erlauben, "D, E, F" usw.

  • ExcelWorksheet.DataValidations enthält Elemente der ExcelDataValidationList, eine mit den Werten "A, B, C", eine mit den Werten "D, E, F" usw .

  • ExcelDataValidationList.Address für die Liste "A, B, C" enthält eine ExcelAddress, deren Address-Eigenschaft etwa wie folgt aussieht: "C4 C7: C10 C2 C20 ...".

  • Ich möchte feststellen, ob eine bestimmte Zelle (etwa C6) in dem durch diese Adresse angegebenen Bereich "C4 C7: C10 C2 C20 ..." enthalten ist.

  • Natürlich kann ich String.Split auf Leerzeichen, und jedes Element in der resultierenden Liste analysieren. Aber ich hatte gehofft, dass es einen direkteren Weg geben würde, z.B.

    ExcelAddress.Contains("C6") 
    

    oder

    ExcelAddress.Contains(6, 2) // row 6 col 2 = C6 
    

    Antwort

    0

    Fast fertig, überprüfen nur die IExcelDataValidation ‚s spezifischen Typ. Getestet mit EPPlus 4.1.0.0:

    using (var package = new ExcelPackage(new FileInfo(path))) 
    { 
        var sheet = package.Workbook.Worksheets[1]; 
        var validations = sheet.DataValidations; 
        foreach (var validation in validations) 
        { 
         var list = validation as ExcelDataValidationList; 
         if (list != null) 
         { 
          var range = sheet.Cells[list.Formula.ExcelFormula]; 
          var rowStart = range.Start.Row; 
          var rowEnd = range.End.Row; 
          // allowed values probably only in one column.... 
          var colStart = range.Start.Column; 
          var colEnd = range.End.Column; 
          for (int row = rowStart; row <= rowEnd; ++row) 
          { 
           for (int col = colStart; col <= colEnd; col++) 
           { 
            Console.WriteLine(sheet.Cells[row, col].Value); 
           } 
          } 
         } 
        } 
    } 
    

    Test-Arbeitsblatt:

    enter image description here

    Ausgang:

    one 
    two 
    three 
    
    +0

    sheet.Cells [list.Formula.ExcelFormula] sind Sie sicher, dass das funktioniert? – kassi

    Verwandte Themen