繁体   English   中英

如何使用 [Apache POI] 创建依赖下拉列表

[英]How to create a dependent drop down list using [Apache POI]

在这里,我使用[Apache POI]创建一个 excel 模板,用户可以填写数据。 在这两个下拉列表中。 想要创建一个依赖于前一个单元格的下拉列表的下拉列表。 例如:如果 I select 单元格 3 中的蔬菜类别,“米饭、凝乳、牛奶”项目将出现在单元格 4 的相关下拉列表中。代码如下。

在这里收集数据

   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);
                }
            }
        }
    }
}

在下拉列表中分配数据

// 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);
        }
    }

创建依赖下拉列表不是apache poi可以做的。 apache poi库用于创建Excel文件。 必须在运行生成文件的Excel的 GUI 中管理下拉列表的依赖项Apache poi只能创建Excel文件,以便可以这样做。

一种方法是为数据验证列表使用命名范围,然后使用INDIRECT他们的名字。 所以主列表包含依赖列表的命名范围的名称。 并且依赖列表使用=INDIRECT([cell of main list])然后获取从主列表中选择姓名的依赖列表。

如何使用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();

 }
}

改进一点 - 使用 OFFSET 为任何 B 列工作


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(OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0,-1)) for any B column");
   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();

 }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM