diff --git a/pom.xml b/pom.xml index b5b310c9..7a42ac32 100644 --- a/pom.xml +++ b/pom.xml @@ -238,7 +238,7 @@ org.apache.poi poi-ooxml - 3.9 + 3.17 diff --git a/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java index a5e49599..d32c8260 100644 --- a/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -13,6 +13,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; + import org.apache.poi.hssf.usermodel.DVConstraint; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; @@ -21,17 +22,21 @@ import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.hssf.util.HSSFColor.HSSFColorPredefined; import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.VerticalAlignment; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.ss.util.CellRangeAddressList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.ResourceUtils; + import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import com.ruoyi.framework.shiro.web.session.OnlineWebSessionManager; @@ -98,6 +103,8 @@ public class ExcelUtil if (rows > 0) { + // 默认序号 + int serialNum = 0; // 有数据时才处理 得到类的所有field. Field[] allFields = clazz.getDeclaredFields(); // 定义一个map用于存放列的序号和field. @@ -110,14 +117,14 @@ public class ExcelUtil { // 设置类的私有字段属性可访问. field.setAccessible(true); - fieldsMap.put(col, field); + fieldsMap.put(++serialNum, field); } } for (int i = 1; i < rows; i++) { // 从第2行开始取数据,默认第一行是表头. Row row = sheet.getRow(i); - int cellNum = sheet.getRow(0).getPhysicalNumberOfCells(); + int cellNum = serialNum; T entity = null; for (int j = 0; j < cellNum; j++) { @@ -129,7 +136,7 @@ public class ExcelUtil else { // 先设置Cell的类型,然后就可以把纯数字作为String类型读进来了 - row.getCell(j).setCellType(Cell.CELL_TYPE_STRING); + row.getCell(j).setCellType(CellType.STRING); cell = row.getCell(j); } @@ -178,7 +185,7 @@ public class ExcelUtil } else if (java.util.Date.class == fieldType) { - if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) + if (cell.getCellTypeEnum() == CellType.NUMERIC) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); cell.setCellValue(sdf.format(cell.getNumericCellValue())); @@ -211,168 +218,195 @@ public class ExcelUtil */ public AjaxResult exportExcel(List list, String sheetName) { - // 得到所有定义字段 - Field[] allFields = clazz.getDeclaredFields(); - List fields = new ArrayList(); - // 得到所有field并存放到一个list中. - for (Field field : allFields) - { - if (field.isAnnotationPresent(Excel.class)) - { - fields.add(field); - } - } + OutputStream out = null; + HSSFWorkbook workbook = null; - // 产生工作薄对象 - HSSFWorkbook workbook = new HSSFWorkbook(); - // excel2003中每个sheet中最多有65536行 - int sheetSize = 65536; - // 取出一共有多少个sheet. - double sheetNo = Math.ceil(list.size() / sheetSize); - for (int index = 0; index <= sheetNo; index++) + try { - // 产生工作表对象 - HSSFSheet sheet = workbook.createSheet(); - if (sheetNo == 0) - { - workbook.setSheetName(index, sheetName); - } - else + // 得到所有定义字段 + Field[] allFields = clazz.getDeclaredFields(); + List fields = new ArrayList(); + // 得到所有field并存放到一个list中. + for (Field field : allFields) { - // 设置工作表的名称. - workbook.setSheetName(index, sheetName + index); + if (field.isAnnotationPresent(Excel.class)) + { + fields.add(field); + } } - HSSFRow row; - HSSFCell cell; // 产生单元格 - // 产生一行 - row = sheet.createRow(0); - // 写入各个字段的列头名称 - for (int i = 0; i < fields.size(); i++) + // 产生工作薄对象 + workbook = new HSSFWorkbook(); + // excel2003中每个sheet中最多有65536行 + int sheetSize = 65536; + // 取出一共有多少个sheet. + double sheetNo = Math.ceil(list.size() / sheetSize); + for (int index = 0; index <= sheetNo; index++) { - Field field = fields.get(i); - Excel attr = field.getAnnotation(Excel.class); - // 创建列 - cell = row.createCell(i); - // 设置列中写入内容为String类型 - cell.setCellType(HSSFCell.CELL_TYPE_STRING); - HSSFCellStyle cellStyle = workbook.createCellStyle(); - cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); - cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); - if (attr.name().indexOf("注:") >= 0) + // 产生工作表对象 + HSSFSheet sheet = workbook.createSheet(); + if (sheetNo == 0) { - HSSFFont font = workbook.createFont(); - font.setColor(HSSFFont.COLOR_RED); - cellStyle.setFont(font); - cellStyle.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index); - sheet.setColumnWidth(i, 6000); + workbook.setSheetName(index, sheetName); } else { - HSSFFont font = workbook.createFont(); - // 粗体显示 - font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); - // 选择需要用到的字体格式 - cellStyle.setFont(font); - cellStyle.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index); - // 设置列宽 - sheet.setColumnWidth(i, 3766); + // 设置工作表的名称. + workbook.setSheetName(index, sheetName + index); } - cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); - cellStyle.setWrapText(true); - cell.setCellStyle(cellStyle); - - // 写入列名 - cell.setCellValue(attr.name()); + HSSFRow row; + HSSFCell cell; // 产生单元格 - // 如果设置了提示信息则鼠标放上去提示. - if (StringUtils.isNotEmpty(attr.prompt())) - { - // 这里默认设了2-101列提示. - setHSSFPrompt(sheet, "", attr.prompt(), 1, 100, i, i); - } - // 如果设置了combo属性则本列只能选择不能输入 - if (attr.combo().length > 0) + // 产生一行 + row = sheet.createRow(0); + // 写入各个字段的列头名称 + for (int i = 0; i < fields.size(); i++) { - // 这里默认设了2-101列只能选择不能输入. - setHSSFValidation(sheet, attr.combo(), 1, 100, i, i); + Field field = fields.get(i); + Excel attr = field.getAnnotation(Excel.class); + // 创建列 + cell = row.createCell(i); + // 设置列中写入内容为String类型 + cell.setCellType(CellType.STRING); + HSSFCellStyle cellStyle = workbook.createCellStyle(); + cellStyle.setAlignment(HorizontalAlignment.CENTER); + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + if (attr.name().indexOf("注:") >= 0) + { + HSSFFont font = workbook.createFont(); + font.setColor(HSSFFont.COLOR_RED); + cellStyle.setFont(font); + cellStyle.setFillForegroundColor(HSSFColorPredefined.YELLOW.getIndex()); + sheet.setColumnWidth(i, 6000); + } + else + { + HSSFFont font = workbook.createFont(); + // 粗体显示 + font.setBold(true); + // 选择需要用到的字体格式 + cellStyle.setFont(font); + cellStyle.setFillForegroundColor(HSSFColorPredefined.LIGHT_YELLOW.getIndex()); + // 设置列宽 + sheet.setColumnWidth(i, 3766); + } + cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyle.setWrapText(true); + cell.setCellStyle(cellStyle); + + // 写入列名 + cell.setCellValue(attr.name()); + + // 如果设置了提示信息则鼠标放上去提示. + if (StringUtils.isNotEmpty(attr.prompt())) + { + // 这里默认设了2-101列提示. + setHSSFPrompt(sheet, "", attr.prompt(), 1, 100, i, i); + } + // 如果设置了combo属性则本列只能选择不能输入 + if (attr.combo().length > 0) + { + // 这里默认设了2-101列只能选择不能输入. + setHSSFValidation(sheet, attr.combo(), 1, 100, i, i); + } } - } - int startNo = index * sheetSize; - int endNo = Math.min(startNo + sheetSize, list.size()); - // 写入各条记录,每条记录对应excel表中的一行 - HSSFCellStyle cs = workbook.createCellStyle(); - cs.setAlignment(HSSFCellStyle.ALIGN_CENTER); - cs.setVerticalAlignment(CellStyle.VERTICAL_CENTER); - for (int i = startNo; i < endNo; i++) - { - row = sheet.createRow(i + 1 - startNo); - // 得到导出对象. - T vo = (T) list.get(i); - for (int j = 0; j < fields.size(); j++) + int startNo = index * sheetSize; + int endNo = Math.min(startNo + sheetSize, list.size()); + // 写入各条记录,每条记录对应excel表中的一行 + HSSFCellStyle cs = workbook.createCellStyle(); + cs.setAlignment(HorizontalAlignment.CENTER); + cs.setVerticalAlignment(VerticalAlignment.CENTER); + for (int i = startNo; i < endNo; i++) { - // 获得field. - Field field = fields.get(j); - // 设置实体类私有属性可访问 - field.setAccessible(true); - Excel attr = field.getAnnotation(Excel.class); - try + row = sheet.createRow(i + 1 - startNo); + // 得到导出对象. + T vo = (T) list.get(i); + for (int j = 0; j < fields.size(); j++) { - // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. - if (attr.isExport()) + // 获得field. + Field field = fields.get(j); + // 设置实体类私有属性可访问 + field.setAccessible(true); + Excel attr = field.getAnnotation(Excel.class); + try { - // 创建cell - cell = row.createCell(j); - cell.setCellStyle(cs); - try - { - if (String.valueOf(field.get(vo)).length() > 10) - { - throw new Exception("长度超过10位就不用转数字了"); - } - // 如果可以转成数字则导出为数字类型 - BigDecimal bc = new BigDecimal(String.valueOf(field.get(vo))); - cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); - cell.setCellValue(bc.doubleValue()); - } - catch (Exception e) + // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. + if (attr.isExport()) { - cell.setCellType(HSSFCell.CELL_TYPE_STRING); - if (vo == null) + // 创建cell + cell = row.createCell(j); + cell.setCellStyle(cs); + try { - // 如果数据存在就填入,不存在填入空格. - cell.setCellValue(""); + if (String.valueOf(field.get(vo)).length() > 10) + { + throw new Exception("长度超过10位就不用转数字了"); + } + // 如果可以转成数字则导出为数字类型 + BigDecimal bc = new BigDecimal(String.valueOf(field.get(vo))); + cell.setCellType(CellType.NUMERIC); + cell.setCellValue(bc.doubleValue()); } - else + catch (Exception e) { - // 如果数据存在就填入,不存在填入空格. - cell.setCellValue(field.get(vo) == null ? "" : String.valueOf(field.get(vo))); - } + cell.setCellType(CellType.STRING); + if (vo == null) + { + // 如果数据存在就填入,不存在填入空格. + cell.setCellValue(""); + } + else + { + // 如果数据存在就填入,不存在填入空格. + cell.setCellValue(field.get(vo) == null ? "" : String.valueOf(field.get(vo))); + } + } } } - } - catch (Exception e) - { - log.error("导出Excel失败{}", e.getMessage()); + catch (Exception e) + { + log.error("导出Excel失败{}", e.getMessage()); + } } } } - } - try - { String filename = encodingFilename(sheetName); - OutputStream out = new FileOutputStream(getfile() + filename); + out = new FileOutputStream(getfile() + filename); workbook.write(out); - out.close(); return AjaxResult.success(filename); } catch (Exception e) { - log.error("关闭flush失败{}", e.getMessage()); + log.error("导出Excel异常{}", e.getMessage()); return AjaxResult.error("导出Excel失败,请联系网站管理员!"); } + finally + { + if (workbook != null) + { + try + { + workbook.close(); + } + catch (IOException e1) + { + e1.printStackTrace(); + } + } + if (out != null) + { + try + { + out.close(); + } + catch (IOException e1) + { + e1.printStackTrace(); + } + } + } } /**