前言

数据批量导入可减省很多工作量,近期需实现文件批量导入的功能,但新建的数据中存在下拉选项的数据,且和其他模块有数据之间的关联,经查阅资料顺利解决,作如下记录以便后续工作;

解决方案

  1. 将下拉的数据写入Excel中(关联数据的主键id一定携带),
  2. 将生成的Excel下载到本地,在次编辑此文件,将需要的数据信息补全
  3. 将最终的数据文件上传解析,实现批量导入

下拉数据写入Excel中

public Workbook personTemplateDownload(String corpId) throws ServiceException {HSSFWorkbook wb = new HSSFWorkbook();Sheet sheet = wb.createSheet("人员信息导入模板");// 第一行Row row = sheet.createRow(0);CellStyle style = CatalogExcelUtil.getHeadStyle(wb);CatalogExcelUtil.initCell(row.createCell(0), style, "部门*");CatalogExcelUtil.initCell(row.createCell(1), style, "档案编号*");CatalogExcelUtil.initCell(row.createCell(2), style, "人员名称*");CatalogExcelUtil.initCell(row.createCell(3), style, "职位*");CatalogExcelUtil.initCell(row.createCell(4), style, "性别*");CatalogExcelUtil.initCell(row.createCell(5), style, "学历*");CatalogExcelUtil.initCell(row.createCell(6), style, "入职日期*");CatalogExcelUtil.initCell(row.createCell(7), style, "出生年月*");CatalogExcelUtil.initCell(row.createCell(8), style, "身份证号*");CatalogExcelUtil.initCell(row.createCell(9), style, "手机号码*");CatalogExcelUtil.initCell(row.createCell(10), style, "离职日期");CatalogExcelUtil.initCell(row.createCell(11), style, "工作状态");CorpBaseInfoDao corpBaseInfoDao = (CorpBaseInfoDao) ObjectFactory.getObject("corpBaseInfoDao");// 查询企业部门名称List<Department> departmentInfo = corpBaseInfoDao.queryDepartmentInfo(corpId);if (departmentInfo.size() > 0) {List<String> deptNameList = new ArrayList<>();for (Department department : departmentInfo) {StringBuffer deptNameStr = new StringBuffer();deptNameStr.append(department.getName()).append(" - ").append(department.getId());deptNameList.add(deptNameStr.toString());}String[] departArray = deptNameList.toArray(new String[deptNameList.size()]);wb = ExcelUtil.dropDownList2003(wb, sheet, departArray, 1, 100, 0, 0, "hidden_dept", 1);}// 性别String[] sexArray = new String[]{"0-男", "1-女"};wb = ExcelUtil.dropDownList2003(wb, sheet, sexArray, 1, 100, 4, 4, "hidden_sex", 2);// 学历String[] educationArray = new String[]{"1-大专", "2-本科", "3-硕士", "4-博士", "5-MBA", "6-EMBA", "7-中专", "8-中技", "9-初中", "10-其它"};wb = ExcelUtil.dropDownList2003(wb, sheet, educationArray, 1, 100, 5, 5, "hidden_education", 3);// 工作状态String[] jobStatus = new String[]{"1-在职", "2-离职"};wb = ExcelUtil.dropDownList2003(wb, sheet, jobStatus, 1, 100, 11, 11, "hidden_job", 4);return wb;}

Excel下拉数据写入工具类

package com.util;import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddressList;/*** @description: excel工具类* @author: Mr.Jkx* @create: 2020-09-26 19:46*/
public class ExcelUtil {/*** @param wb               HSSFWorkbook对象* @param realSheet        需要操作的sheet对象* @param datas            下拉的列表数据* @param startRow         开始行* @param endRow           结束行* @param startCol         开始列* @param endCol           结束列* @param hiddenSheetName  隐藏的sheet名* @param hiddenSheetIndex 隐藏的sheet索引* @return* @throws Exception*/public static HSSFWorkbook dropDownList2003(Workbook wb, Sheet realSheet, String[] datas, int startRow, int endRow,int startCol, int endCol, String hiddenSheetName, int hiddenSheetIndex) {HSSFWorkbook workbook = (HSSFWorkbook) wb;// 创建一个数据源sheetHSSFSheet hidden = workbook.createSheet(hiddenSheetName);// 数据源sheet页不显示workbook.setSheetHidden(hiddenSheetIndex, true);// 将下拉列表的数据放在数据源sheet上HSSFRow row = null;HSSFCell cell = null;for (int i = 0, length = datas.length; i < length; i++) {row = hidden.createRow(i);cell = row.createCell(0);cell.setCellValue(datas[i]);}// A1 到 Adatas.length 表示第一列的第一行到datas.length行,需要与前一步生成的隐藏的数据源sheet数据位置对应//namedCell.setRefersToFormula(hiddenSheetName + "!$A$1:$A" + datas.length);// 指定下拉数据时,给定目标数据范围 hiddenSheetName!$A$1:$A5   隐藏sheet的A1到A5格的数据DVConstraint constraint = DVConstraint.createFormulaListConstraint(hiddenSheetName + "!$A$1:$A" + datas.length);CellRangeAddressList addressList = null;HSSFDataValidation validation = null;row = null;cell = null;// 单元格样式CellStyle style = workbook.createCellStyle();style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0"));style.setAlignment(CellStyle.ALIGN_CENTER);style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 循环指定单元格下拉数据for (int i = startRow; i <= endRow; i++) {row = (HSSFRow) realSheet.createRow(i);cell = row.createCell(startCol);cell.setCellStyle(style);addressList = new CellRangeAddressList(i, i, startCol, endCol);validation = new HSSFDataValidation(addressList, constraint);realSheet.addValidationData(validation);}return workbook;}
}
package com.litte.util;import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;import java.io.InputStream;/*** @program: sanjingdao* @description:* @author: Mr.Jkx* @create: 2020-09-26 19:37*/
public class CatalogExcelUtil {/*** 创建Workbook** @param in* @return* @throws Exception*/public static Workbook createWorkBook(InputStream in) throws Exception {try {return new HSSFWorkbook(in);} finally {if (in != null) {in.close();}}}/*** 获取单单元格字符串值** @param cell* @return*/public static String getCellStringValue(Cell cell) {if (cell == null) {return "";}cell.setCellType(HSSFCell.CELL_TYPE_STRING);RichTextString str = cell.getRichStringCellValue();return str.getString();}/*** 初始化Excel单元格, 设置单元格值和样式** @param cell* @param style* @param value*/public static void initCell(Cell cell, CellStyle style, String value) {cell.setCellStyle(style);cell.setCellValue(value);}/*** 初始化Excel单元格, 设置单元格值、样式和备注** @param cell* @param style* @param value* @param comment*/public static void initCell(Cell cell, CellStyle style, String value, Comment comment) {cell.setCellStyle(style);cell.setCellValue(value);cell.setCellComment(comment);}/*** 获取Excel单元格备注** @param drawing* @param anchor* @param content* @return*/public static Comment getCellComment(Drawing drawing, HSSFClientAnchor anchor, String content) {Comment comment = drawing.createCellComment(anchor);comment.setString(new HSSFRichTextString(content));return comment;}/*** 获取Excel标题单元格样式** @param wb* @return*/public static CellStyle getHeadStyle(Workbook wb) {CellStyle style = wb.createCellStyle();style.setFillForegroundColor(HSSFColor.LIGHT_ORANGE.index);style.setFillPattern(CellStyle.SOLID_FOREGROUND);style.setBorderTop(HSSFCellStyle.BORDER_THIN);style.setBorderRight(HSSFCellStyle.BORDER_THIN);style.setBorderBottom(HSSFCellStyle.BORDER_THIN);style.setBorderLeft(HSSFCellStyle.BORDER_THIN);Font font = wb.createFont();font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 粗体style.setFont(font);style.setLocked(true);return style;}/*** 获取Excel数据单元格样式** @param wb* @return*/public static CellStyle getBodyStyle(Workbook wb) {CellStyle style = wb.createCellStyle();style.setBorderTop(HSSFCellStyle.BORDER_THIN);style.setBorderRight(HSSFCellStyle.BORDER_THIN);style.setBorderBottom(HSSFCellStyle.BORDER_THIN);style.setBorderLeft(HSSFCellStyle.BORDER_THIN);return style;}/*** 获取Excel错误单元格样式** @param wb* @return*/public static CellStyle getErrorStyle(Workbook wb) {CellStyle style = wb.createCellStyle();Font font = wb.createFont();font.setColor(HSSFColor.RED.index);style.setFont(font);return style;}
}

下载写好的Excel文件

public void personTemplateDownload(@QueryParam(value = "corpId") String corpId) {try {Workbook workbook = corpBaseInfoService.personTemplateDownload(corpId);FileUpDownUtils.exportExcel(workbook, "人员信息模板_" + System.currentTimeMillis() + ".xls", request, response);} catch (Exception e) {System.out.println(e.getMessage());}}

文件下载工具类

package com.util;import org.apache.poi.ss.usermodel.Workbook;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;/*** @Description: 文件下载工具类* @Author: Mr.Jkx* @date: 2020/3/31 17:22*/
public class FileUpDownUtils {/*** @Description: 导出Excel* @Author: Mr.Jkx* @date: 2020/3/31 17:22*/public static void exportExcel(Workbook bookModel, String fileName, HttpServletRequest request, HttpServletResponse response) {try {OutputStream out = response.getOutputStream();response.reset();response.setCharacterEncoding("UTF-8");response.setContentType("APPLICATION/OCTET-STREAM");response.setHeader("Content-Disposition", "attachment; filename=\"" + judgeBrowser(request, fileName) + "\"");response.setHeader("Connection", "close");bookModel.write(out);out.flush();out.close();} catch (Exception e) {System.out.println(e);}}/*** @Description: 根据浏览器类型,返回相应的值* @Author: Mr.Jkx* @date: 2020/3/31 17:22*/public static String judgeBrowser(HttpServletRequest request, String value) throws Exception {String userAgent = request.getHeader("User-Agent");if (null == userAgent) {return URLEncoder.encode(value, "UTF-8");// IE浏览器}if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {value = new String(value.getBytes("UTF-8"), "ISO8859-1");}// firefox浏览器}else if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) {value = URLEncoder.encode(value, "UTF-8");}// IE浏览器else if (request.getHeader("User-Agent").toLowerCase().indexOf("applewebkit") != -1) {value = new String(value.getBytes("UTF-8"), "ISO8859-1"); // chrome// 只能使用MimeUtility编码或ISO编码的中文输出} else {return URLEncoder.encode(value, "UTF-8");// IE浏览器}return value;}
}

下载出来的文件截图

注意

下载出来的文件中存在下拉数据选项,将编辑好的文件直接上传,Excel会解析失败(小编的工具类解析失败),最终解决办法是将编辑好的文件另存一份,打开文件会发现,另存的文件中下拉选项的地方都成为了文本,再次导入顺利解析,数据批量导入成功

下拉框数据写入Excel并下载相关推荐

  1. Excel导出表格时,下拉框数据长度超过255出现的问题及解决办法

    文章目录 1.直接添加下拉框,数据量过多会有问题 2.使用隐藏sheet的方式实现 3.多选下拉框 4.参考: 1.直接添加下拉框,数据量过多会有问题 /*** 创建下拉列表选项(单元格下拉框数据小于 ...

  2. java实现设置Excel下拉框在使用Excel的时候用到了下拉框,实现的效果如下↓

    在使用Excel的时候用到了下拉框,实现的效果如下↓ 在生成excel文件时,需要根据给出的下拉框选项列表动态生成下拉框.实现代码如下: private void createSelect(XSSFW ...

  3. 浏览器前进后退对下拉框数据的丢失(省市联动实现和例子)

    浏览器前进后退对下拉框数据的丢失的问题,典型的为省市下拉框联动时城市数据的丢失.省市联动一般的实现为城市在省份的选择后js加载. 那么每次城市的改变只需要重新加载新的城市数据并更新下拉框即可: 下拉函 ...

  4. Ext JS - Combobox 加载下拉框数据 级联下拉框

    Combobox 加载下拉框数据 点击下拉框,数据从后台加载,是很常见的需求.如下图: View 中下拉框 dockedItems : [ {dock : 'top',xtype : 'toolbar ...

  5. thymeleaf(th:each th:selected) 从后台动态获取下拉框数据回显及选中

    thymeleaf(th:each th:selected) 从后台动态获取下拉框数据回显及选中 <select οnchange="getChilds(this.value)&quo ...

  6. 绑定多个下拉框数据(关系式)

    绑定多个下拉框数据(关系式) ----------------------------------------- 开发工具与关键技术:Visual Studio 2015 C# 作者:林敏静 撰写时间 ...

  7. Java17 POI5.2.0 Excel 下拉框 数据校验

    Java 设置Excel 下拉框.自定义数据校验 一.工具类 1.ExcelUtil 2.Pom 二.生成文件 1.下拉框 2.数据校验 三.Excel 命令 1.获取活动单元格:=INDIRECT( ...

  8. bootstrap获取下拉框数据_bootstrap动态调用select下拉框的实现方法

    bootstrap动态调用select下拉框的实例代码 html代码: 填报部门: JS代码: /*获取下拉菜单*/ function showSel(){ $.ajax({ "type&q ...

  9. 单个下拉框数据保持问题

    1.在工作中遇到了数据保持问题,查询时当查询返回结果页面时,页面上的下拉框选中的值仍然为当时的查询条件,例如下拉框中存放河北省所有的城市放在city数组中, 第一中方法为下面所示: <selec ...

最新文章

  1. Nmap参数--探索网络
  2. XCTF-高手进阶区:upload1
  3. php读取云平台数据库,读取Read · ThinkPHP5+数据库和模型 · 看云
  4. 这家武汉工厂如果停工,全球都不答应
  5. CnCiswumWN
  6. nginx搭建高性能流媒体技术
  7. 微信公众平台基础开发--禾今微信投票系统
  8. UOS 安装nvidia官方显卡驱动
  9. python导入wx_Python“导入wx”
  10. php实现阳历阴历互转的方法
  11. python如何打印26个字母_python3打印26个英文字母
  12. 计算机领域,客观事物的属性,客观事物
  13. Android系统 屏幕最低背光亮度值/最高背光亮度值 调试
  14. 今天我被微软狠狠地雷翻了
  15. Clion源码编辑器的学习与实践
  16. 3GPP TS 23501-g51 中英文对照 | 4.1 General concepts
  17. 算法比赛经历--蓝桥杯,天梯赛,力扣,牛客,cf,acwing,acm
  18. 联想扬天计算机排行,联想电脑CPU天梯图排行榜,2018联想电脑CPU天梯图新版
  19. 我的Android进阶之旅------经典的大客推荐(排名不分先后)!!
  20. python怎么把程序挂在远端服务器_Python实现在远端服务器挂代码—发送定时天气预报至邮箱+每日一句(小白教程)...

热门文章

  1. Windows 记事本的 ANSI、Unicode、UTF-8 这三种编码模式有什么区别?(好)
  2. 计算机学院毕业生祝福,暖心的毕业祝愿赠言
  3. 基础知识(七)Blend2015 画笔工具设置渐变色,其功能和PS的类似。
  4. 华中师大计算机专业陈鹏,华师男子不满工作分配流浪16年 与弟弟见面后拒回家...
  5. 【GEE笔记】有效像元(面积、数量)统计
  6. Element快速入门
  7. 东北大学应用数理统计第二章知识点总结——参数估计
  8. 学习笔记之VOIP网守的功能
  9. VMware Workstation 虚拟机安装
  10. Unity第一人称控制器使用