فهرست منبع

宿管值班安排表导出

dzx 1 سال پیش
والد
کامیت
f77c63f6b5

+ 119 - 4
src/main/java/com/xjrsoft/module/room/controller/RoomValueWeekController.java

@@ -2,7 +2,10 @@ package com.xjrsoft.module.room.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
 import com.alibaba.excel.support.ExcelTypeEnum;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.WriteTable;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
@@ -11,11 +14,24 @@ import com.xjrsoft.module.room.dto.AddRoomValueWeekDto;
 import com.xjrsoft.module.room.dto.RoomValueWeekPageDto;
 import com.xjrsoft.module.room.dto.UpdateRoomValueWeekDto;
 import com.xjrsoft.module.room.service.IRoomValueWeekService;
+import com.xjrsoft.module.room.util.CustomCellRangeAddress;
+import com.xjrsoft.module.room.vo.RoomValueWeekExcelVo;
+import com.xjrsoft.module.room.vo.RoomValueWeekItemExcelVo;
 import com.xjrsoft.module.room.vo.RoomValueWeekItemVo;
 import com.xjrsoft.module.room.vo.RoomValueWeekPageVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.apache.poi.ss.usermodel.BorderStyle;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFCell;
+import org.apache.poi.xssf.usermodel.XSSFCellStyle;
+import org.apache.poi.xssf.usermodel.XSSFFont;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -27,7 +43,10 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -95,11 +114,107 @@ public class RoomValueWeekController {
 
     @GetMapping("/export")
     @ApiOperation(value = "导出")
-    public ResponseEntity<byte[]> exportData(@Valid RoomValueWeekPageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
-        List<RoomValueWeekPageVo> customerList = isTemplate != null && isTemplate ? new ArrayList<>() : ((PageOutput<RoomValueWeekPageVo>) page(dto).getData()).getList();
+    public ResponseEntity<byte[]> exportData(@Valid RoomValueWeekPageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) throws IOException {
+        List<RoomValueWeekExcelVo> dataList = roomValueWeekService.getList(dto);
+        String sheetName = "数据";
+        String fileName = "RoomValueWeek" + ExcelTypeEnum.XLSX.getValue();
         ByteArrayOutputStream bot = new ByteArrayOutputStream();
-        EasyExcel.write(bot, RoomValueWeekPageVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(customerList);
 
-        return RT.fileStream(bot.toByteArray(), "RoomValueWeek" + ExcelTypeEnum.XLSX.getValue());
+        ExcelWriter excelWriter = EasyExcel.write(bot).excelType(ExcelTypeEnum.XLSX).build();
+        WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).needHead(Boolean.FALSE).build();
+
+        List<RoomValueWeekItemExcelVo> demoDataList2 = new ArrayList<>();
+        demoDataList2.add(new RoomValueWeekItemExcelVo(){{
+            setColumn1("");
+            setColumn2("");
+            setColumn3("");
+            setColumn4("");
+        }});
+
+        //写入数据,并计算需要合并的单元格
+        int tableRows = 6;
+        int j = 0;
+        List<CellRangeAddress> cellRangeAddressList = new ArrayList<>();
+        List<CustomCellRangeAddress> styleList = new ArrayList<>();
+        for (int i = 0; i < dataList.size() * 2; ){
+
+            WriteTable writeTable = EasyExcel.writerTable(i + 1).head(RoomValueWeekItemExcelVo.class).needHead(Boolean.FALSE).build();
+            excelWriter.write(dataList.get(j).getItemList(), writeSheet, writeTable);
+            //存下需要合并的单元格
+            cellRangeAddressList.add(new CellRangeAddress((tableRows * j) + 0, (tableRows * j) + 0, 0, 3));
+            cellRangeAddressList.add(new CellRangeAddress((tableRows * j) + 1, (tableRows * j) + 1, 0, 1));
+            cellRangeAddressList.add(new CellRangeAddress((tableRows * j) + 1, (tableRows * j) + 1, 2, 3));
+            cellRangeAddressList.add(new CellRangeAddress((tableRows * j) + 3, (tableRows * j) + 4, 0, 0));
+            cellRangeAddressList.add(new CellRangeAddress((tableRows * j) + 3, (tableRows * j) + 4, 1, 1));
+
+            //存下需要设置样式的单元
+            styleList.add(new CustomCellRangeAddress((tableRows * j) + 0, (tableRows * j) + 0, 0, 3, Boolean.TRUE));
+            styleList.add(new CustomCellRangeAddress((tableRows * j) + 1, (tableRows * j) + 1, 0, 3, Boolean.TRUE));
+            styleList.add(new CustomCellRangeAddress((tableRows * j) + 2, (tableRows * j) + 2, 0, 3));
+            styleList.add(new CustomCellRangeAddress((tableRows * j) + 3, (tableRows * j) + 3, 0, 3));
+            styleList.add(new CustomCellRangeAddress((tableRows * j) + 4, (tableRows * j) + 4, 0, 3));
+
+            WriteTable writeTable3 = EasyExcel.writerTable(i + 2).build();
+            excelWriter.write(demoDataList2, writeSheet, writeTable3);
+            cellRangeAddressList.add(new CellRangeAddress((tableRows * j) + 5, (tableRows * j) + 5, 0, 3));
+
+            j ++;
+            i = i + 2;
+        }
+        excelWriter.finish();
+
+        // 将ByteArrayOutputStream转换为InputStream
+        InputStream in = new ByteArrayInputStream(bot.toByteArray());
+
+        //使用poi合并单元格,使用registerWriteHandler合并单元格会与fill方法中创建单元格后校验合并单元格冲突而引发报错
+        XSSFWorkbook workbook = new XSSFWorkbook(in);
+        XSSFSheet sheetAt = workbook.getSheet(sheetName);
+
+        for (CellRangeAddress cellRangeAddress : cellRangeAddressList) {
+            sheetAt.addMergedRegion(cellRangeAddress);
+        }
+        for (CustomCellRangeAddress cellRangeAddress : styleList) {
+            setRegionStyle(sheetAt, cellRangeAddress, setDefaultStyle(workbook, cellRangeAddress.getIsBlod()));
+        }
+
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        workbook.write(os);
+        os.flush();
+        os.close();
+
+        return RT.fileStream(os.toByteArray(), fileName);
+    }
+
+    public void setRegionStyle(XSSFSheet sheet, CellRangeAddress region, XSSFCellStyle xssfCellStyle) {
+        for (int i = region.getFirstRow(); i <= region.getLastRow(); i++) {
+            XSSFRow row = sheet.getRow(i);
+            if (null == row) row = sheet.createRow(i);
+            for (int j = region.getFirstColumn(); j <= region.getLastColumn(); j++) {
+                XSSFCell cell = row.getCell(j);
+                if (null == cell) cell = row.createCell(j);
+                cell.setCellStyle(xssfCellStyle);
+            }
+        }
+    }
+
+    public XSSFCellStyle setDefaultStyle(XSSFWorkbook workbook, Boolean isBold) {
+        XSSFCellStyle cellStyle = workbook.createCellStyle();
+        // 边框
+        cellStyle.setBorderBottom(BorderStyle.THIN);
+        cellStyle.setBorderLeft(BorderStyle.THIN);
+        cellStyle.setBorderRight(BorderStyle.THIN);
+        cellStyle.setBorderTop(BorderStyle.THIN);
+        // 居中
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        // 字体
+        XSSFFont font = workbook.createFont();
+        font.setFontName("Calibri");
+        if(isBold){
+            font.setBold(isBold);
+        }
+        font.setFontHeightInPoints((short) 10);
+        cellStyle.setFont(font);
+        return cellStyle;
     }
 }

+ 2 - 1
src/main/java/com/xjrsoft/module/room/service/IRoomValueWeekService.java

@@ -6,6 +6,7 @@ import com.xjrsoft.module.room.dto.AddRoomValueWeekDto;
 import com.xjrsoft.module.room.dto.RoomValueWeekPageDto;
 import com.xjrsoft.module.room.dto.UpdateRoomValueWeekDto;
 import com.xjrsoft.module.room.entity.RoomValueWeek;
+import com.xjrsoft.module.room.vo.RoomValueWeekExcelVo;
 import com.xjrsoft.module.room.vo.RoomValueWeekItemVo;
 import com.xjrsoft.module.room.vo.RoomValueWeekPageVo;
 
@@ -45,7 +46,7 @@ public interface IRoomValueWeekService extends MPJBaseService<RoomValueWeek> {
 
     Page<RoomValueWeekPageVo> getPage(Page<RoomValueWeekPageDto> page, RoomValueWeekPageDto dto);
 
-    List<RoomValueWeek> getList(RoomValueWeekPageDto dto);
+    List<RoomValueWeekExcelVo> getList(RoomValueWeekPageDto dto);
 
     Boolean updateNumberPeople();
 

+ 5 - 6
src/main/java/com/xjrsoft/module/room/service/impl/RoomValueWeekServiceImpl.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.room.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -142,11 +143,11 @@ public class RoomValueWeekServiceImpl extends MPJBaseServiceImpl<RoomValueWeekMa
     }
 
     @Override
-    public List<RoomValueWeek> getList(RoomValueWeekPageDto dto) {
+    public List<RoomValueWeekExcelVo> getList(RoomValueWeekPageDto dto) {
         List<RoomValueWeek> weekList = roomValueWeekRoomValueWeekMapper.selectList(
             new QueryWrapper<RoomValueWeek>().lambda()
-            .ge(RoomValueWeek::getEndTime, dto.getEndTime())
-            .le(RoomValueWeek::getStartTime, dto.getStartTime())
+            .le(ObjectUtil.isNotNull(dto.getEndTime()), RoomValueWeek::getEndTime, dto.getEndTime())
+            .ge(ObjectUtil.isNotNull(dto.getStartTime()), RoomValueWeek::getStartTime, dto.getStartTime())
         );
         List<RoomValueWeekExcelVo> dataList = BeanUtil.copyToList(weekList, RoomValueWeekExcelVo.class);
 
@@ -211,9 +212,7 @@ public class RoomValueWeekServiceImpl extends MPJBaseServiceImpl<RoomValueWeekMa
             weekExcelVo.setItemList(itemList);
         }
 
-
-
-        return null;
+        return dataList;
     }
 
     @Override

+ 29 - 0
src/main/java/com/xjrsoft/module/room/util/CustomCellRangeAddress.java

@@ -0,0 +1,29 @@
+package com.xjrsoft.module.room.util;
+
+import org.apache.poi.ss.util.CellRangeAddress;
+
+/**
+ * @author dzx
+ * @date 2024/1/8
+ */
+public class CustomCellRangeAddress extends CellRangeAddress {
+    private boolean isBlod;
+
+    public boolean getIsBlod() {
+        return isBlod;
+    }
+
+    public void setIsBlod(boolean blod) {
+        isBlod = blod;
+    }
+
+    public CustomCellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) {
+        super(firstRow, lastRow, firstCol, lastCol);
+    }
+
+    public CustomCellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol, Boolean isBlod) {
+        super(firstRow, lastRow, firstCol, lastCol);
+        setIsBlod(isBlod);
+    }
+
+}

+ 7 - 7
src/main/java/com/xjrsoft/module/room/vo/RoomValueWeekItemExcelVo.java

@@ -14,19 +14,19 @@ import lombok.Data;
 public class RoomValueWeekItemExcelVo {
 
     @ExcelProperty(index = 0)
-    @ColumnWidth(15)
+    @ColumnWidth(20)
     private String column1;
 
-    @ExcelProperty(index = 0)
-    @ColumnWidth(15)
+    @ExcelProperty(index = 1)
+    @ColumnWidth(20)
     private String column2;
 
-    @ExcelProperty(index = 0)
-    @ColumnWidth(15)
+    @ExcelProperty(index = 2)
+    @ColumnWidth(20)
     private String column3;
 
-    @ExcelProperty(index = 0)
-    @ColumnWidth(15)
+    @ExcelProperty(index = 3)
+    @ColumnWidth(20)
     private String column4;
 
 }