哈喽,2023大家开工大吉啊!财源滚滚!

业务需求:需要生成excel模板,且对部分列设置下拉框,进行动态赋值,效果如下:


拿上图举例:针对省这一列,不是填写,而是选择数据,也就是说我们生成excel文件的时候需要把数据填充到下拉框的列中。

大体逻辑就是:java生成excel文件,在生成excel文件的时候将部分列是设置成下拉框,并赋值。

而在 Java 中,操作 excel 目前有两个主流框架,分别是:

apache 的 poi
Apache POI是基于DOM方式进行解析,将文件直接加载内存,速度较快,适合文件数据量不大的应用场景。它分别对不同格式的文件提供不同的文件解析:

    HSSF:  操作Microsoft Excel格式。XSSF:  操作Microsoft Excel  OOXML格式。

HSSF主要用于解析.xls格式的Excel文件,而XSSF主要用于解析.xlsx格式的Excel文件

Java Excel
Java Excel是一开放源码项目,通过它Java开发人员可以操作Excel文件(读取,创建,更新等)。

由于其小巧 易用的特点, 逐渐已经取代了 POI-excel的地位。

HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls;

XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx。

对于不同版本的EXCEL文档要使用不同的工具类,如果使用错了,会提示如下错误信息:

org.apache.poi.openxml4j.exceptions.InvalidOperationExceptionorg.apache.poi.poifs.filesystem.OfficeXmlFileException

java生成excel文件逻辑:
1:创建excel
2:在excel中创建表格
3:在表格中输入列名
4:输入数据

代码如下

  //导出标头信息List<String> headers = Arrays.asList("客户姓名", "客户联系方式", "服务对象", "联系方式", "性别", "出生日期(yyyy-MM-dd)", "身份证号", "关系", "健康状况", "省", "市", "区", "服务地址详情", "一级来源渠道", "二级来源渠道", "首洽日期(yyyy-MM-dd)");// 创建workbook;可以理解为excelHSSFWorkbook hssfWorkbook = new HSSFWorkbook();//创建sheet:可以理解为在excel中创建表格HSSFSheet sheet = hssfWorkbook.createSheet();// 创建表头,供用户输入:可以理解为为表格输入列名initHeaders(hssfWorkbook, sheet, headers);//对性别做下拉处理;由标头可知性别位于第五列(下标从0开始,也就是4代表性别)String sexType = "sex";Map<String, String> sexMap = new HashMap<>();//key放性别的字段,value逗号拼接性别的所有值sexMap.put(sexType, "男,女,未知");// 1000表示该列填充1000行HSSFDataValidation sexValidation = ExcelUtil.createBox(sexType, sexMap, 1, 1000, 4, 4);if (sexValidation != null) {sheet.addValidationData(sexValidation);}String relationType = "relation";Map<String, String> relationTypeMap = new HashMap<>();relationTypeMap.put(relationType, relationName);HSSFDataValidation relationValidation = ExcelUtil.createBox(relationType, relationTypeMap, 1, 1000, 7, 7);if (relationValidation != null) {sheet.addValidationData(relationValidation);}//省市区三级联动处理SysCity cityParam = new SysCity();List<SysCity> araeList = sysCityMapper.selectSysCityList(cityParam);//所有省级信息:去除ID为36的请选择信息List<SysCity> proList = araeList.stream().filter(model -> "1".equals(model.getType().toString()) && !"36".equals(model.getId().toString())).collect(Collectors.toList());HSSFSheet mapSheet = hssfWorkbook.createSheet("MAP");hssfWorkbook.setSheetHidden(hssfWorkbook.getSheetIndex(mapSheet), false);//所有一级List<String> mapOneList = new ArrayList<String>();//市区关系Map<String, List<String>> map = new HashMap<String, List<String>>();proList.stream().forEach(model -> {mapOneList.add(model.getCityname());//获取对应市级名称信息List<String> cityNameList = araeList.stream().filter(as -> (as.getPid().toString()).equals(model.getId().toString())).map(ma -> ma.getCityname()).collect(Collectors.toList());map.put(model.getCityname(), cityNameList);//获取市级信息List<SysCity> cityList = araeList.stream().filter(as -> (as.getPid().toString()).equals(model.getId().toString())).collect(Collectors.toList());cityList.stream().forEach(city -> {//获取对应市级名称信息List<String> conturyNameList = araeList.stream().filter(as -> (as.getPid().toString()).equals(city.getId().toString())).map(ma -> ma.getCityname()).collect(Collectors.toList());map.put(city.getCityname(), conturyNameList);});});// 3.写入数据 将数据写入sheet中并做好关联关系writeData(hssfWorkbook, mapSheet, mapOneList, map);// 4.设置数据有效性setDataValid(hssfWorkbook, sheet, mapOneList, map, "1", "so");/**** 渠道来源二级联动处理**/List<BaseSourceChannel> channelList = new BaseSourceChannel();//一级线索List<String> fatherMap = new ArrayList<String>();//二级线索Map<String, List<String>> sonMap = new HashMap<String, List<String>>();//一级线索List<BaseSourceChannel> parentSourceList = channelList.stream().filter(x -> "1".equals(x.getType())).collect(Collectors.toList());parentSourceList.stream().forEach(source -> {fatherMap.add(source.getSourceName());//一级对应的二级线索List<String> sonSourceList = channelList.stream().filter(x -> x.getPid().equals(source.getId())).map(y -> y.getSourceName()).collect(Collectors.toList());sonMap.put(source.getSourceName(), sonSourceList);});HSSFSheet sourceSheet = hssfWorkbook.createSheet("sourceMap");writeData(hssfWorkbook, sourceSheet, fatherMap, sonMap);setDataValid(hssfWorkbook, sheet, fatherMap, sonMap, "2", "source");String filename = UUID.randomUUID().toString() + "_测试模板.xlsx";String downloadPath = Global.getDownloadPath() + filename;File desc = new File(downloadPath);if (!desc.getParentFile().exists()) {desc.getParentFile().mkdirs();}FileOutputStream out = null;try {out = new FileOutputStream(downloadPath);hssfWorkbook.write(out);} catch (Exception e) {e.printStackTrace();} finally {if (out != null) {try {out.close();} catch (Exception e) {e.printStackTrace();}}}return AjaxResult.success(filename);

好了,代码已经提供,有什么不明白的欢迎互相讨论。

createBox 方法如下

   /***  excel导出,有码值的数据使用下拉框展示。* @param col             列名* @param boxMap          码值集合* @param firstRow        插入下拉框开始行号* @param lastRow         插入下拉框结束行号* @param firstCol        插入下拉框开始列号* @param lastCol         插入下拉框结束行号* @return*/public static HSSFDataValidation createBox(String col, Map<String, String> boxMap, int firstRow, int lastRow, int firstCol, int lastCol) {HSSFDataValidation dataValidation = null;//查询码值表String cols = "";if(null != boxMap.get(col)) {cols = boxMap.get(col);}//设置下拉框if(cols.length() > 0 && null != cols) {String str[] = cols.split(",");//指定行,列为下拉框CellRangeAddressList cas = new CellRangeAddressList(firstRow , lastRow , firstCol , lastCol);//创建下拉数据列DVConstraint dvConstraint = DVConstraint.createExplicitListConstraint(str);//将下拉数据放入下拉框dataValidation = new HSSFDataValidation(cas, dvConstraint);}return dataValidation;}

生成页面表头方法:initHeaders

/*** 生成主页面表头** @param wb* @param mainSheet* @param headers*/
private void initHeaders(HSSFWorkbook wb, HSSFSheet mainSheet, List<String> headers) {//表头样式HSSFCellStyle style = wb.createCellStyle();style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式//字体样式HSSFFont fontStyle = wb.createFont();fontStyle.setFontName("微软雅黑");fontStyle.setFontHeightInPoints((short) 12);style.setFont(fontStyle);//生成主内容HSSFRow rowFirst = mainSheet.createRow(0);//第一个sheet的第一行为标题mainSheet.createFreezePane(0, 1, 0, 1); //冻结第一行//写标题for (int i = 0; i < headers.size(); i++) {HSSFCell cell = rowFirst.createCell(i); //获取第一行的每个单元格mainSheet.setColumnWidth(i, 4000); //设置每列的列宽cell.setCellStyle(style); //加样式cell.setCellValue(headers.get(i)); //往单元格里写数据}
}

JAVA动态生成excel模板;列自定义下拉框赋值相关推荐

  1. Java动态生成excel模板文件(包含列下拉)

    1.添加依赖 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency><gr ...

  2. vue可视化拖拽组件模板,vue自定义下拉框组件

    怎样利用Vue动态生成form表单 . $formCreate参数rules 表单生成规则[inputRule,selectRule,...]options 初始化配置参数(详细见底部createOp ...

  3. 【EasyUI篇】Combo自定义下拉框组件

    微信公众号:程序yuan 关注可了解更多的教程.问题或建议,请公众号留言; 查看--> 全套EasyUI示例目录 20.Combo自定义下拉框组件 这组件不可以通过class方式进行定义 JSP ...

  4. uniapp 自定义下拉框

    uniapp 自定义下拉框 根据 https://gitee.com/kcren/uniapp-dropdown-filter/tree/master 自己加了一层封装 可以进行切换选择下拉内容 模板 ...

  5. autojs自定义下拉框

    牙叔教程 简单易懂 使用场景 自定义下拉框spinner 效果展示 git动图较大, 稍等片刻, 马上就好 autojs版本 8.8.12-0 萌新三连问 我要改背景 我要改字体颜色 我改了下拉框数据 ...

  6. 文本域 自定义下拉框 支持模糊检索 关键字高亮 上下选择

    转载自:文本域 自定义下拉框 支持模糊检索 关键字高亮 上下选择 一.需求 需要创建一个常见问题库,填写存在问题时可以下拉选择,可以模糊搜索,也可以手写.如果选择了问题库中的内容,自动填充内容到存在问 ...

  7. excel中如何设置下拉框,并且不同值显示不同颜色

    源地址: http://blog.163.com/s_zhchluo/blog/static/1501470820139172232473/ (一)excel中如何设置下拉框 (excel 2010) ...

  8. Combo( 自定义下拉框) 组件

    本节课重点了解 EasyUI 中 Combo(自定义下拉框)组件的使用方法,这个组件依赖于 ValidateBox(验证框)组件 一. 加载方式 自定义下拉框不能通过标签的方式进行创建. <in ...

  9. css自定义下拉框样式

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

最新文章

  1. PyCharm 2019.3发布,增加了哪些新功能呢?
  2. kohana task 编写计划任务
  3. 【Hihocoder - offer编程练习赛93 套题题解】交错01串(贪心,暴力)方格矩阵高度(模拟)数对(STLmultiset)修整土地(网络流)
  4. List 集合去重的 3 种方法
  5. String被设计成不可变和不能被继承的原因
  6. Composite UI Application Block(CAB)
  7. POJ-1087 A Plug for UNIX 网络流
  8. 红包 mysql表设计_微信红包的设计实现
  9. 数字舵机和模拟舵机的区别
  10. unity Animator 同时播放两个动画,并动态更换Animator中的AnimationClip
  11. 移动端实现同时移动摇杆和摄像机旋转(双/多指触控)
  12. win10卸载软件_win10系统卸载软件超详细教程
  13. 如何用手机来拍证件照
  14. 【学习笔记】《基于φ-OTDR的分布式扰动传感系统定位算法研究-北交-通信与信息系统-吴》重点笔记
  15. 一款 API 测试神器,非常强
  16. cesium实现动态圆效果之——螺旋圆
  17. 如何删除计算机桌面多余的大e,教你删除属性里桌面多余背景图片
  18. Windows打印机驱动删除不了,怎么办?
  19. 支付宝钱包系统架构内部剖析
  20. 如何推进中小学STEM教育课程开发和实施

热门文章

  1. 如何给苹果公司发邮件?
  2. spring事务注解@Transactional参数详解
  3. 精辟到噎死人的句子,太经典了
  4. 数字信号处理——观察信号的频谱
  5. matplotlib无法正常显示中文与dataframe显示省略号
  6. python之数据分析可视化(b站排行播放量,简单详细)
  7. Maya打开.obj模型并为其贴图
  8. 更改移动硬盘储存格式(背景:iPadOS无法识别)
  9. 水星Mercury路由器端口映射设置图文方法
  10. 如何制作带参数的批处理文件