wjli
2023-05-17 5fe820b18055b317cd5928d8fecd056f4c9e0115
1.根据区域进行模糊查询
2个文件已修改
1个文件已添加
122 ■■■■■ 已修改文件
xboot-modules/xboot-your/src/main/java/cn/exrick/xboot/your/common/ExcelFillCellMergeStrategy.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xboot-modules/xboot-your/src/main/java/cn/exrick/xboot/your/controller/SignCountController.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xboot-modules/xboot-your/src/main/java/cn/exrick/xboot/your/entity/OrderStatusCount.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xboot-modules/xboot-your/src/main/java/cn/exrick/xboot/your/common/ExcelFillCellMergeStrategy.java
New file
@@ -0,0 +1,105 @@
package cn.exrick.xboot.your.common;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import lombok.Data;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import java.util.List;
@Data
public class ExcelFillCellMergeStrategy implements CellWriteHandler {
    /**
     * 合并字段的下标,如第一到五列new int[]{0,1,2,3,4}
     */
    private int[] mergeColumnIndex;
    /**
     * 从第几行开始合并,如果表头占两行,这个数字就是2
     */
    private int mergeRowIndex;
    public ExcelFillCellMergeStrategy() {
    }
    public ExcelFillCellMergeStrategy(int mergeRowIndex, int[] mergeColumnIndex) {
        this.mergeRowIndex = mergeRowIndex;
        this.mergeColumnIndex = mergeColumnIndex;
    }
    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
                                 Head head, Integer integer, Integer integer1, Boolean aBoolean) {
    }
    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,
                                Head head, Integer integer, Boolean aBoolean) {
    }
    @Override
    public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
                                       CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {
    }
    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
                                 List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
//当前行
        int curRowIndex = cell.getRowIndex();
        //当前列
        int curColIndex = cell.getColumnIndex();
        if (curRowIndex > mergeRowIndex) {
            for (int i = 0; i < mergeColumnIndex.length; i++) {
                if (curColIndex == mergeColumnIndex[i]) {
                    mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
                    break;
                }
            }
        }
    }
    private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
        //获取当前行的当前列的数据和上一行的当前列列数据,通过上一行数据是否相同进行合并
        Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() :
                cell.getNumericCellValue();
        Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);
        Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() :
                preCell.getNumericCellValue();
        // 比较当前行的第一列的单元格与上一行是否相同,相同合并当前单元格与上一行
        //
        if (curData.equals(preData)) {
            Sheet sheet = writeSheetHolder.getSheet();
            List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();
            boolean isMerged = false;
            for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {
                CellRangeAddress cellRangeAddr = mergeRegions.get(i);
                // 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
                if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {
                    sheet.removeMergedRegion(i);
                    cellRangeAddr.setLastRow(curRowIndex);
                    sheet.addMergedRegion(cellRangeAddr);
                    isMerged = true;
                }
            }
            // 若上一个单元格未被合并,则新增合并单元
            if (!isMerged) {
                CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex,
                        curColIndex);
                sheet.addMergedRegion(cellRangeAddress);
            }
        }
    }
}
xboot-modules/xboot-your/src/main/java/cn/exrick/xboot/your/controller/SignCountController.java
@@ -4,6 +4,7 @@
import cn.exrick.xboot.core.common.utils.ResultUtil;
import cn.exrick.xboot.core.common.vo.PageVo;
import cn.exrick.xboot.core.common.vo.Result;
import cn.exrick.xboot.your.common.ExcelFillCellMergeStrategy;
import cn.exrick.xboot.your.entity.OrderStatusCount;
import cn.exrick.xboot.your.entity.QueryRequest;
import cn.exrick.xboot.your.entity.SignCount;
@@ -85,14 +86,16 @@
    @ApiOperation(value = "导出签收统计信息表", notes = "导出签收统计信息表")
    public void export1(OrderStatusCount orderStatusCount, HttpServletResponse response) throws IOException {
        List<OrderStatusCount> orderStatus = this.iSignCountService.signCounts2New(orderStatusCount);
        System.out.println(orderStatus);
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode("签收数量统计报表", "UTF-8");
        String fileName2 = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
//        response.setHeader("Content-dispostion", "attachment;filename="+fileName+".xls");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName2 + ".xlsx");
        EasyExcel.write(response.getOutputStream(),OrderStatusCount.class).
                sheet(0).doWrite(orderStatus);
        EasyExcel.write(response.getOutputStream(),OrderStatusCount.class)
                 .registerWriteHandler(new ExcelFillCellMergeStrategy(1,new int[]{0,1,2,9})) // 基于 column 长度,自动适配。最大 255 宽度
                .sheet(0).doWrite(orderStatus);
    }
    @GetMapping(value = "/selectBySign")
xboot-modules/xboot-your/src/main/java/cn/exrick/xboot/your/entity/OrderStatusCount.java
@@ -2,9 +2,11 @@
import cn.exrick.xboot.core.base.XbootBaseEntity;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentLoopMerge;
import com.alibaba.excel.annotation.write.style.OnceAbsoluteMerge;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import org.hibernate.annotations.DynamicInsert;
@@ -14,19 +16,19 @@
@Data
//@Excel("签收状态统计报表")
@ExcelIgnoreUnannotated
public class OrderStatusCount {
    @ContentLoopMerge(eachRow = 5)
    @ExcelProperty(value = "车号")
    @TableField(value = "carName")
    private String carName;
    @ContentLoopMerge(eachRow = 5)
    //@ContentLoopMerge(eachRow = 5)
    @ExcelProperty("姓名")
    @TableField(value = "userName")
    //@ExcelIgnore
    private String userName;
    //    @ContentLoopMerge(eachRow = 5)
    @ContentLoopMerge(eachRow = 5)
    //@ContentLoopMerge(eachRow = 5)
    @ExcelProperty("线路")
    @TableField(value = "line")
    private String line;
@@ -50,7 +52,7 @@
    @TableField(value = "proportion")
    private String proportion;
    @ContentLoopMerge(eachRow = 5)
   // @ContentLoopMerge(eachRow = 5)
    @ExcelProperty("平均签收率")
    @TableField(value = "name")
    //@ExcelIgnore