Suche…


Einführung

Bei der Datenüberprüfung kann der Benutzer eine Dropdown-Liste erstellen und die Werte in der Zelle auf diese Einträge beschränken. Aufgrund von Einschränkungen kann Excel nicht mehr als 256 Zeichen programmgesteuert binden. Um mehr als 256 Zeichen zu binden, kann man einem erläuterten Ansatz folgen.

Wenn die Summe aller Zeichen aller Listenelemente weniger als 256 beträgt

Sie können alle Elemente entweder aus einer beliebigen Konfigurationsdatei lesen oder inline eingeben.

Berücksichtigen Sie, ob es in der Konfigurationsdatei gespeichert ist

// Read all list items from config file
string[] countryDV = ConfigurationManager.AppSettings["countryDV"].Split(',').Select(s => s.Trim().ToUpper()).ToArray();
int DVRowLimit = (Int16.MaxValue); 
CellRangeAddressList countryDVAddList = new CellRangeAddressList(1, DVRowLimit, 0, 0);
dvConstraint = (XSSFDataValidationConstraint)validationHelper.CreateExplicitListConstraint(countryDV);
// In case of Inline list values 
// use this approach:  dvConstraint = (XSSFDataValidationConstraint)validationHelper.CreateExplicitListConstraint(new string[] { "USA", "CANADA"});
dataValidation = (XSSFDataValidation)validationHelper.CreateValidation(dvConstraint, countryDVAddList);
dataValidation.ShowErrorBox = true;
dataValidation.SuppressDropDownArrow = true;
dataValidation.ErrorStyle = 0;
dataValidation.CreateErrorBox("InvalidValue", "Select Valid country.");
dataValidation.ShowErrorBox = true;
dataValidation.CreatePromptBox("country Data Validation", "Enter country.");
dataValidation.ShowPromptBox = true;
sheet.AddValidationData(dataValidation);

Wenn die Summe aller Zeichen aller Listenelemente mehr als 256 beträgt.

Der Ansatz unterscheidet sich in diesem Fall vom vorherigen Beispiel, da die Excel-Datei die Datenüberprüfung für die Liste der Elemente mit einer Gesamtzahl der Zeichen unter 256 unterstützt, wenn alle Elemente wie im vorherigen Beispiel direkt gebunden sind. In vielen Situationen können Listenelemente jedoch mehr als 256 Zeichen umfassen. In diesem Fall funktioniert die direkte Bindung nicht.

Eine Excel-Datei unterstützt jedoch mehr als 256 Zeichen des Listenelements, wenn von einer anderen Spalte derselben Excel-Datei verwiesen wird. Als Workaround können Sie also einmal alle Werte aus der Datenbank oder Einstellungsdatei lesen und aus der aktuellen Ansicht in einer der entfernten Spalten verborgen halten, und Datenüberprüfung kann diese verborgene Spalte über die Formel lesen, um ein Listenelement zu erstellen. Der folgende Code zeigt diesen Ansatz durch Lesen der Datenwerte durch die Einstellungsdatei.

// Read all list items from config file
string[] countryDV = ConfigurationManager.AppSettings["countryDV"].Split(',').Select(s => s.Trim().ToUpper()).ToArray();
// Get the column name where you want to hide the list items, assume distant  column is "ZZ"
string countryDVDataCellColumn = ConfigurationManager.AppSettings["countryDVDataCellColumn"].Trim().ToString(); 

  
int DVRowLimit = (Int16.MaxValue); 
// Creating and Assigning Settings for Data Validation
CreateDropDownUsingCellReference(workbook, countryDV, "CountryConstraint", countryDVDataCellColumn);
CellRangeAddressList countryDVAddList = new CellRangeAddressList(1, DVRowLimit, targetFirstCol, targetLastCol);
dvConstraint = (XSSFDataValidationConstraint)validationHelper.CreateFormulaListConstraint("=CountryConstraint");
dvConstraint.Validate();
dataValidation = (XSSFDataValidation)validationHelper.CreateValidation(dvConstraint, countryDVAddList);
dataValidation.ShowErrorBox = true;
dataValidation.SuppressDropDownArrow = true;
dataValidation.ErrorStyle = 0;
dataValidation.CreateErrorBox("InvalidValue", "Select Valid country.");
dataValidation.ShowErrorBox = true;
dataValidation.CreatePromptBox("country Data Validation", "Enter country.");
dataValidation.ShowPromptBox = true;
sheet.AddValidationData(dataValidation);



private void CreateDropDownUsingCellReference(XSSFWorkbook wb, string[] csvListOfValues, string listName, string headerName)
{
    int columnIndex = CellReference.ConvertColStringToIndex(headerName);
    try
    {
    XSSFName namedCell = (XSSFName)wb.CreateName();
    namedCell.NameName = listName;
    //Creating Cell and Assigning Values from CSVListOfValues;
    for (int i = 0; i < csvListOfValues.Length; i++)
    {
            var namedRow = wb.GetSheetAt(0).CreateRow(i + 1);
            namedRow.CreateCell(columnIndex).SetCellValue(csvListOfValues[i]);
    }

    //Assigning the Reference for sheet 0 With Cell Range, where list items iscopied 
    String reference = wb.GetSheetAt(0).SheetName + "!$" + headerName + "$2:$" + headerName + "$" + (csvListOfValues.Length + 1).ToString();
    namedCell.RefersToFormula = reference;

    //Hiding the Column  now;
    wb.GetSheetAt(0).SetColumnHidden(columnIndex, true);
    }
    catch (Exception Ex)
    { }
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow