业务需求需要导出Excel,然而xls部分公式无法使用,且导出效率和行数有限制,因此更换导出文件为xlsx,下拉框个数根据参数传入。代码写得有点乱,如下代码为导出excel xlsx格式的代码

/**
*导出Excel  xlsx
* @param excelHeader 导出excel的头部 格式UserNo#userNo(输出excel的列的首行名字#所在列对应的实体bean的属性名字),多列以','隔开  参考UserController里面的导出用户功能;
* @param dataList    需要导出数据的集合。
* @param indexs 下拉框索引
* @param slist 下拉框数组,支持多个下拉框
*/
public static <T> HSSFWorkbook downloadExcel(HttpServletResponse response, String fileName, String excelHeader, Integer[] indexs, List<String[]> slist) throws Exception {String[] excelHeaderArray = null;if (excelHeader != null) {excelHeaderArray = excelHeader.split(",");}response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "UTF-8"));XSSFWorkbook wb = new XSSFWorkbook();XSSFCellStyle styleb = wb.createCellStyle();styleb.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式XSSFSheet data = wb.createSheet("Sheet1");XSSFSheet select = wb.createSheet("select");wb.setSheetHidden(1, true);Row rowFirst = data.createRow(0);//第一个sheet的第一行为标题for (int i = 0; i < excelHeaderArray.length; i++) {Cell cell = rowFirst.createCell(i); //获取第一行的每个单元格XSSFCellStyle style = wb.createCellStyle();style.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式//标头字体样式Font fontStyle = wb.createFont();fontStyle.setFontName(Const.EXPORT_EXCEL_HEADER_FONT);fontStyle.setFontHeightInPoints(Const.EXPORT_EXCEL_HEADER_FONT_SIZE);fontStyle.setBoldweight(Font.BOLDWEIGHT_BOLD);style.setFont(fontStyle);String excelHeaderstr = excelHeaderArray[i];if (StringUtils.isNotEmpty(excelHeaderstr) && excelHeaderstr.contains("*")) {fontStyle.setColor(Font.COLOR_RED);} else {//fontStyle.setColor(Font.COLOR_NORMAL);}data.setColumnWidth(i, excelHeaderArray[i].length() * 2 * 256); //设置每列的列宽cell.setCellStyle(style); //加样式cell.setCellValue(excelHeaderArray[i]); //往单元格里写数据cell.setCellType(Cell.CELL_TYPE_STRING);}//设置单元格的字体XSSFCellStyle style2 = wb.createCellStyle();XSSFDataFormat format = wb.createDataFormat();style2.setDataFormat(format.getFormat("@"));style2.setBorderBottom(XSSFCellStyle.BORDER_THIN);style2.setBorderTop(XSSFCellStyle.BORDER_THIN);style2.setBorderLeft(XSSFCellStyle.BORDER_THIN);style2.setBorderRight(XSSFCellStyle.BORDER_THIN);style2.setAlignment(XSSFCellStyle.ALIGN_CENTER);style2.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);Font dataFont = wb.createFont();dataFont.setFontHeightInPoints(Const.EXPORT_EXCEL_BODY_FONT_SIZE);dataFont.setFontName(Const.EXPORT_EXCEL_BODY_FONT);style2.setFont(dataFont);//默认创建100行数据for (int i = 1; i < 100; i++) {Row row = data.createRow(i);for (int j = 0; j < excelHeaderArray.length; j++) {Cell cell = row.createCell(j); //获取第一行的每个单元格cell.setCellType(Cell.CELL_TYPE_STRING);cell.setCellStyle(style2);}}//列 默认只支持26列,需要增加在数组中增加String[] arr = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};int index = 0;Row row = null;//循环输出slist  下拉框数组集合。for (int i = 0; i < slist.size(); i++) {String[] selectData = slist.get(i);if (selectData == null) {selectData = new String[0];}下拉框的索引位置int rowNum = indexs[i];//下拉框公式String strFormula = "'select'!$" + arr[index] + "$2:$" + arr[index] + "$" + (selectData.length + 1); //select第A1到A5000作为下拉列表来源数据select.setColumnWidth(i, 4000); //设置每列的列宽//设置下拉框数据校验data.addValidationData(ExcelUtil.setXSSFDataValidation(select, strFormula, 1, 50000, rowNum, rowNum));
//下拉列表元素很多的情况,循环下入到隐藏的sheet中for (int j = 0; j < selectData.length; j++) {if (index == 0) {row = select.createRow(j + 1); //创建数据行select.setColumnWidth(j + 1, 4000); //设置每列的列宽row.createCell(0).setCellValue(selectData[j]); //设置对应单元格的值} else {int rowCount = select.getLastRowNum();//判断最后一行数据的索引是否大于当前的行数,大于则需要创建一行,小于只需要创建单元格,赋值就好了。if (j < rowCount) {select.getRow(j + 1).createCell(index).setCellValue(selectData[j]); //设置对应单元格的值} else {select.setColumnWidth(j + 1, 4000); //设置每列的列宽//创建行、创建列select.createRow(j + 1).createCell(index).setCellValue(selectData[j]); //设置对应单元格的值}}}index++;}try {OutputStream outputStream = response.getOutputStream();// 打开流wb.write(outputStream);// HSSFWorkbook写入流//wb.close();// HSSFWorkbook关闭outputStream.flush();// 刷新流outputStream.close();// 关闭流} catch (Exception e) {e.printStackTrace();}return null;
}

