package com.highdatas.mdm.util; import com.highdatas.mdm.entity.SysField; import com.highdatas.mdm.entity.ViewMappingItem; import lombok.extern.slf4j.Slf4j; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.math.RoundingMode; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; /** * @author kimi * @description * @date 2020-04-17 12:16 */ @Slf4j public class ExcelUtil { /** * @param in * @param fileName * @return */ public static List getViewMappingByExcel(InputStream in, String fileName) { List list = new ArrayList<>(); Workbook work = null; try { // 创建excel工作簿 work = getWorkbook(in, fileName); if (null == work) { throw new Exception("创建Excel工作薄为空!"); } Sheet sheet = null; Row row = null; Cell cell = null; for (int i = 0; i < work.getNumberOfSheets(); i++) { sheet = work.getSheetAt(i); if (sheet == null) { continue; } // 滤过第一行标题 for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) { row = sheet.getRow(j); if (row == null || row.getFirstCellNum() == j) { continue; } ViewMappingItem item = new ViewMappingItem(); Cell preCell = row.getCell(0); if (preCell != null) { item.setPre(preCell.getStringCellValue()); } Cell fixCell = row.getCell(1); if (fixCell != null) { item.setFix(getValByCell(fixCell).toString()); } list.add(item); } } } catch (Exception e) { e.printStackTrace(); return null; } finally { try { work.close(); } catch (IOException e) { e.printStackTrace(); } } return list; } private static Object getValByCell(Cell cell) { if (cell == null) { return ""; } Object obj = null; switch (cell.getCellTypeEnum()) { case BOOLEAN: obj = cell.getBooleanCellValue(); break; case ERROR: obj = cell.getErrorCellValue(); break; case FORMULA: try { obj = String.valueOf(cell.getStringCellValue()); } catch (IllegalStateException e) { String valueOf = String.valueOf(cell.getNumericCellValue()); BigDecimal bd = new BigDecimal(Double.valueOf(valueOf)); bd = bd.setScale(2, RoundingMode.HALF_UP); obj = bd; } break; case NUMERIC: obj = cell.getNumericCellValue(); break; case STRING: String value = String.valueOf(cell.getStringCellValue()); value = value.replace(" ", ""); value = value.replace("\n", ""); value = value.replace("\t", ""); obj = value; break; default: break; } return obj; } /** * 判断文件格式 * * @param in * @param fileName * @return */ private static Workbook getWorkbook(InputStream in, String fileName) throws Exception { Workbook book = null; String filetype = fileName.substring(fileName.lastIndexOf(".")); if (".xls".equals(filetype)) { book = new HSSFWorkbook(in); } else if (".xlsx".equals(filetype)) { book = new XSSFWorkbook(in); } else { throw new Exception("请上传excel文件!"); } return book; } public static void export(HttpServletResponse response, List> importlist, ArrayList fieldList) throws UnsupportedEncodingException { //获取数据集 List> datalist = importlist; //声明一个工作薄 SXSSFWorkbook workbook = new SXSSFWorkbook(); //生成一个表格 SXSSFSheet sheet = workbook.createSheet(); //设置表格默认列宽度为15个字节 sheet.setDefaultColumnWidth((short) 15); //获取字段名数组 // String[] tableAttributeName = attributeNames; // //获取对象属性 // Field[] fields = ClassUtil.getClassAttribute(importlist.get(0)); // //获取对象get方法 // List methodList = ClassUtil.getMethodGet(importlist.get(0)); //循环字段名数组,创建标题行 Row row = sheet.createRow(0); for (int j = 0; j < fieldList.size(); j++) { //创建列 SysField sysField = fieldList.get(j); Cell cell = row.createCell(j); //设置单元类型为String cell.setCellType(CellType.STRING); cell.setCellValue(sysField.getAlias()); } //创建普通行 for (int i = 0; i < datalist.size(); i++) { //因为第一行已经用于创建标题行,故从第二行开始创建 row = sheet.createRow(i + 1); //如果是第一行就让其为标题行 Map oneData = datalist.get(i); for (int j = 0; j < fieldList.size(); j++) { //创建列 SysField sysField = fieldList.get(j); Cell cell = row.createCell(j); cell.setCellType(CellType.STRING); // Object value = oneData.get(sysField.getField()); cell.setCellValue(transCellType(value)); } } response.setContentType("application/octet-stream;charset=UTF-8"); response.setCharacterEncoding("UTF-8"); response.setHeader("content-type", "application/octet-stream;charset=UTF-8"); //默认Excel名称 response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("mapping数据.xlsx", "UTF-8")); try { response.flushBuffer(); workbook.write(response.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } } private static String transCellType(Object value) { String str = null; if (value instanceof Date) { Date date = (Date) value; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); str = sdf.format(date); } else { str = String.valueOf(value); if (str == "null") { str = ""; } } return str; } }