需求:导入excel表格,如果excel有错误,将错误的地方标红,在把数据以excel的形式写出,供用户下载
解决方案:1.以实体类的方式接收excel并解析(创建两个集合一个接收正常的数据一个接收错误的数据)
2.错误集合无论正确错误数据都要存储,并记录是否有误(错误数据拼接特殊字符作为标记,然后记录写入集合)
3.如果发现记录有错误记录,就要使用错误数据集合生成excel(对错误的数据对特殊字符截取)
4.将错误的excel生成到工程的相对的路径下,也可以上传服务器更好(下次下载前要记得清理记录),返回前端一个地址,前端点击链接进行下载
5.下面是片段代码

  1. public static SXSSFWorkbook createExportInterviewExcel(List<Operator> data, String sheetName) {
  2. SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(100);
  3. //标题栏设置
  4. CellStyle style = sxssfWorkbook.createCellStyle();
  5. style.setWrapText(true);//自动换行
  6. style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//垂直居中
  7. style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居左
  8. Font font = sxssfWorkbook.createFont();
  9. font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //字体增粗
  10. style.setFont(font);
  11. DataFormat formats = sxssfWorkbook.createDataFormat();
  12. style.setDataFormat(formats.getFormat("@"));//设置文本格式
  13.  
  14. //正常格式设置
  15. CellStyle cellStyle = sxssfWorkbook.createCellStyle();
  16. //cellStyle.setWrapText(true);//自动换行
  17. cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//垂直居中
  18. cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居左
  19. DataFormat format = sxssfWorkbook.createDataFormat();
  20. cellStyle.setDataFormat(format.getFormat("@"));//设置文本格式
  21.  
  22. Sheet taskInfoSheet = sxssfWorkbook.createSheet(sheetName);
  23. DataValidationHelper helper = taskInfoSheet.getDataValidationHelper();//设置下拉框xlsx格式
  24. //设置列宽
  25. taskInfoSheet.setColumnWidth(5, 256 * 21);
  26. taskInfoSheet.setColumnWidth(6, 256 * 15);
  27. taskInfoSheet.setColumnWidth(7, 256 * 15);
  28. taskInfoSheet.setColumnWidth(8, 256 * 20);
  29. taskInfoSheet.setColumnWidth(18, 256 * 20);
  30. // 第一行标题
  31. Row row_tital = taskInfoSheet.createRow(0);
  32.  
  33. String[] keyWord = {"姓名","性别","民族", "年龄", "学历", "身份证号", "手机号",
  34. "在我司任职过", "岗位名", "广告名", "部门","工作地", "推荐人","推荐人电话","推荐人部门","推荐人工号", "面试安排时间","是否录用", "淘汰类型", "淘汰原因"};
  35. for (int i = 0; i < keyWord.length; i++) {
  36. Cell cell_tital_index = row_tital.createCell(i);
  37. cell_tital_index.setCellValue(keyWord[i]);
  38. cell_tital_index.setCellStyle(style);
  39. }
  40.  
  41. //异常情况处理
  42. if (CollectionUtils.isEmpty(data) ||(CollectionUtils.isNotEmpty(data) && StringUtils.isBlank(data.get(0).getName()))) {
  43. return sxssfWorkbook;
  44. }
  45.  
  46. // 数据行
  47. for (int i = 0; i < data.size(); i++) { // 导出详情
  48. Row row_data = taskInfoSheet.createRow(i + 1);
  49. Cell cell_data_name = row_data.createCell(0);
  50. cell_data_name.setCellValue(data.get(i).getName());
  51. cell_data_name.setCellStyle(cellStyle);
  52.  
  53. Cell cell_data_nation = row_data.createCell(1);
  54. cell_data_nation.setCellValue(data.get(i).getNational());
  55. cell_data_nation.setCellStyle(cellStyle);
  56.  
  57. Cell cell_data_age = row_data.createCell(2);
  58.  
  59. Integer age= null;
  60. if(data.get(i).getAge()!= null){
  61. age = data.get(i).getAge();
  62. }else{
  63. age=1;
  64. }
  65. cell_data_age.setCellValue(age);
  66. cell_data_age.setCellStyle(cellStyle);
  67.  
  68. //添加工作地
  69. Cell cell_data_location =row_data.createCell(3);
  70. cell_data_location.setCellValue(data.get(i).getLocation());
  71. cell_data_location.setCellStyle(cellStyle);
  72.  
  73. Cell cell_data_referrer = row_data.createCell(4);
  74. cell_data_referrer.setCellValue(data.get(i).getReferrer());
  75. cell_data_referrer.setCellStyle(cellStyle);
  76.  
  77. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  78. String interviewTime = "";
  79. if (null != data.get(i).getInterviewTime()) {
  80. interviewTime = sdf.format(data.get(i).getInterviewTime());
  81. }
  82. Cell cell_data_interviewTime = row_data.createCell(5);
  83. cell_data_interviewTime.setCellValue(interviewTime);
  84. cell_data_interviewTime.setCellStyle(cellStyle);
  85.  
  86. String[] yesOrNo = {"是", "否"};
  87. creatDropDownList(taskInfoSheet,helper,yesOrNo,1,200,6,6);
  88.  
  89. String[] list = {"不符合返聘要求", "不符合公司规则", "综合素质", "其他"};
  90. creatDropDownList(taskInfoSheet, helper, list, 1, 200, 7, 7);
  91. }
  92.  
  93. return sxssfWorkbook;
  94. }
  95.  
  96. //创建下拉框
  97. private static void creatDropDownList(Sheet taskInfoSheet, DataValidationHelper helper, String[] list,
  98. Integer firstRow, Integer lastRow, Integer firstCol, Integer lastCol) {
  99. CellRangeAddressList addressList = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
  100. //设置下拉框数据
  101. DataValidationConstraint constraint = helper.createExplicitListConstraint(list);
  102. DataValidation dataValidation = helper.createValidation(constraint, addressList);
  103. //处理Excel兼容性问题
  104. if (dataValidation instanceof XSSFDataValidation) {
  105. dataValidation.setSuppressDropDownArrow(true);
  106. dataValidation.setShowErrorBox(true);
  107. } else {
  108. dataValidation.setSuppressDropDownArrow(false);
  109. }
  110. taskInfoSheet.addValidationData(dataValidation);
  111. }
  112.  
  113. //需求:导入excel表格,如果excel有错误,将错误的地方标红,在把数据以excel的形式写出,供用户下载
  114. //解决方案:1.以实体类的方式接收excel并解析(创建两个集合一个接收正常的数据一个接收错误的数据)
  115. //2.错误集合无论正确错误数据都要存储,并记录是否有误(错误数据拼接特殊字符作为标记,然后记录写入集合)
  116. //3.如果发现记录有错误记录,就要使用错误数据集合生成excel(对错误的数据对特殊字符截取)
  117. //4.将错误的excel生成到工程的相对的路径下(下次下载前要记得清理记录),返回前端一个地址,前端点击链接进行下载
  118.  
  119. //这个方法就是清除之前的文件夹
  120. private String getExportResult(SXSSFWorkbook sxssfWorkbook) {
  121.  
  122. //删除之前文件夹下的文件
  123. String targetUrl = System.getProperty("export.error.result");
  124. File targetFile = new File(targetUrl);
  125. ContentUtil.deletAllFiles(targetFile);
  126.  
  127. String fileName = null;
  128. try {
  129. fileName = System.getProperty("export.error.result") + UUID.randomUUID().toString() + ".xlsx";
  130. File file = new File(fileName);
  131. if (!file.exists()) {
  132. file.getParentFile().mkdirs();
  133. }
  134. FileOutputStream outputStream = new FileOutputStream(fileName);
  135. sxssfWorkbook.write(outputStream);
  136. outputStream.close();
  137. } catch (IOException e) {
  138. logger.error("OperatorInfoImportAuditResultServiceImpl下载导入错误excel表格异常", e);
  139. e.printStackTrace();
  140. }
  141. return fileName;
  142. }
  143. public static void deletAllFiles(File file) {
  144. if (file == null) {
  145. return;
  146. }
  147. if (file.exists()) {
  148. if (file.isFile()) {
  149. file.delete();
  150. }else if (file.isDirectory()) {
  151. File[] listFiles = file.listFiles();
  152. if (listFiles == null) {
  153. return;
  154. }
  155. for (File file2 : listFiles) {
  156. deletAllFiles(file2);
  157. }
  158. /* //递归跳出来的时候删除空文件夹
  159. file.delete();*/
  160. }
  161. }
  162. }
  163.  
  164. @RequestMapping(value = "/exportErrorImportResult", method = RequestMethod.GET)
  165. public void exportErrorImportResult(@RequestParam(value = "paramUrl") String paramUrl, HttpServletResponse response, HttpServletRequest request) {
  166.  
  167. //生成错误的文档
  168. try {
  169. XSSFWorkbook workbook = null;
  170. File file = new File(paramUrl);
  171. if (file.exists()) {
  172. FileInputStream in = new FileInputStream(file);
  173. workbook = new XSSFWorkbook(in);
  174. } else {
  175. logger.info("初级员工内推导出错误的excel文件,文件不存在");
  176. }
  177. OutputStream ouputStream = response.getOutputStream();
  178. String fileName = "导出错误";
  179. fileName = URLEncoder.encode(fileName, "UTF-8");
  180. response.reset();
  181. response.setContentType("application/vnd.ms-excel");
  182. response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
  183. workbook.write(ouputStream);
  184. ouputStream.flush();
  185. ouputStream.close();
  186.  
  187. } catch (Exception e) {
  188. logger.error("导出错误的excel文件,OperatorPostInfoController 异常:", e);
  189. }
  190. }

