1821349743@qq.com
2023-04-17 b92fd92933fce8e97fef05207596217bb746cd4d
update export excel
已添加1个文件
已修改2个文件
161 ■■■■ 文件已修改
src/main/java/com/product/module/data/controller/SystemDataExportController.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/module/data/service/SystemDataExportService.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/module/data/utli/CustomMergeStrategy.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/module/data/controller/SystemDataExportController.java
@@ -68,35 +68,13 @@
            e.printStackTrace();
            SpringMVCContextHolder.getSystemLogger().error(e);
            return error(e);
        }
        catch (Exception e){
        } catch (Exception e) {
            e.printStackTrace();
            SpringMVCContextHolder.getSystemLogger().error(e);
            return error(CmnCode.EXPORT_GENERAL_LIST_DATA_IMPORT_FIAL.getValue(),CmnCode.EXPORT_GENERAL_LIST_DATA_IMPORT_FIAL.getText()+e.getMessage());
        }
    }
    @PostMapping("report/{version}")
    @ApiVersion(1)
    public String reportDataExport(HttpServletRequest request){
        try{
            FieldSetEntity fse = null;
            Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA);
            if (bean != null) {
                RequestParameterEntity reqp = (RequestParameterEntity) bean;
                return OK_Add(systemDataExportService.reportDataExport(reqp));
            }
            return OK();
        }catch (BaseException e){
            e.printStackTrace();
            SpringMVCContextHolder.getSystemLogger().error(e);
            return error(e);
        }
        catch (Exception e){
            e.printStackTrace();
            SpringMVCContextHolder.getSystemLogger().error(e);
            return error(CmnCode.EXPORT_GENERAL_LIST_DATA_IMPORT_FIAL.getValue(),CmnCode.EXPORT_GENERAL_LIST_DATA_IMPORT_FIAL.getText()+e.getMessage());
        }
    }
}
src/main/java/com/product/module/data/service/SystemDataExportService.java
@@ -22,6 +22,7 @@
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
@@ -41,6 +42,16 @@
    @Override
    public BaseDao getBaseDao() {
        return super.getBaseDao();
    }
    public void reportDataExport(FieldSetEntity fse) throws BaseException {
        //报表uuid
        String uuid = fse.getUUID();
        //是否当前页
        boolean exportCurrentPage = fse.getBoolean("exportCurrentPage");
        //当前页号
        int pageIndex = fse.getInteger(CmnConst.CPAGE);
    }
    /**
@@ -248,7 +259,6 @@
        List<List<String>> headTitles = Lists.newArrayList();
        List<String> fields = Lists.newArrayList();
        //导出的数据集
        List<List<Object>> exportData = Lists.newArrayList();
        List<String> titles = Lists.newArrayList();
        List<String> titleTemplate = Lists.newArrayList();
        titleTemplate.add(main_title);
@@ -266,12 +276,31 @@
        response.setContentType("multipart/form-data");
        response.setCharacterEncoding("utf-8");
        // è¿™é‡ŒURLEncoder.encode可以防止中文乱码 å½“ç„¶å’Œeasyexcel没有关系
        // è¿™é‡Œéœ€è¦è®¾ç½®ä¸å…³é—­æµ
        EasyExcel.write(response.getOutputStream()).
                registerWriteHandler(new Custemhandler()).head(headTitles).sheet(main_title).doWrite(lists);
        writeExcel(headTitles, lists, main_title, response);
    }
    /**
     * è¾“出excel
     *
     * @param excelHeaders excel表头
     * @param dataRows     æ•°æ®è¡Œ
     * @param sheetName    sheet名称
     * @throws IOException
     */
    public void writeExcel(List<List<String>> excelHeaders, List dataRows, String sheetName, HttpServletResponse response) throws IOException {
        response.setContentType("multipart/form-data");
        response.setCharacterEncoding("utf-8");
        // è¿™é‡ŒURLEncoder.encode可以防止中文乱码 å½“ç„¶å’Œeasyexcel没有关系
        // è¿™é‡Œéœ€è¦è®¾ç½®ä¸å…³é—­æµ
        try (ServletOutputStream outputStream = response.getOutputStream();) {
            EasyExcel.write(outputStream).
                    registerWriteHandler(new Custemhandler()).head(excelHeaders).sheet(sheetName).doWrite(dataRows);
        }
    }
    /**
     * ç»„装数据
     *
     * @param dataArray
src/main/java/com/product/module/data/utli/CustomMergeStrategy.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,98 @@
package com.product.module.data.utli;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.merge.AbstractMergeStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;
public class CustomMergeStrategy extends AbstractMergeStrategy {
    /**
     * åˆ†ç»„,每几行合并一次
     */
    private List<List<Integer>> mergeColDataGroupCountList;
    /**
     * ç›®æ ‡åˆå¹¶åˆ—index
     */
    private List<Integer> targetColumnIndex;
    /**
     *     éœ€è¦å¼€å§‹åˆå¹¶å•元格的首行index
      */
    private Integer rowIndex;
    /**
     *     mergeColDataList为待合并目标列的值
      */
    public CustomMergeStrategy(List<List<String>> mergeColDataList, List<Integer> targetColumnIndex) {
        this.mergeColDataGroupCountList = getGroupCountList(mergeColDataList);
        this.targetColumnIndex = targetColumnIndex;
    }
    @Override
    protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
        if (null == rowIndex) {
            rowIndex = cell.getRowIndex();
        }
        // ä»…从首行以及目标列的单元格开始合并,忽略其他
        if (cell.getRowIndex() == rowIndex && targetColumnIndex.contains(cell.getColumnIndex())) {
            //找到对应的需要合并的列
            AtomicInteger i = new AtomicInteger(0);
            Optional<Integer> first = targetColumnIndex.stream().filter(col -> {
                i.getAndIncrement();
                return col == cell.getColumnIndex();
            }).findFirst();
            mergeGroupColumn(sheet, first.get());
        }
    }
    private void mergeGroupColumn(Sheet sheet, Integer index) {
        int rowCount = rowIndex;
        for (Integer count : mergeColDataGroupCountList.get(index)) {
            if (count == 1) {
                rowCount += count;
                continue;
            }
            // åˆå¹¶å•元格
            CellRangeAddress cellRangeAddress = new CellRangeAddress(rowCount, rowCount + count - 1,
                    targetColumnIndex.get(index), targetColumnIndex.get(index));
            sheet.addMergedRegionUnsafe(cellRangeAddress);
            rowCount += count;
        }
    }
    /**
     *     è¯¥æ–¹æ³•将目标列根据值是否相同连续可合并,存储可合并的行数
      */
    private List<List<Integer>> getGroupCountList(List<List<String>> exportDataList) {
        if (CollUtil.isEmpty(exportDataList)) {
            return new ArrayList<>();
        }
        List<List<Integer>> groupCountListList = new ArrayList<>();
        exportDataList.forEach(dataList->{
            List<Integer> groupCountList = new ArrayList<>();
            int count = 1;
            for (int i = 1; i < dataList.size(); i++) {
                if (dataList.get(i).equals(dataList.get(i - 1))) {
                    count++;
                } else {
                    groupCountList.add(count);
                    count = 1;
                }
            }
            // å¤„理完最后一条后
            groupCountList.add(count);
            groupCountListList.add(groupCountList);
        });
        return groupCountListList;
    }
}