POI——动态修改Excel模板下拉框
需求:
在导入页面放置了的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 blocke.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模板下拉框相关推荐
- PB 动态修改数据窗口下拉框的值(DropDownListBox)
GIF:效果图 源码: string ls_value,ls_colnamels_colname = 'a' //字段名称//如果字段不是DropDownListBox下拉框,需要改变Edit中的St ...
- Vue+SpringBoot 实现Excel表下拉框与模板文件下载
最近做的项目需要实现该功能,经过查找相关博客,故在此做整理. 一.前端 1.在A.service.js文件中 import axios from 'axios' // 业务服务上下文 const ba ...
- java导出Excel增加下拉框选项,解决小数据量和大数据量下拉框选项的问题
文章目录 java导出Excel增加下拉框选项 一.小数据量情况 二.大数据量情况 java导出Excel增加下拉框选项(java结合easyExcel) 添加传参模型ConsumablesAddDT ...
- html select 样式t调整_css修改html select下拉框样式(含右边箭头)
css修改html select下拉框样式(含右边箭头)2017-10-12 16:51 我们经常会看到一些页用用的select下拉框非常漂亮,其实很多是用插件实现的. 如果不使用插件,靠纯css能不 ...
- Thinkphp5中使用PhpSpreadsheet实现excel特定下拉框联动模板的生成
前言: 最近有遇到过这样的项目需求,需要导出 excel 模板的时候在模板中内置好需要联动的下拉框选择功能,这样在进行excel填写的时候可以进行选择内置的内容. 这里就是进行联动选择的,省.市.区三 ...
- Java实现后端生成excel表格模板--下拉框实现
实现方法: //创建下拉框private static void creatDropDownList(Sheet taskInfoSheet, DataValidationHelper helper, ...
- Excel 设置下拉框-显示中文而实际数字
最近在用excel做数据的导入,显示的值和数据库存放值有所差别,需要进行翻译,这里运用excel自带的功能来实现,显示中文,实际数字. Excel 版本:2019 第一步.设置下来框显示 在excel ...
- ExcelJS 导入导出excel带下拉框筛选数据
import ExcelJS from "exceljs"; 配上文档地址 下载方法 //数据格式 deviceJson:{ 't(数据类型)':[{value:0 ...
- Excel怎么下拉框多选
打开Exlce, 确定,然后 右击查看代码,把这段代码复制到新建的文件里面 此时Excel会给出提示,选择否,,系统会提示保存,在保存的时候选择启用宏的工作簿然后保存,此时Excel下拉框多选就搞定了 ...
最新文章
- iframe 父页面与子页面之间的方法的相互调用
- 二 Array 数组常用操作方法
- centos安装ES(elasticsearch)
- AngularJS分层开发
- 什么叫事务?Java如何处理事务呢?
- 用DELETE删除的文件怎么免费找回不用购买不用注册码
- python post参数传递不成功_Python中的API构建指南:在Flask中进行API开发
- 企业全面运营管理沙盘模拟心得_任景锋-企业全面运营管理沙盘模拟
- 【Mendeley】自定义文献引用格式(cite style)并保存
- matlab将数据集分成训练集和测试集,Matlab实现 把数据集X分割成训练集和测试集...
- 阿里聚石塔限制IP 过部署服务器详细流程
- Windows Server2012搭建Git服务器
- HTML与Java组合使用_【自学java笔记#第五十四天#】javaweb day02 html和css的组合使用...
- 朱啸虎的“合并盈利论”,实为ofo抢道摩拜带节奏
- 钉钉如何调整组织架构_[钉钉组织架构设置]如何设置组织架构 组织架构设置的五个步骤...
- 微信小程序的socket.io即时通讯开发(基于E聊SDK)
- 高效的 Linux 限流神器Trickle
- 提高浏览器渲染页面速度
- 通过百度API获取城市经纬度(1)
- 相振幅耦合 matlab6,课程设计基于MATLAB的2×2光纤定向耦合器设计.doc