POI——动态修改Excel模板下拉框

1 篇文章 0 订阅

需求:

在导入页面放置了的Excel模板,最开始内容是写死的。现在需要将数据库的数据动态的加载到excel模板的下拉框中。使用的为poi.xssf


相关jar包

poi-3.10-FINAL-20140208.jar
poi-ooxml-3.10-FINAL-20140208.jar
poi-ooxml-schemas-3.10-FINAL-20140208.jar


方法思路:

读取Excel模板文件——从数据库读取下拉框所需数据——将读取出的数据先写入另一张sheet(数据源sheet)——为展示数据的sheet设置数据验证规则,增加数据验证——将更新后的workbook保存到新的path




该方法返回path到controller,之后经过文件流处理即可实现模板的下载

   	/**
   	 * update poi select 
   	 * @param realPath
   	 * @author cloudHeart
   	 * @throws FileNotFoundException 
   	 */
	public String setPOISelect(String realPath) throws FileNotFoundException {
		InputStream is = null;
		XSSFWorkbook wb = null;
		
		//读取文件 
	     try {
			is = new FileInputStream(new File(realPath));
			wb = new XSSFWorkbook(is);
			XSSFSheet sheet = wb.getSheetAt(0);
			int rows = sheet.getLastRowNum() + 1; //行数
			System.out.println("rows = " + rows);
			
			//设置部门下拉框
			ArrayList<String> orgNameList = new ArrayList<>(30);
			List<Org> orgList = dao.findAll();
			for (Org one : orgList) {
				String name = one.getOrgName();
				orgNameList.add(name);
			}
			String[] orgArray = orgNameList.toArray(new String[orgNameList.size()]); 
			wb = selectUpda're(wb, sheet, orgArray, 2, 9, 1, 1, 2, 'B');
			
			//由于POI打开读取文件后再保存时bug问题, 只能重新定义一个新的Excel写入数据  
			String subPath = realPath.substring(0, realPath.lastIndexOf("\\"));
			String path = subPath.concat("\\模板");
			createExcel(wb, path);
			return path;
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return realPath; 
	    
		
	}


因为可能更新多个不同类型下拉框数据,所以设置了selectNum和selectAlpha

	/**
     * @param wb XSSFWorkbook对象
     * @param realSheet 需要操作的sheet对象
     * @param datas 下拉的列表数据
     * @param startRow 开始行
     * @param endRow 结束行
     * @param startCol 开始列
     * @param endCol 结束列
     * @param selectMum 数据源sheet的下拉数据源对应列
     * @param selectAlpha 数据源sheet的下拉数据对应字母
     * @return
     * @throws Exception
     */
    public XSSFWorkbook dropDownList2003(XSSFWorkbook wb, XSSFSheet realSheet, String[] datas, int startRow, int endRow,
                                                int startCol, int endCol, int selectNum ,char seletAlpha)
                                                                                                                       throws Exception {
    	String hiddenSheetName = "字典项";
       // XSSFWorkbook workbook = (XSSFWorkbook) wb;
        // 数据源sheet 原模板已有专门的数据源sheet,没有的话用 wb.createSheet("名称")创建一个即可
        XSSFSheet hidden = (XSSFSheet) wb.getSheetAt(1);
        // 数据源sheet页不显示
        wb.setSheetHidden(1, true);
        // 将下拉列表的数据放在数据源sheet上
        XSSFRow row = null;
        XSSFCell cell = null;
        for (int i = 0, length = datas.length; i < length; i++) {
            //row = hidden.createRow(i);
            row = hidden.getRow(i);
            if(row == null || ("").equals(row)){
            	row = hidden.createRow(i);
            }
           cell = row.getCell(selectNum-1);
           if(cell == null || ("").equals(cell)){
        	   cell = row.createCell(selectNum -1);
           }
           cell.setCellValue(datas[i]);
        }   
        	//创建规则
        XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(realSheet);
        XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper
        		.createFormulaListConstraint(hiddenSheetName + "!$"+seletAlpha+"$1:$"+seletAlpha+"" + datas.length);
        //DataValidationConstraint  constraint = DVConstraint.createFormulaListConstraint(hiddenSheetName + "!$"+seletAlpha+"$1:$"+seletAlpha+"" + datas.length);
        CellRangeAddressList addressList = null; // 设定在哪个单元格生效  
        DataValidation validation = null; // 创建规则对象  
        row = null;
        cell = null;
        // 循环指定单元格下拉数据
        for (int i = startRow; i <= endRow; i++) {
            row = (XSSFRow) realSheet.getRow(i);
            cell = row.getCell(startCol); 
            addressList = new CellRangeAddressList(i, i, startCol, endCol);
            validation = dvHelper.createValidation(dvConstraint, addressList);
            //validation = new HSSFDataValidation(addressList, constraint);
            //HSSF和XSSF的创建数据验证有区别 realSheet.addValidationData(validation);
            realSheet.addValidationData(validation);
        }

        return wb;
    }


根据路径创建Excel

/** 
     * 根据路径创建Excel 
     * @param workbook 
     * @param path 
     */  
    public void createExcel(Workbook workbook, String path) {  
        FileOutputStream fileOut = null;  
        try {  
            fileOut = new FileOutputStream(path);  
            workbook.write(fileOut);  
        } catch (Exception e) {  
            logger.error("Error create excel: ", e.getMessage());  
        } finally {  
            try {  
                if(fileOut != null) {  
                    fileOut.close();  
                }  
                  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    } 














使用POI给导出的Excel设置下拉框可以通过以下步骤实现: 1. 创建下拉列表数据源。可以使用org.apache.poi.ss.usermodel.DataValidationHelper类中的createExplicitListConstraint方法创建下拉列表数据源。 例如: DataValidationHelper dvHelper = sheet.getDataValidationHelper(); CellRangeAddressList addressList = new CellRangeAddressList(1, 10, 0, 0); String[] strings = {"选项1", "选项2", "选项3"}; DataValidationConstraint dvConstraint = dvHelper.createExplicitListConstraint(strings); DataValidation validation = dvHelper.createValidation(dvConstraint, addressList); sheet.addValidationData(validation); 上面的代码创建了一个下拉列表数据源,该数据源包含三个选项选项1、选项2和选项3。该数据源将应用于第1行到第10行的第1列单元格。 2. 设置单元格格式为下拉列表格式。可以使用org.apache.poi.ss.usermodel.Cell类中的setCellValue方法将单元格的值设置为下拉列表数据源中的一个选项。 例如: Cell firstCell = sheet.getRow(1).createCell(0); firstCell.setCellValue("选项1"); 3. 保存Excel文件。最后,使用org.apache.poi.ss.usermodel.Workbook类中的write方法将Excel文件保存到磁盘。 例如: FileOutputStream fileOut = new FileOutputStream("workbook.xls"); workbook.write(fileOut); fileOut.close(); 上面的代码将Excel文件保存到名为“workbook.xls”的文件中。 注意:上面的代码仅供示例参考,具体实现应根据具体需求进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值