apache-poi
NPOI: approccio di convalida dei dati per XSSF (.xslx) excel usando c #
Ricerca…
introduzione
La convalida dei dati consente all'utente di creare un elenco a discesa e limitare i valori nella cella a queste voci. A causa delle limitazioni, Excel non può associare più di 256 caratteri a livello di codice. Per legare più di 256 caratteri si può seguire l'approccio spiegato.
Quando la somma di tutti i caratteri totali di un elemento dell'elenco conta meno di 256
Puoi leggere tutti gli elementi da qualsiasi file di configurazione o digitarli in linea.
Considerando se è stato salvato nel file di configurazione
// 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);
Quando la somma di tutti i caratteri totali di un elemento dell'elenco conta più di 256.
L'approccio in questo caso sarà diverso rispetto all'esempio precedente poiché il file Excel supporta la convalida dei dati per l'elenco di elementi con un numero totale di caratteri inferiore a 256 se tutti gli elementi sono vincolati direttamente come nell'esempio precedente. Ma in molti casi le voci dell'elenco possono essere più lunghe di 256 caratteri e in tal caso il binding diretto non funzionerà.
Tuttavia, il file excel supporta più di 256 caratteri dell'elemento della lista se viene inviato da una colonna diversa dello stesso file excel. Quindi, una volta che una soluzione è possibile leggere tutti i valori dal database o dal file delle impostazioni e tenerlo nascosto dalla vista corrente in una colonna distante e la convalida dei dati può leggere questa colonna nascosta attraverso la formula per creare l'elemento della lista. Sotto il codice mostrerà questo approccio leggendo i valori dei dati attraverso il file di impostazione.
// 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)
{ }
}