Voy a crear una plantilla de Excel usando [Apache POI]
en los que el usuario puede rellenar los datos. Porque dos lista desplegable están ahí. ¿Quieres crear una lista desplegable que depende desplegables de celda anterior. Por ejemplo: Si selecciono categoría de verduras en la celda 3, y "arroz, cuajada, leche" artículos aparecerán en la lista desplegable dependiente hacia abajo en la celda 4. Los códigos están por debajo.
Aquí la recopilación de datos
List<InternetItemResponse> internetItems = internetItemService.getAllByHotelId(hotelId);
if (CollectionUtils.isNotEmpty(internetItems)) {
String[] itemsName = new String[internetItems.size()];
String[] itemsCategory = new String[internetItems.size()];
String itemName;
String itemCategory;
Map<String, Set<String>> categoryVsItemName = new HashMap<>();
Set<String> itemList;
for (int i = 0; i < internetItems.size(); i++) {
InternetItemResponse itemResponse = internetItems.get(i);
if (itemResponse != null) {
itemCategory = itemResponse.getCategory();
if (!StringUtils.isEmpty(itemCategory)) {
itemsCategory[i] = itemCategory;
itemName = itemResponse.getTitle();
itemsName[i] = itemName;
if (CollectionUtils.isEmpty(categoryVsItemName.get(itemCategory))) {
itemList = new HashSet<>();
itemList.add(itemName);
categoryVsItemName.put(itemCategory, itemList);
} else {
categoryVsItemName.get(itemCategory).add(itemName);
}
}
}
}
}
La asignación de los datos de la lista desplegable
// Setting drop down values
for (int i = 0; i < headerColumns.length; i++) {
if (i == 3) {
XSSFDataValidationHelper mealdvHelper = new XSSFDataValidationHelper((XSSFSheet) sheet);
XSSFDataValidationConstraint mealdvConstraint = (XSSFDataValidationConstraint) mealdvHelper
.createExplicitListConstraint(itemsCategory);
// CellRangeAddressList(int firstRow, int lastRow, int firstCol, int lastCol)
CellRangeAddressList addressListmeal = new CellRangeAddressList(1, 99, i, i);
XSSFDataValidation categoryDataValidation = (XSSFDataValidation) mealdvHelper
.createValidation(mealdvConstraint, addressListmeal);
categoryDataValidation.setShowErrorBox(true);
categoryDataValidation.setSuppressDropDownArrow(true);
categoryDataValidation.setShowPromptBox(true);
sheet.addValidationData(categoryDataValidation);
} else if (i == 4) {
XSSFDataValidationHelper rmCategorydvHelper = new XSSFDataValidationHelper((XSSFSheet) sheet);
XSSFDataValidationConstraint rmCategorydvConstraint = (XSSFDataValidationConstraint) rmCategorydvHelper
.createExplicitListConstraint(itemsName);
CellRangeAddressList addressListrmCategory = new CellRangeAddressList(1, 99, i, i);
XSSFDataValidation itemNameValidation = (XSSFDataValidation) rmCategorydvHelper
.createValidation(rmCategorydvConstraint, addressListrmCategory);
itemNameValidation.setShowErrorBox(true);
itemNameValidation.setSuppressDropDownArrow(true);
itemNameValidation.setShowPromptBox(true);
sheet.addValidationData(itemNameValidation);
}
}
Creación de listas desplegables dependientes no es nada lo apache poi
podría hacer. La apache poi
biblioteca está hecha para la creación de Excel
archivos. La dependencia de las listas desplegables debe gestionarse de Excel
s interfaz gráfica de usuario en el que el archivo generado se ejecuta en. Apache poi
Sólo puede crear el Excel
archivo de manera que esto es posible a continuación.
Un enfoque es el uso de rangos con nombre para las listas de validación de datos quién es nombres son conseguidos a continuación, utilizando INDIRECT
. Por lo que la lista principal contiene los nombres de los rangos con nombre de las listas dependientes. Y la lista dependiente utiliza =INDIRECT([cell of main list])
a continuación para obtener la lista depende cuyo nombre se selecciona de la lista principal.
Ejemplo de cómo esto puede ser creado usando apache poi
:
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.util.*;
import java.util.Map;
import java.util.HashMap;
class CreateExcelDependentDataValidationListsUsingNamedRanges {
public static void main(String[] args) throws Exception {
//some data
Map<String, String[]> categoryItems = new HashMap<String, String[]>();
categoryItems.put("Countries", new String[]{"France", "Germany", "Italy"});
categoryItems.put("Capitals", new String[]{"Paris", "Berlin", "Rome"});
categoryItems.put("Fruits", new String[]{"Apple", "Peach", "Banana", "Orange"});
Workbook workbook = new XSSFWorkbook();
//hidden sheet for list values
Sheet sheet = workbook.createSheet("ListSheet");
Row row;
Name namedRange;
String colLetter;
String reference;
int c = 0;
//put the data in
for (String key : categoryItems.keySet()) {
int r = 0;
row = sheet.getRow(r); if (row == null) row = sheet.createRow(r); r++;
row.createCell(c).setCellValue(key);
String[] items = categoryItems.get(key);
for (String item : items) {
row = sheet.getRow(r); if (row == null) row = sheet.createRow(r); r++;
row.createCell(c).setCellValue(item);
}
//create names for the item list constraints, each named from the current key
colLetter = CellReference.convertNumToColString(c);
namedRange = workbook.createName();
namedRange.setNameName(key);
reference = "ListSheet!$" + colLetter + "$2:$" + colLetter + "$" + r;
namedRange.setRefersToFormula(reference);
c++;
}
//create name for Categories list constraint
colLetter = CellReference.convertNumToColString((c-1));
namedRange = workbook.createName();
namedRange.setNameName("Categories");
reference = "ListSheet!$A$1:$" + colLetter + "$1";
namedRange.setRefersToFormula(reference);
//unselect that sheet because we will hide it later
sheet.setSelected(false);
//visible data sheet
sheet = workbook.createSheet("Sheet1");
sheet.createRow(0).createCell(0).setCellValue("Select Category");
sheet.getRow(0).createCell(1).setCellValue("Select item from that category");
sheet.setActiveCell(new CellAddress("A2"));
sheet.autoSizeColumn(0);
sheet.autoSizeColumn(1);
//data validations
DataValidationHelper dvHelper = sheet.getDataValidationHelper();
//data validation for categories in A2:
DataValidationConstraint dvConstraint = dvHelper.createFormulaListConstraint("Categories");
CellRangeAddressList addressList = new CellRangeAddressList(1, 1, 0, 0);
DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);
sheet.addValidationData(validation);
//data validation for items of the selected category in B2:
dvConstraint = dvHelper.createFormulaListConstraint("INDIRECT($A$2)");
addressList = new CellRangeAddressList(1, 1, 1, 1);
validation = dvHelper.createValidation(dvConstraint, addressList);
sheet.addValidationData(validation);
//hide the ListSheet
workbook.setSheetHidden(0, true);
//set Sheet1 active
workbook.setActiveSheet(1);
FileOutputStream out = new FileOutputStream("CreateExcelDependentDataValidationListsUsingNamedRanges.xlsx");
workbook.write(out);
workbook.close();
out.close();
}
}