| | |
| | | } |
| | | |
| | | /** |
| | | * 导出包含两个Sheet的Excel |
| | | * Sheet1: 基于当前泛型类型T的注解导出 |
| | | * Sheet2: 基于传入的clazz2类型的注解导出 |
| | | * |
| | | * @param response 返回数据 |
| | | * @param list1 第一个Sheet的数据集合 |
| | | * @param sheetName1 第一个Sheet的名称 |
| | | * @param list2 第二个Sheet的数据集合 |
| | | * @param sheetName2 第二个Sheet的名称 |
| | | * @param clazz2 第二个Sheet数据对象的Class |
| | | */ |
| | | public void exportExcelTwoSheet(HttpServletResponse response, |
| | | List<T> list1, String sheetName1, |
| | | List<?> list2, String sheetName2, Class<?> clazz2) { |
| | | response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); |
| | | response.setCharacterEncoding("utf-8"); |
| | | // 初始化并写入Sheet1 |
| | | this.init(list1, sheetName1, StringUtils.EMPTY, Type.EXPORT); |
| | | writeSheet(); |
| | | // 追加写入Sheet2 |
| | | writeAdditionalSheet(list2, sheetName2, clazz2); |
| | | // 输出到响应流 |
| | | try { |
| | | wb.write(response.getOutputStream()); |
| | | } catch (Exception e) { |
| | | log.error("导出Excel异常{}", e.getMessage()); |
| | | } finally { |
| | | IOUtils.closeQuietly(wb); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 向当前工作簿追加写入一个Sheet |
| | | * |
| | | * @param dataList 数据集合 |
| | | * @param sheetName Sheet名称 |
| | | * @param dataClazz 数据对象的Class |
| | | */ |
| | | @SuppressWarnings("unchecked") |
| | | public void writeAdditionalSheet(List<?> dataList, String sheetName, Class<?> dataClazz) { |
| | | if (dataList == null) { |
| | | dataList = new ArrayList<>(); |
| | | } |
| | | // 保存原始状态 |
| | | Class<T> originClazz = this.clazz; |
| | | List<Object[]> originFields = this.fields; |
| | | List<T> originList = this.list; |
| | | String originSheetName = this.sheetName; |
| | | int originRownum = this.rownum; |
| | | List<Field> originSubFields = this.subFields; |
| | | Method originSubMethod = this.subMethod; |
| | | int originSubMergedFirstRowNum = this.subMergedFirstRowNum; |
| | | int originSubMergedLastRowNum = this.subMergedLastRowNum; |
| | | Map<Integer, Double> originStatistics = this.statistics; |
| | | short originMaxHeight = this.maxHeight; |
| | | |
| | | // 设置新类型 |
| | | this.clazz = (Class<T>) dataClazz; |
| | | this.list = (List<T>) dataList; |
| | | this.sheetName = sheetName; |
| | | this.rownum = 0; |
| | | this.subFields = null; |
| | | this.subMethod = null; |
| | | this.subMergedFirstRowNum = 1; |
| | | this.subMergedLastRowNum = 0; |
| | | this.statistics = new HashMap<Integer, Double>(); |
| | | |
| | | // 创建新Sheet |
| | | this.sheet = wb.createSheet(); |
| | | wb.setSheetName(wb.getNumberOfSheets() - 1, sheetName); |
| | | |
| | | // 重新创建字段 |
| | | createExcelField(); |
| | | |
| | | // 补充新字段的样式 |
| | | this.styles.putAll(annotationHeaderStyles(wb, this.styles)); |
| | | this.styles.putAll(annotationDataStyles(wb)); |
| | | |
| | | // 写入数据 |
| | | writeSheet(); |
| | | |
| | | // 恢复原始状态 |
| | | this.clazz = originClazz; |
| | | this.fields = originFields; |
| | | this.list = originList; |
| | | this.sheetName = originSheetName; |
| | | this.rownum = originRownum; |
| | | this.subFields = originSubFields; |
| | | this.subMethod = originSubMethod; |
| | | this.subMergedFirstRowNum = originSubMergedFirstRowNum; |
| | | this.subMergedLastRowNum = originSubMergedLastRowNum; |
| | | this.statistics = originStatistics; |
| | | this.maxHeight = originMaxHeight; |
| | | } |
| | | |
| | | /** |
| | | * 对list数据源将其里面的数据导入到excel表单(带文件名) |
| | | * |
| | | * @param response 返回数据 |