赞
踩
import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.net.URLEncoder; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.*; /** * Excel导入、导出 */ public class ExcelDataHandleUtil { private final static String XLS = "xls"; private final static String XLSX = "xlsx"; private final static String SUFFIX_XLS = ".xls"; private final static String SUFFIX_XLSX = ".xlsx"; /** * 解析Excel数据 */ public static List<Map<String, Object>> analysisExcel(MultipartFile file, String[] keyList) throws Exception { // 1、用HSSFWorkbook打开或者创建“Excel文件对象” Workbook workbook = null; //获得文件名 String fileName = file.getOriginalFilename(); // 判断后缀 if (fileName.endsWith(XLS)) { //2003 workbook = new HSSFWorkbook(file.getInputStream()); } else if (fileName.endsWith(XLSX)) { //2007 workbook = new XSSFWorkbook(file.getInputStream()); } else { throw new Exception("文件不是Excel文件"); } // 2、用HSSFWorkbook对象返回或者创建Sheet对象 Sheet sheet = workbook.getSheetAt(0); int rows = sheet.getLastRowNum();// 指的行数,一共有多少行 if (rows == 0) { throw new Exception("请填写数据"); } List<Map<String, Object>> list = new ArrayList<>(); // 3、用Sheet对象返回行对象,用行对象得到Cell对象 for (int i = 1; i <= rows; i++) { // 读取左上端单元格 Row row = sheet.getRow(i); // 行不为空 if (row != null) { // 4、对Cell对象读写。 Map<String, Object> map = new HashMap<>(); for (int j = 0; j < keyList.length; j++) { map.put(keyList[j], getCellValue(row.getCell(j))); } list.add(map); } } return list; } /** * 导出excel文件2007 */ public static void exportExcel(HttpServletResponse response, List<Map> list, String[] keyList, String[] columnNameList, String fileName) throws Exception { // 第一步,创建一个webbook,对应一个Excel文件 XSSFWorkbook workbook = new XSSFWorkbook(); // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet XSSFSheet sheet = workbook.createSheet("Sheet1"); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short XSSFRow row = sheet.createRow(0); // 第四步,创建单元格,并设置值表头 设置表头居中 XSSFCellStyle style = workbook.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 // HSSFCell cell = row.createCell(0); XSSFCell cell = row.createCell(0); // 列头 for (int i = 0; i < columnNameList.length; i++) { cell.setCellValue(columnNameList[i]); cell.setCellStyle(style); cell = row.createCell(i + 1); } // 数据 for (int i = 0; i < list.size(); i++) { row = sheet.createRow(i + 1); Map<String, Object> map = list.get(i); for (int j = 0; j < keyList.length; j++) { String key = keyList[j]; // 第四步,创建单元格,并设置值 if (map.get(key) != null && StringUtils.isNotBlank(map.get(key).toString())) { row.createCell(j).setCellValue(String.valueOf(map.get(key))); } } } // 第六步,输出Excel文件 OutputStream output = response.getOutputStream(); response.reset(); // SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置日期格式 // String fileName = df.format(new Date());// new Date()为获取当前系统时间 response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8") + SUFFIX_XLSX); response.setContentType("application/msexcel"); workbook.write(output); output.close(); } /** * 导出excel文件2003 */ public static void exportExcelXLS(HttpServletResponse response, List<Map> list, String[] keyList, String[] columnNameList, String fileName) throws Exception { // 第一步,创建一个webbook,对应一个Excel文件 HSSFWorkbook workbook = new HSSFWorkbook(); // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet HSSFSheet sheet = workbook.createSheet("Sheet1"); // 设置表格默认列宽度为20个字节 sheet.setDefaultColumnWidth((short) 20); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short HSSFRow row = sheet.createRow(0); // 第四步,创建单元格,并设置值表头 设置表头居中 HSSFCellStyle style = workbook.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 HSSFCell cell = row.createCell(0); style.setAlignment(HorizontalAlignment.CENTER); style.setFillForegroundColor(HSSFColor.PALE_BLUE.index); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setBorderBottom(BorderStyle.THIN); style.setBorderLeft(BorderStyle.THIN); style.setBorderRight(BorderStyle.THIN); style.setBorderTop(BorderStyle.THIN); // 生成一个字体 HSSFFont font = workbook.createFont(); font.setColor(HSSFColor.BLACK.index); font.setFontHeightInPoints((short) 12); font.setBold(true); // 把字体应用到当前的样式 style.setFont(font); // 列头 for (int i = 0; i < columnNameList.length; i++) { cell.setCellValue(columnNameList[i]); cell.setCellStyle(style); cell = row.createCell(i + 1); } // 数据 for (int i = 0; i < list.size(); i++) { row = sheet.createRow(i + 1); Map<String, Object> map = list.get(i); for (int j = 0; j < keyList.length; j++) { String key = keyList[j]; // 第四步,创建单元格,并设置值 if (map.get(key) != null && StringUtils.isNotBlank(map.get(key).toString())) { row.createCell(j).setCellValue(String.valueOf(map.get(key))); } } } // 第六步,输出Excel文件 OutputStream output = response.getOutputStream(); response.reset(); SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置日期格式 //String fileName = df.format(new Date());// new Date()为获取当前系统时间 response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8") + SUFFIX_XLS); response.setContentType("application/msexcel"); workbook.write(output); output.close(); } /** * 多个sheet导出 * 导出excel文件2003 */ public static void exportExcel(HSSFWorkbook workbook, int sheetNum, String sheetTitle, List<Map<String, Object>> list, String[] keyList, String[] columnNameList) { // 生成一个表格 HSSFSheet sheet = workbook.createSheet(); workbook.setSheetName(sheetNum, sheetTitle); HSSFRow row = sheet.createRow(0); // 设置表格默认列宽度为20个字节 sheet.setDefaultColumnWidth((short) 20); HSSFCell cell = row.createCell(0); // 第四步,创建单元格,并设置值表头 设置表头居中 HSSFCellStyle style = workbook.createCellStyle(); // 设置这些样式 style.setAlignment(HorizontalAlignment.CENTER); style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setBorderBottom(BorderStyle.THIN); style.setBorderLeft(BorderStyle.THIN); style.setBorderRight(BorderStyle.THIN); style.setBorderTop(BorderStyle.THIN); // 生成一个字体 HSSFFont font = workbook.createFont(); font.setColor(HSSFColor.BLACK.index); font.setFontHeightInPoints((short) 13); font.setBold(true); // 把字体应用到当前的样式 style.setFont(font); // 列头 for (int i = 0; i < columnNameList.length; i++) { cell.setCellValue(columnNameList[i]); cell.setCellStyle(style); row.setHeight((short) (30 * 20)); cell = row.createCell(i + 1); } // 数据 if (list != null && !list.isEmpty()) { for (int i = 0; i < list.size(); i++) { row = sheet.createRow(i + 1); Map<String, Object> map = list.get(i); for (int j = 0; j < keyList.length; j++) { String key = keyList[j]; // 第四步,创建单元格,并设置值 if (map.get(key) != null && StringUtils.isNotBlank(map.get(key).toString())) { row.createCell(j).setCellValue(String.valueOf(map.get(key))); } } } } } /** * 获得Cell内容 * * @param cell 单元格 * @return 数据 */ private static String getCellValue(Cell cell) { String value = ""; if (cell != null) { // 以下是判断数据的类型 switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_NUMERIC: // 数字 value = cell.getNumericCellValue() + ""; if (HSSFDateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); if (date != null) { value = new SimpleDateFormat("yyyy-MM-dd").format(date); } else { value = ""; } } else { value = new DecimalFormat("##0.####").format(cell.getNumericCellValue()); } break; case HSSFCell.CELL_TYPE_STRING: // 字符串 value = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean value = cell.getBooleanCellValue() + ""; break; case HSSFCell.CELL_TYPE_FORMULA: // 公式 value = cell.getCellFormula() + ""; break; case HSSFCell.CELL_TYPE_BLANK: // 空值 value = ""; break; case HSSFCell.CELL_TYPE_ERROR: // 故障 value = "非法字符"; break; default: value = "未知类型"; break; } } return value.trim(); } }
@ApiOperation(value = "资产中心-资产包-导出") @ApiResponse(code = 200, message = "返回结果") @RequestMapping(value = "/export", method = RequestMethod.POST) public void export(@RequestBody AssetPackageVersionSearchDto dto, HttpServletResponse response) throws IOException { if (dto.getProjectMainId() == null) { throw new LogicException(500, "项目id不能为空"); } // 导出查询 AssetPackageVersionResultDto resultDto = this.assetPackageClient.queryDetail(dto).getResult(); // 获取枚举数据,进行枚举数据匹配 Map<String, String> operateStatusMap = getOperateStatus(); for (AssetUnitResultDto assetUnitResultDto : resultDto.getAssetUnitList()) { // 资产状态替换 if (operateStatusMap.containsKey(assetUnitResultDto.getOperateStatus().toString())) { assetUnitResultDto.setOperateStatusName( operateStatusMap.get(assetUnitResultDto.getOperateStatus().toString())); } } try { String s1 = JSON.toJSONString(resultDto.getAssetPackageList()); String s2 = JSON.toJSONString(resultDto.getAssetUnitList()); // 资产包 List<Map<String, Object>> assetPackageList = JSONObject.parseObject(s1, new TypeReference<List<Map<String, Object>>>() { }); // 资产单元 List<Map<String, Object>> assetUnitList = JSONObject.parseObject(s2, new TypeReference<List<Map<String, Object>>>() { }); // 资产包字段名 String[] assetPackageKey = {"assetPackageCode", "assetPackageName", "firstFormatName", "buildingArea", "selfBuildingArea", "saleableBuildingArea", "matchingArea", "governmentRepurchaseArea", "otherArea", "assetLocation", "remark"}; // 资产包表格列头-顺序需要一致 String[] assetPackageColumnName = {"资产包编码", "资产包名称", "汇总业态", "总建筑面积(㎡)", "自持建筑面积(㎡)", "可售建筑面积(㎡)", "配套面积(㎡)", "政府回购面积(㎡)", "其他面积(㎡)", "资产包坐落", "备注"}; // 资产单元字段名 String[] assetUnitKey = {"assetUnitName", "assetUnitCode", "buildingName", "assetPackageName", "assetPackageCode", "operateStatusName", "firstFormatName", "buildingFormatName", "secondFormatName", "buildingArea", "selfBuildingArea", "saleableBuildingArea", "matchingArea", "governmentRepurchaseArea", "otherArea", "remark"}; // 资产单元表格列头-顺序需要一致 String[] assetUnitColumnName = {"资产单元名称", "资产单元编码", "所属楼栋", "所属资产包名称", "所属资产包编码", "资产状态", "汇总业态", "建筑业态", "营销业态", "总建筑面积(㎡)", "自持建筑面积(㎡)", "可售建筑面积(㎡)", "配套面积(㎡)", "政府回购面积(㎡)", "其他面积(㎡)", "备注"}; // 导出 HSSFWorkbook workbook = new HSSFWorkbook(); ExcelDataHandleUtil.exportExcel(workbook, 0, "资产包", assetPackageList, assetPackageKey, assetPackageColumnName); ExcelDataHandleUtil.exportExcel(workbook, 1, "资产单元", assetUnitList, assetUnitKey, assetUnitColumnName); // 定义文件名称 String fileName = "资产包数据导出" + DateUtils.dateTimeNow(); OutputStream output = response.getOutputStream(); response.reset(); response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String dlfileName = URLEncoder.encode(fileName, "utf-8").replaceAll("\\+", "%20"); response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + dlfileName + ".xls"); workbook.write(output); output.close(); } catch (Exception e) { throw new LogicException(500, "导出失败,请重试!"); } } /** * 获取资产状态 * * @return 数据 */ public Map<String, String> getOperateStatus() { DicCodeVo dicCodeVo = DicCodeVo.init() // 资产状态 .addDic("assetPackageOperateStatus", DictPathConstant.ASSET_PACKAGE_OPERATE_STATUS); Map<String, String> map = Maps.newHashMap(); dicCodeVo.getDic().entrySet().forEach(d -> { // 资产状态 if ("assetPackageOperateStatus".equals(d.getKey())) { d.getValue().getChildren().forEach(v -> { map.put(v.getValue(), v.getName()); }); } }); return map; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。