liusheng
昨天 09f75e1b4ee21241940ad26b91462ea15c5e4f00
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
@@ -442,6 +442,102 @@
    }
    /**
     * 导出包含两个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  返回数据