java操作poi生成excel.xlsx(设置下拉框)下载本地和前端下载的更多相关文章

  1. POI设置excel添加列下拉框

    POI在生成excel模板时需要为列添加下拉框,我写了两个方法. @ 方法一:适用任何情况,不受下拉框值数量限制.但是需要通过引用其它列值. 思路大概如下: 1.创建一个隐藏的sheet页,用于存放下 ...

  2. poi生成excel整理(设置边框/字体/颜色/加粗/居中/)

    转: poi生成excel整理(设置边框/字体/颜色/加粗/居中/) 2016年12月02日 11:05:23 吃奶的牛 阅读数:34324   HSSFWorkbook wb = new HSSFW ...

  3. Jquery动态设置下拉框selected --(2018 08/12-08/26周总结)

    1.Jquery动态根据内容设置下拉框selected 需求就是根据下拉框的值动态的设置为selected,本以为很简单,网上一大推的方法,挨着尝试了之后却发现没有一个是有用的.网上的做法如下: &l ...

  4. js 设置下拉框的默认值

    设置下拉框的默认值,直接在option中增加selected就可以了.但是现在要使用JS来设置它的默认值,代码如下: <select name="aaa" id=" ...

  5. jquery 根据后台传过来的值动态设置下拉框、单选框选中

    更多内容推荐微信公众号,欢迎关注: jquery  根据后台传过来的值动态设置下拉框.单选框选中 $(function(){ var sex=$("#sex").val(); va ...

  6. 【WPF学习笔记】之如何设置下拉框读取SqlServer数据库的值:动画系列之(一)

    先前条件:设置好数据库,需要三个文件CommandInfo.cs.DbHelperSQL.cs.myHelper.cs,需要修改命名空间,参照之前随笔http://www.cnblogs.com/Ow ...

  7. jquery设置下拉框selected不起作用

    在js中设置下拉框被选中: 最初写法: //移出selected $("#selected option").removeAttr("selected"); / ...

  8. Java使用poi生成Excel,生成两种表格下拉框

    想要使用POI操作以xsl结尾的Excel,首先要下载poi相关的jar包,用到的jar有: poi-3.9.jar poi-ooxml-3.9.jar poi-ooxml-schemas-3.9.j ...

  9. java使用poi生成excel

    使用poi生成excel通常包含一下几个步骤 创建一个工作簿 创建一个sheet 创建一个Row对象 创建一个cell对象(1个row+1个cell构成一个单元格) 设置单元格内容 设置单元格样式. ...

随机推荐

  1. ES6 模块的加载实现 import和export

    ES6的Class只是面向对象编程的语法糖,升级了ES5的构造函数的原型链继承的写法,并没有解决模块化问题.Module功能就是为了解决这个问题而提出的. 历史上,JavaScript一直没有模块(m ...

  2. Linux配置nginux

    安装依赖 yum install gcc yum install pcre-devel yum install zlib zlib-devel yum install openssl openssl- ...

  3. 架构师成长之路5.3-Saltstack配置管理(State状态模块)

    点击架构师成长之路 架构师成长之路5.3-Saltstack配置管理(State状态模块) 配置管理工具: Pupper:1. 采用ruby编程语言:2. 安装环境相对较复杂:3.不支持远程执行,需要 ...

  4. Django学习系列15:把POST请求中的数据存入数据库

    要修改针对首页中的POST请求的测试.希望视图把新添加的待办事项存入数据库,而不是直接传给响应. 为了测试这个操作,要在现有的测试方法test_can_save_a_post_request中添加3行 ...

  5. 【洛谷P2147】洞穴勘测

    题目大意:维护 N 个点的无向图,支持动态加边和删边,回答两点的连通性. 题解:线段树分治 + 可撤销并查集 询问可以离线,这是线段树分治的基础. 建立在操作时间轴上的线段树称为线段树分治算法. 本题 ...

  6. 使用GitHub(三):使用VSCode+GitHub进行版本控制

    使用GitHub(三):使用VSCode+GitHub进行版本控制 本文简单介绍使用VSCode+GitHub进行项目或者代码的版本控制.本文主要目的是对学习内容进行总结以及方便日后查阅. 详细教程和 ...

  7. 【转载】awk入门

    作者: 阮一峰 http://www.ruanyifeng.com/blog/2018/11/awk.html awk是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序. 它依次处 ...

  8. 初学者的springmvc笔记02

    springmvc笔记 springmvc拦截器,spring类型转换,spring实现文件上传/下载 1.SpringMVC标准配置 导入jar包:core contaner 在web.xml文件中 ...

  9. 科普TPF知识

    https://tieba.baidu.com/p/4926092734?see_lz=1&pn=1 707680700 https://tieba.baidu.com/p/492609273 ...

  10. count(列) count(*)

    总结:但是真的结论是这样的么.其实不然.其实在数据库中count(*)和count(列)根本就是不等价的,count(*)是针对于全表的,而count(列)是针对于某一列的,如果此列值为空的话,cou ...