工具类
public class ExcelUtils { private static final Logger logger = LoggerFactory.getLogger(FieldService.class); /** * 模板下载 */ public static Response downLoad(String modelName, HttpServletResponse response) throws IOException { ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); org.springframework.core.io.Resource[] resources = null; String fileName = ""; resources = resourcePatternResolver.getResources(CLASS_PATH + TEMPLATE + modelName); fileName = modelName; org.springframework.core.io.Resource resource = resources[0]; URI uri = resource.getURI(); logger.info(uri.toString()); InputStream inputStream = null; OutputStream out = null; try { //根据文件在服务器的路径读取该文件转化为流 inputStream = resource.getInputStream(); //创建一个Buffer字符串 byte[] buffer = new byte[1024]; //设置文件ContentType类型,这样设置,会自动判断下载文件类型 response.setContentType(MULTIPART_FORM_DATE); //设置文件头:最后一个参数是设置下载文件名(设置编码格式防止下载的文件名乱码) response.setHeader(CONTENT_DISPOSITION, ATTACHMENT_FILENAME+new String( fileName.getBytes(UTF_8), CHARSET_NAME )); out = response.getOutputStream(); int b = 0; while (b != -1){ b = inputStream.read(buffer); //写到输出流(out)中 out.write(buffer,0,b); } return new Response(RespCode.DOWNLOAD_MODEL_FINISH); }catch (Exception e){ e.printStackTrace(); return new Response(RespCode.DOWNLOAD_MODEL_FAIL); }finally { try { inputStream.close(); out.close(); out.flush(); }catch (Exception e){ e.printStackTrace(); } } } /** * 文件导出 * fieldList 需要导出字段集合 * lists 导出数据集合 比如List<FieldDefinitionExcelVo> * object 导出接口对象 比如 FieldDefinitionExcelVo * excelName 导出报表名称 * response 响应对象 * @return */ public static void export(List<String> fieldList,List lists,Object object,String excelName,HttpServletResponse response) { IExcelWriter xlsWriter = ExcelFactory.getXlsxWriter(); try { Field[] declared = object.getClass().getDeclaredFields(); Map<String, Boolean> requireMap = getRequireMap(declared, fieldList); Map<String, Integer> orderMap = getOrderMap(declared, fieldList); for (Object vo : lists) { commonFieldExcel(vo,requireMap,orderMap); } xlsWriter.target(response,excelName); xlsWriter.write(lists); }catch (Exception e){ logger.error("导出失败"); throw new BizException(RespCode.EXPORT_FAILED); }finally { xlsWriter.flush(); } } /** * 获取 writeRequire 映射 * @param declared * @param fieldList * @return */ private static Map<String,Boolean> getRequireMap(Field[] declared, List<String> fieldList){ Map<String,Boolean> require = new HashMap(); for (Field field : declared) { require.put(field.getName(),fieldList.contains(field.getName())); } return require; } private static <T>T commonFieldExcel(T vo, Map<String, Boolean> requireMap, Map<String, Integer> orderMap) throws NoSuchFieldException, IllegalAccessException { Field[] declaredFields = vo.getClass().getDeclaredFields(); for (Field voo : declaredFields) { if(requireMap.containsKey(voo.getName())){ Boolean bool = requireMap.get(voo.getName()); Integer order = orderMap.get(voo.getName()); Field f = vo.getClass().getDeclaredField(voo.getName()); ExcelField annotation = f.getAnnotation(ExcelField.class); if(StringUtils.isEmpty(annotation)){ continue; } InvocationHandler handler = Proxy.getInvocationHandler(annotation); Field hField = handler.getClass().getDeclaredField(MEMBER_VALUES); hField.setAccessible(true); Map memberValues = (Map) hField.get(handler); memberValues.put(WRITE_REQUIRE, bool); memberValues.put(ORDER, order); } } return vo; } /** * 获取 order 映射 * @param declared * @param fieldList * @return */ private static Map<String,Integer> getOrderMap(Field[] declared, List<String> fieldList){ Map<String,Integer> orderMap = new HashMap(); for (int i = 0; i < fieldList.size(); i++) { orderMap.put(fieldList.get(i),i); } for (Field field : declared) { putMapValue(orderMap,field.getName()); } return orderMap; } /** * 设置order值 * @param order * @param value */ private static void putMapValue(Map<String, Integer> order, String value){ if(!order.containsKey(value)){ order.put(value,ZERO); } } } //判断模板是否匹配 private Boolean scanModelType(Sheet sheet,String moduleName) { try { InputStream inputStream; inputStream = new ClassPathResource(TEMPLATE + moduleName).getInputStream(); assert inputStream != null; Workbook sheets = WorkbookFactory.create(inputStream); Sheet model = sheets.getSheetAt(0); String modelType = getModelType(model); Row cells = sheet.getRow(1); for (int i = 1; i < cells.getLastCellNum(); i++) { String s = ExcelResolveUtils.getCellValue(cells.getCell(i)); if (!modelType.contains(s)) { return false; } } return true; } catch (Exception e) { e.printStackTrace(); } return false; } /** * 模板字段映射 */ private Map<String, Integer> getModelMap(Sheet sheet) { Map<String, Integer> map = new HashMap<String, Integer>(10); Row cells = sheet.getRow(1); for (int i = 0; i < cells.getLastCellNum(); i++) { String s = ExcelResolveUtils.getCellValue(cells.getCell(i)); map.put(s.trim(), i); } return map; }
通用导入
Workbook workbook=null; try { workbook = WorkbookFactory.create(file.getInputStream()); // 获取当前sheet index索引 int activeSheetIndex; activeSheetIndex = workbook.getActiveSheetIndex(); Sheet sheet = workbook.getSheetAt(activeSheetIndex); // 新的模板判断 Boolean bool = Workbook workbook=null; try { workbook = WorkbookFactory.create(file.getInputStream()); int activeSheetIndex; activeSheetIndex = workbook.getActiveSheetIndex(); Sheet sheet = workbook.getSheetAt(activeSheetIndex); // 新的模板判断 Boolean bool = scanModelType(sheet); if (!bool) { logger.error("批量创建失败"); return new Response(RespCode.DOWNLOAD_MODEL_Submit); } // 判断类型 ,选择分支 List<List<ResourceInfoResult>> fieldDefinitionList = getList(sheet, actionType); return new Response(fieldDefinitionList); } catch (Exception e) { logger.error("导入失败"); throw new BizException(RespCode.UPLOAD_IN_FALSE); } finally { if (workbook != null) { try { workbook.close(); } catch (Exception e) { logger.error("批量创建失败:{}", e.getMessage()); } }
工具类
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by Administrator on 2019/5/14. */ public class ExcelResolveUtils { /** * 获取合并单元格的值 * * @param sheet * @param row * @param column * @return */ public static String getMergedRegionValue(Sheet sheet, int row, int column) { int sheetMergeCount = sheet.getNumMergedRegions(); for (int i = 0; i < sheetMergeCount; i++) { CellRangeAddress ca = sheet.getMergedRegion(i); int firstColumn = ca.getFirstColumn(); int lastColumn = ca.getLastColumn(); int firstRow = ca.getFirstRow(); int lastRow = ca.getLastRow(); if (row >= firstRow && row <= lastRow) { if (column >= firstColumn && column <= lastColumn) { Row fRow = sheet.getRow(firstRow); Cell fCell = fRow.getCell(firstColumn); return getCellValue(fCell); } } } return null; } /** * 判断合并了行 * * @param sheet * @param row * @param column * @return */ public static boolean isMergedRow(Sheet sheet, int row, int column) { int sheetMergeCount = sheet.getNumMergedRegions(); for (int i = 0; i < sheetMergeCount; i++) { CellRangeAddress range = sheet.getMergedRegion(i); int firstColumn = range.getFirstColumn(); int lastColumn = range.getLastColumn(); int firstRow = range.getFirstRow(); int lastRow = range.getLastRow(); if (row == firstRow && row == lastRow) { if (column >= firstColumn && column <= lastColumn) { return true; } } } return false; } /** * 判断指定的单元格是否是合并单元格 * * @param sheet * @param row 行下标 * @param column 列下标 * @return */ public static boolean isMergedRegion(Sheet sheet, int row, int column) { int sheetMergeCount = sheet.getNumMergedRegions(); for (int i = 0; i < sheetMergeCount; i++) { CellRangeAddress range = sheet.getMergedRegion(i); int firstColumn = range.getFirstColumn(); int lastColumn = range.getLastColumn(); int firstRow = range.getFirstRow(); int lastRow = range.getLastRow(); if (row >= firstRow && row <= lastRow) { if (column >= firstColumn && column <= lastColumn) { return true; } } } return false; } /** * 获取合并区域 * * @param sheet * @return */ public static MergedRegion getMergedRegion(Sheet sheet, Cell firstCell) { MergedRegion mergedRegion = new MergedRegion(); int row = firstCell.getRowIndex(); int column = firstCell.getColumnIndex(); int sheetMergeCount = sheet.getNumMergedRegions(); for (int i = 0; i < sheetMergeCount; i++) { CellRangeAddress range = sheet.getMergedRegion(i); int firstColumn = range.getFirstColumn(); int lastColumn = range.getLastColumn(); int firstRow = range.getFirstRow(); int lastRow = range.getLastRow(); if (row >= firstRow && row <= lastRow) { if (column >= firstColumn && column <= lastColumn) { mergedRegion.setLength(lastColumn - firstColumn + 1); mergedRegion.setWidth(lastRow - firstRow + 1); return mergedRegion; } } else { mergedRegion.setLength(1); mergedRegion.setWidth(1); } } return mergedRegion; } /** * 判断sheet页中是否含有合并单元格 * * @param sheet * @return */ public static boolean hasMerged(Sheet sheet) { return sheet.getNumMergedRegions() > 0 ? true : false; } /** * 合并单元格 * * @param sheet * @param firstRow 开始行 * @param lastRow 结束行 * @param firstCol 开始列 * @param lastCol 结束列 */ public static void mergeRegion(Sheet sheet, int firstRow, int lastRow, int firstCol, int lastCol) { sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol)); } /** * 获取单元格的值 * * @param cell * @return */ public static String getCellValue(Cell cell) { if (cell == null) return BLANK_SPACE; if (cell.getCellType() == CellType.STRING) { return cell.getStringCellValue(); } else if (cell.getCellType() == CellType.BOOLEAN) { return String.valueOf(cell.getBooleanCellValue()); } else if (cell.getCellType() == CellType.FORMULA) { try { return String.valueOf(cell.getNumericCellValue()); } catch (IllegalStateException e) { return String.valueOf(cell.getRichStringCellValue()); } } else if (cell.getCellType() == CellType.NUMERIC) { return String.valueOf(cell.getNumericCellValue()); } return " "; } /** * 解决数值类型后面带.0问题 * * @param cell * @return */ public static String getCellValueNoDouble(Cell cell) { if (cell == null) return BLANK_SPACE; if (cell.getCellType() == CellType.STRING) { return cell.getStringCellValue(); } else if (cell.getCellType() == CellType.BOOLEAN) { return String.valueOf(cell.getBooleanCellValue()); } else if (cell.getCellType() == CellType.FORMULA) { return cell.getCellFormula(); } else if (cell.getCellType() == CellType.NUMERIC) { if ((long) cell.getNumericCellValue() == cell.getNumericCellValue()) { return String.valueOf((long) cell.getNumericCellValue()); } else { return String.valueOf(cell.getNumericCellValue()); } } return " "; } /** * 解决数值类型后面带.0问题 * * @param cell * @return */ public static String getCellValueNoDoubleAndFormula(Cell cell) { if (cell == null) return BLANK_SPACE; if (cell.getCellType() == CellType.STRING) { return cell.getStringCellValue(); } else if (cell.getCellType() == CellType.BOOLEAN) { return String.valueOf(cell.getBooleanCellValue()); } else if (cell.getCellType() == CellType.FORMULA) { return String.valueOf(cell.getNumericCellValue()); } else if (cell.getCellType() == CellType.NUMERIC) { if ((long) cell.getNumericCellValue() == cell.getNumericCellValue()) { return String.valueOf((long) cell.getNumericCellValue()); } else { return String.valueOf(cell.getNumericCellValue()); } } return " "; } /** * 合并单元格处理,获取合并行 * * @param sheet * @return List<CellRangeAddress> */ public List<CellRangeAddress> getCombineCell(Sheet sheet) { List<CellRangeAddress> list = new ArrayList<>(); //获得一个 sheet 中合并单元格的数量 int sheetmergerCount = sheet.getNumMergedRegions(); //遍历所有的合并单元格 for (int i = 0; i < sheetmergerCount; i++) { //获得合并单元格保存进list中 CellRangeAddress ca = sheet.getMergedRegion(i); list.add(ca); } return list; } public static int getRowNum(List<CellRangeAddress> listCombineCell, Cell cell, Sheet sheet) { int xr = 0; int firstC = 0; int lastC = 0; int firstR = 0; int lastR = 0; for (CellRangeAddress ca : listCombineCell) { //获得合并单元格的起始行, 结束行, 起始列, 结束列 firstC = ca.getFirstColumn(); lastC = ca.getLastColumn(); firstR = ca.getFirstRow(); lastR = ca.getLastRow(); if (cell.getRowIndex() >= firstR && cell.getRowIndex() <= lastR) { if (cell.getColumnIndex() >= firstC && cell.getColumnIndex() <= lastC) { xr = lastR; } } } return xr; } /** * 判断单元格是否为合并单元格,是的话则将单元格的值返回 * * @param listCombineCell 存放合并单元格的list * @param cell 需要判断的单元格 * @param sheet sheet * @return */ public String isCombineCell(List<CellRangeAddress> listCombineCell, Cell cell, Sheet sheet) throws Exception { int firstC = 0; int lastC = 0; int firstR = 0; int lastR = 0; String cellValue = null; for (CellRangeAddress ca : listCombineCell) { //获得合并单元格的起始行, 结束行, 起始列, 结束列 firstC = ca.getFirstColumn(); lastC = ca.getLastColumn(); firstR = ca.getFirstRow(); lastR = ca.getLastRow(); if (cell.getRowIndex() >= firstR && cell.getRowIndex() <= lastR) { if (cell.getColumnIndex() >= firstC && cell.getColumnIndex() <= lastC) { Row fRow = sheet.getRow(firstR); Cell fCell = fRow.getCell(firstC); cellValue = getCellValue(fCell); break; } } else { cellValue = ""; } } return cellValue; } public static boolean isContainChinese(String str) { Pattern p = Pattern.compile(REGEX_CHINESE); Matcher m = p.matcher(str); return m.find(); } public static BigDecimal doubleToBigDecimalDefault0(Double value) { if (null == value) { return BigDecimal.ZERO; } else { return BigDecimal.valueOf(value); } } public static BigDecimal doubleToBigDecimalDefault1(Double value) { if (null == value) { return BigDecimal.ONE; } else { return BigDecimal.valueOf(value); } } public static BigDecimal doubleToBigDecimalDefaultNull(Double value) { if (null == value) { return null; } else { return BigDecimal.valueOf(value); } } }