背景

业务功能的需要,要求要去生产一个带有数据校验的导入模板。

了解工具

XSSFDataValidationConstraint(XSSF数据有效性验证约束):创建约束的时候,可以指定数据类型,以及数据列。

例如:

String strFormula = hiddenSheetName + "!$"+colStr+"$1:$"+colStr+"$65535";XSSFDataValidationConstraint constraint = new XSSFDataValidationConstraint(DataValidationConstraint.ValidationType.LIST,strFormula);

CellRangeAddressList(单元格地址范围):指定某列某行。

例如:(自定义的列表,所有的行65535)

 CellRangeAddressList addressList = new CellRangeAddressList(1, 65535, column, column);
DataValidationHelper(数据有效对象),指定工作表中的数据有效对象
DataValidationHelper help = new XSSFDataValidationHelper((XSSFSheet) sheet);
DataValidation(数据验证),添加有效性数据

操作

@RequestMapping(params = "action=exportProductTemplate")public void exportProductTemplate(HttpServletRequest request, HttpServletResponse response) {response.reset();response.setContentType("application/vnd.ms-excel"); // 改成输出excel文件try {Long userId = SecurityUtil.getCurrentUserId();if(userId == null){throw new Exception("用户未登录!");}ServletContext servletContext=RequestContextUtils.findWebApplicationContext(request).getServletContext();String path=servletContext.getRealPath("/template");path=path+"/"+"product.xlsx";File f=new File(path);FileInputStream in=new FileInputStream(f);Workbook wb = WorkbookFactory.create(in);Sheet sheet = wb.getSheet("Sheet1");generateRangeList((XSSFSheet)sheet,BoothInfo.class.getSimpleName(),1,wb,"B");generateRangeList((XSSFSheet)sheet,BolongtoTypeEnum.supplier.name(),3, wb, "D");//供应商generateRangeList((XSSFSheet)sheet,BolongtoTypeEnum.client.name(),4, wb, "E");//委托方generateRangeList((XSSFSheet)sheet,BusinessProduct.class.getSimpleName(),5, wb, "F");//产品名称generateRangeList((XSSFSheet)sheet,"Country",14, wb, "O");//原产国SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");String fileName = URLEncoder.encode("批量导入商品入库模板", "UTF-8")+sdf.format(new Date());// 将文件输出response.setHeader("Content-disposition","attachment; filename="+fileName+".xlsx");OutputStream ouputStream = response.getOutputStream();wb.write(ouputStream);ouputStream.flush();ouputStream.close();} catch (Exception e) {System.out.println("导出Excel失败!");e.printStackTrace();}}/*** 构造有效性数据约束*/private void generateRangeList(XSSFSheet sheet, String type, int column, Workbook wb, String colStr) {String[] options = getOptions(type);if (options.length == 0){return;}if(String.join(",",options).length()>255){//获取所有sheet页个数int sheetTotal = wb.getNumberOfSheets();String hiddenSheetName = "hiddenSheet" + sheetTotal;XSSFSheet hiddenSheet = (XSSFSheet)wb.createSheet(hiddenSheetName);Row row;//写入下拉数据到新的sheet页中for (int i = 0; i < options.length; i++) {row = hiddenSheet.createRow(i);Cell cell = row.createCell(column);cell.setCellValue(options[i]);}//获取新sheet页内容String strFormula = hiddenSheetName + "!$"+colStr+"$1:$"+colStr+"$65535";XSSFDataValidationConstraint constraint = new XSSFDataValidationConstraint(DataValidationConstraint.ValidationType.LIST,strFormula);// 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列CellRangeAddressList regions = new CellRangeAddressList(1,65535, column, column);// 数据有效性对象DataValidationHelper help = new XSSFDataValidationHelper((XSSFSheet) sheet);DataValidation validation = help.createValidation(constraint, regions);sheet.addValidationData(validation);//将新建的sheet页隐藏掉wb.setSheetHidden(sheetTotal, true);}else{XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(options);CellRangeAddressList addressList = new CellRangeAddressList(1, 65535, column, column);XSSFDataValidation validation = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, addressList);sheet.addValidationData(validation);}}/*** 构造有效性数据*/private String[] getOptions(String type) {List<String> options=new ArrayList<String>();int size=0;Long userId = SecurityUtil.getCurrentUserId();if(BoothInfo.class.getSimpleName().equals(type)){options = exportProductTemplateApplicationService.findBoothInfoByUserId(userId);}else if(BolongtoTypeEnum.supplier.name().equals(type)){options = exportProductTemplateApplicationService.findBusinessmanContactByUserIdAndType(userId,BolongtoTypeEnum.supplier.name());}else if(BolongtoTypeEnum.client.name().equals(type)){options = exportProductTemplateApplicationService.findBusinessmanContactByUserIdAndType(userId,BolongtoTypeEnum.client.name());}else if(BusinessProduct.class.getSimpleName().equals(type)){options = exportProductTemplateApplicationService.findBusinessProductByUserId(userId);}else if("Country".equals(type)){options = exportProductTemplateApplicationService.findProductCountry(type);}size = CollectionUtils.isEmpty(options)?0:options.size();return options.toArray(new String[size]);}

解决DataValidation超长问题(超出255)

DataValidation超出255,会到导致该列有效性数据验证无效,这题提供的一个想法就是,新创建一个sheel,把对应的数据放到新的工作表中,在使用XSSFDataValidationConstraint数据有效性约束,就可以解决,上面代码有对应操作。

POI excel添加数据有效性验证以及解决DataValidation超长的问题相关推荐

  1. poi导出excel添加数据验证

    Java使用poi做excel导出时,可能要添加数据验证. /*** 设置excel数据有效性验证* @param workbook* @param map<Integer,String[]&g ...

  2. java代码导出excel支持数据有效性验证,即excel单元格可以下拉选择

    数据有效性验证: package zzceshi; import java.io.ByteArrayInputStream; import java.io.File; import java.io.F ...

  3. POI excel下载 中文名 浏览器兼容解决

    private void downfile(HSSFWorkbook wb,String ua,String fileName,HttpServletResponse response)throws ...

  4. POI DataValidation 删除数据有效性验证

    项目中用到Apache POI来处理Execl,模板文件中有数据有效性的验证,处理时需要添加行,导致原有需要数据有效验证的单元格向下移动.经过测试发现POI对于数据有效性验证只能添加,不能删除. 在网 ...

  5. POI导出Excel设置背景色踩坑,解决背景色全黑(无效)的问题及指定列添加背景色,自定义颜色

    POI导出Excel设置背景色踩坑,解决背景色全黑的问题及指定列添加背景色,自定义颜色 一.自定义颜色 二.背景色全黑(无效)的问题解决![在这里插入图片描述](https://img-blog.cs ...

  6. POI删除Excel中数据有效性

    读到这篇文章,请停下您Ctrl+c,Ctrl+v的脚步.因为这并不是真正的删除数据有效性,而是通过一种方式实现多次为某列设置数据有效性.我是真的百度没查到,Google没查到,官网也没找到关于使用PO ...

  7. 个人永久性免费-Excel催化剂功能第60波-数据有效性验证增强版,补足Excel天生不足...

    Excel在数据处理.数据分析上已经是公认的最好用的软件之一,其易用性和强大性也吸引无数的初中高级用户每天都在使用Excel. 但这些优点的同时,也带出了一些问题,正因为其不同于一般的专业软件,需要专 ...

  8. poi 导出excel实战与word新增行与excel添加背景色与设置单元格边框

    提示:本文尽可能简洁通俗的讲解[poi 导出excel实战] ,如需导入可见文尾 一.导入依赖: <!--Apache poi--><!--xls(03)--><depe ...

  9. java excel 单元格类型,POI Excel 单元格内容类型判断并取值

    个人用到的 String birthdayVal = null; switch (cell_2.getCellTypeEnum()) { case STRING: birthdayVal = cell ...

  10. poi excel版本问题

    poi excel 有效性验证 提示消息乱码解决方案www.diybl.com 时间 : 2010-07-19 作者:网络 编辑:huyang629 点击: [ 评论 ]--今天遇到一个问题,客户要求 ...

最新文章

  1. 清瘦的记录者: 一个比dbutils更小巧、好用的的持久化工具
  2. 《编写高质量代码:改善c程序代码的125个建议》——建议4-1:整数转换为新类型时必须做范围检查...
  3. 《Head First Python》第三章--文件与异常
  4. c/c++ 阻塞和非阻塞,fcntl应用
  5. python观察日志(part21)--ord,chr,unichr方法的联系与区别
  6. Spring陷阱:事务测试被认为是有害的
  7. linux 提示符 异常,linux终端提示符异常 bash-4.1$
  8. php多商户限时抢购,GitHub - 617746883/thinkphp5.0_shop: 基于thinkphp5,多商户商城。积分商城、团购、秒杀、拍卖、夺宝等多插件(持续开发中)...
  9. C++ 各类树的算法
  10. Python基于ImageAI实现完整的流程:数据集构建、模型训练、识别预测
  11. bc547可以用8050代换吗_代换S8550 S8050三极管要特别注意放大倍数
  12. 2019智慧树python答案大全_2020智慧树知到Python程序设计参考答案
  13. 【微信小程序】微信小程序获取用户信息为“微信用户”解决方案--学习微信小程序之路06
  14. 微创电生理通过注册:年营收1.9亿 微创批量生产上市企业
  15. PPT文字很多的排版,PPT图片很多的排版,PPT图文排版
  16. 如何利用python将NWPU VHR-10目标检测遥感数据集的格式转换成VOC目标检测数据集的格式
  17. 消防给水和消火栓系统(二)
  18. 点赋科技:小白打算开网店做淘宝,怎么做才靠谱?
  19. 【吐槽】对Christopher Zach这个家伙写的文章无言以对
  20. cisco router

热门文章

  1. ubuntu18.4解决问题: Installation failed. See log at /var/log/cuda-installer.log for details.
  2. web前端学习13-19(HTML常用标签)
  3. 初级数据分析-python(第一节数据存储)
  4. Oracle EXPLAIN PLAN用法
  5. Keras的Adam优化器decay理解及自适应学习率
  6. 边写边学Python(14)球落地高度
  7. shrinkwrap-resolver解析pom依赖
  8. [渝粤教育] 西南科技大学 外国文学 在线考试复习资料
  9. ubuntu 服务器鼠标键盘无反应
  10. postgres关键字、常量和数据类型