ExcelUtil:setXSSFDataValidation

public static DataValidation setXSSFDataValidation(XSSFSheet sheet,String formula,int firstRow, int endRow, int firstCol, int endCol){CellRangeAddressList addressList = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);DataValidationHelper dvHelper = sheet.getDataValidationHelper();XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint)dvHelper.createFormulaListConstraint(formula);XSSFDataValidation validation =(XSSFDataValidation)dvHelper.createValidation(dvConstraint, addressList);//sheet.addValidationData(validation);return validation;
}

POI 导出excel ,xlsx 公式多个下拉框 XSSF相关推荐

  1. 使用jxls,poi导出excel的公式中出现@符号,或者公式不生效

    问题描述 使用jxls,poi导出excel的公式中出现@符号,或者公式不生效(和office版本有关系) 模板excel公式 =MIN(IF(A11:T12>0,A11:T12))/A21 生 ...

  2. Excel导出模板加数据时,下拉框丢失解决方案

    简介: 在工作中.我们大多数会碰到导出.导入excel功能.此篇文档便是对导出时,模板中自带的下拉框丢失的问题记录. 摘要: 首先简要描述如何实现excel导出模板加数据功能. 1.读取sheet模板 ...

  3. JAVA动态生成excel模板;列自定义下拉框赋值

    哈喽,2023大家开工大吉啊!财源滚滚! 业务需求:需要生成excel模板,且对部分列设置下拉框,进行动态赋值,效果如下: 拿上图举例:针对省这一列,不是填写,而是选择数据,也就是说我们生成excel ...

  4. Excel表格下载模板(带下拉框选项)

    下载excel模板需要带下拉框选项,现在纯JAVA代码来实现 1.模板标题实体类 import cn.afterturn.easypoi.excel.annotation.Excel; import ...

  5. 在Excel单元格中使用下拉框

    文章出处: http://www.cnblogs.com/huangcong/archive/2010/05/21/1740539.html 有时候我们只希望在Excel中的某个单元格中只允许输入某几 ...

  6. Excel 2019:二级级联下拉框设置

    Execl 2019:二级级联下拉框 场景需求 实现效果展示 二级级联设置步骤 1.填写基础信息 2.设置一级数据验证 3.设置依赖于一级选择的二级下拉内容 场景需求 当我们需要规范输入的数据时,会用 ...

  7. poi导出excel写入公式_【java poi 写入Excel后读取公式值问题】poi导入excel

    java poi 写入Excel后读取公式值问题 不用改公式,只需要用cell.getNumericCellValue()获取,读出来就是正确的值了,如果你读出来的还有问题,说明你其他的地方写的还有问 ...

  8. POI导出Excel,公式不能自动计算

    问题还原: 通过POI读取Excel内容后,需要根据读取内容中的key去数据库中查取对应的实时数据,计算之后,重新塞回到Excel对应的列中.这时计算公式中包含此列的单元格值按理应该是要改变,可是却没 ...

  9. poi怎么设置某个单元格为下拉框_java excel 多选下拉列表设置

    方案二 方案二的思路是在excel中添加一个隐藏的sheet存放数据源(下拉的数据),在真正需要下拉的sheet单元格写入属性. 1.需要使用到的util类 package com.excel.sel ...

最新文章

  1. 排插老化再酿祸端,安全新国标排插首选品胜
  2. Ubuntu Server上的LVM配置
  3. java jar 打包命令行_Java程序命令行打包Jar
  4. Xcode 8.0 doc 注释的问题
  5. 团队二阶段冲刺个人工作总结2
  6. Xampp PHPStorm XDebug配置
  7. Python密码生成器
  8. 数字交通灯设计(Multisim仿真+PCB实物)
  9. Vue项目url中的BASE_URL解析
  10. EdgeX(1)研究 开源边缘计算框架 EdgeX Foundry
  11. 做前端的你,如何克服技术焦虑?
  12. window内置对象和js内置对象与方法
  13. 如何正确选择电磁流量计
  14. 计算机二级黑板板书书写,清华老师的板书惊艳朋友圈 8个技巧让黑板亮起来
  15. 【数据库】实验二~六
  16. python实现微信医院挂号查询,并钉钉实时通知
  17. 软件架构设计的七大原则
  18. 2022年Q3白酒销量排行榜
  19. 企业网站安全维护方案
  20. win10怎样进网站服务器,win10怎样进入云服务器

热门文章

  1. weblogic控制台启动报错
  2. JavaScript--jQuery框架
  3. ACPI Specification 概述(基于ACPI_Spec_6_4_Jan22)
  4. html中怎么写输入框,HTML文本框参考样式及常见操作技巧大全
  5. 大专生拿到阿里 offer,却担心背调不过,网友:985 在你面前黯淡无光
  6. 用linux下的C语言编程万年历,shell编程万年历月历和对应c语言程序.docx
  7. Spring boot admin监控添加发送邮件
  8. 透过sunflower看看Google最近在Android上有什么花活(一)--- Hilt
  9. 蚁剑jsp一句话木马
  10. pppoe工作原理详解