实现 高性能分批导出+动态进度条
parent
dec6af6da1
commit
fc5f67d70f
|
|
@ -1,5 +1,6 @@
|
||||||
package net.lab1024.sa.admin.module.business.wms.base.address.controller;
|
package net.lab1024.sa.admin.module.business.wms.base.address.controller;
|
||||||
|
|
||||||
|
import jakarta.servlet.ServletOutputStream;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import net.lab1024.sa.admin.module.business.wms.base.address.domain.entity.AddressEntity;
|
import net.lab1024.sa.admin.module.business.wms.base.address.domain.entity.AddressEntity;
|
||||||
import net.lab1024.sa.admin.module.business.wms.base.address.domain.form.AddressAddForm;
|
import net.lab1024.sa.admin.module.business.wms.base.address.domain.form.AddressAddForm;
|
||||||
|
|
@ -11,6 +12,7 @@ import net.lab1024.sa.admin.module.business.wms.base.address.domain.vo.AddressVO
|
||||||
import net.lab1024.sa.admin.module.business.wms.base.address.service.AddressQueryService;
|
import net.lab1024.sa.admin.module.business.wms.base.address.service.AddressQueryService;
|
||||||
import net.lab1024.sa.admin.module.business.wms.base.address.service.AddressService;
|
import net.lab1024.sa.admin.module.business.wms.base.address.service.AddressService;
|
||||||
import net.lab1024.sa.admin.module.business.wms.base.item.domain.vo.ItemsExcelVO;
|
import net.lab1024.sa.admin.module.business.wms.base.item.domain.vo.ItemsExcelVO;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.excel.ExportTaskService;
|
||||||
import net.lab1024.sa.base.common.domain.RequestUser;
|
import net.lab1024.sa.base.common.domain.RequestUser;
|
||||||
import net.lab1024.sa.base.common.domain.ValidateList;
|
import net.lab1024.sa.base.common.domain.ValidateList;
|
||||||
import net.lab1024.sa.base.common.util.SmartExcelUtil;
|
import net.lab1024.sa.base.common.util.SmartExcelUtil;
|
||||||
|
|
@ -47,6 +49,9 @@ public class AddressController {
|
||||||
@Resource
|
@Resource
|
||||||
private AddressQueryService addressQueryService;
|
private AddressQueryService addressQueryService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ExportTaskService exportTaskService;
|
||||||
|
|
||||||
@Operation(summary = "分页查询 @author hj")
|
@Operation(summary = "分页查询 @author hj")
|
||||||
@PostMapping("/address/queryPage")
|
@PostMapping("/address/queryPage")
|
||||||
@SaCheckPermission("address:query")
|
@SaCheckPermission("address:query")
|
||||||
|
|
@ -91,7 +96,7 @@ public class AddressController {
|
||||||
|
|
||||||
@Operation(summary = "地址下拉查询")
|
@Operation(summary = "地址下拉查询")
|
||||||
@PostMapping("/address/queryAddress")
|
@PostMapping("/address/queryAddress")
|
||||||
public ResponseDTO<List<AddressEntity>> queryAddress(@RequestBody AddressSelect addressSelect) {
|
public ResponseDTO<PageResult<AddressVO>> queryAddress(@RequestBody @Valid AddressSelect addressSelect) {
|
||||||
return ResponseDTO.ok(addressQueryService.queryAddress(addressSelect));
|
return ResponseDTO.ok(addressQueryService.queryAddress(addressSelect));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -103,15 +108,23 @@ public class AddressController {
|
||||||
return addressService.importAddress(file);
|
return addressService.importAddress(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Operation(summary = "导出 霍锦")
|
@PostMapping("/address/createExportTask")
|
||||||
@GetMapping("/address/exportAddress")
|
public ResponseDTO<String> createExportTask() {
|
||||||
@SaCheckPermission("address:exportAddress")
|
String taskId = exportTaskService.createTask();
|
||||||
public void exportAddress(HttpServletResponse response) throws IOException {
|
return ResponseDTO.ok(taskId);
|
||||||
List<AddressExcelVO> addressList = addressQueryService.queryAddressExcel();
|
}
|
||||||
Long start = System.currentTimeMillis();
|
|
||||||
SmartExcelUtil.exportExcel(response, "收货地址信息.xlsx", "收货地址", AddressExcelVO.class, addressList);
|
|
||||||
Long end = System.currentTimeMillis();
|
|
||||||
System.out.println("导出耗时:" + (end - start));
|
|
||||||
|
|
||||||
|
@GetMapping("/address/progress/{taskId}")
|
||||||
|
public ResponseDTO<Long> getExportProgress(@PathVariable String taskId) {
|
||||||
|
Long progress = exportTaskService.getProgress(taskId);
|
||||||
|
return ResponseDTO.ok(progress);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Operation(summary = "导出 霍锦")
|
||||||
|
@GetMapping("/address/exportAddress/{taskId}")
|
||||||
|
@SaCheckPermission("address:exportAddress")
|
||||||
|
public void exportAddress(@PathVariable String taskId, HttpServletResponse response) {
|
||||||
|
System.out.println(exportTaskService.isTaskExists(taskId));
|
||||||
|
addressQueryService.exportAddress(taskId, response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
package net.lab1024.sa.admin.module.business.wms.base.address.dao;
|
package net.lab1024.sa.admin.module.business.wms.base.address.dao;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.lab1024.sa.admin.module.business.wms.base.address.domain.entity.AddressEntity;
|
import net.lab1024.sa.admin.module.business.wms.base.address.domain.entity.AddressEntity;
|
||||||
import net.lab1024.sa.admin.module.business.wms.base.address.domain.form.AddressQueryForm;
|
import net.lab1024.sa.admin.module.business.wms.base.address.domain.form.AddressQueryForm;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.base.address.domain.form.AddressSelect;
|
||||||
import net.lab1024.sa.admin.module.business.wms.base.address.domain.vo.AddressVO;
|
import net.lab1024.sa.admin.module.business.wms.base.address.domain.vo.AddressVO;
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
|
@ -34,10 +36,25 @@ public interface AddressDao extends BaseMapper<AddressEntity> {
|
||||||
*/
|
*/
|
||||||
List<AddressVO> queryPage(Page page, @Param("queryForm") AddressQueryForm queryForm);
|
List<AddressVO> queryPage(Page page, @Param("queryForm") AddressQueryForm queryForm);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下拉分页查询
|
||||||
|
*
|
||||||
|
* @param page
|
||||||
|
* @param addressSelect
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<AddressVO> queryAddress(Page page, @Param("addressSelect") AddressSelect addressSelect);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流式查询
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
@Select("SELECT name,person,telephone,address FROM t_address")
|
@Select("SELECT name,person,telephone,address FROM t_address")
|
||||||
@Options(fetchSize = 2000) // 每次拉取2000条
|
@Options(fetchSize = 2000)
|
||||||
Cursor<AddressVO> selectAllByCursor();
|
Cursor<AddressVO> selectAllByCursor();
|
||||||
|
|
||||||
|
//游标分页
|
||||||
List<AddressVO> listByCursor(@Param("lastId") Long lastId, @Param("pageSize") int pageSize);
|
List<AddressVO> listByCursor(@Param("lastId") Long lastId, @Param("pageSize") int pageSize);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,14 @@
|
||||||
package net.lab1024.sa.admin.module.business.wms.base.address.domain.form;
|
package net.lab1024.sa.admin.module.business.wms.base.address.domain.form;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import net.lab1024.sa.base.common.domain.PageParam;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class AddressSelect {
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
public class AddressSelect extends PageParam {
|
||||||
|
@Schema(description = "收货单位")
|
||||||
|
private String name;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
package net.lab1024.sa.admin.module.business.wms.base.address.domain.vo;
|
package net.lab1024.sa.admin.module.business.wms.base.address.domain.vo;
|
||||||
|
|
||||||
import cn.idev.excel.annotation.ExcelProperty;
|
import cn.idev.excel.annotation.ExcelProperty;
|
||||||
|
import cn.idev.excel.annotation.write.style.*;
|
||||||
|
import cn.idev.excel.enums.poi.FillPatternTypeEnum;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
|
|
@ -13,6 +15,7 @@ import java.time.LocalDateTime;
|
||||||
@Builder
|
@Builder
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
|
@ColumnWidth(20)
|
||||||
public class AddressExcelVO {
|
public class AddressExcelVO {
|
||||||
@ExcelProperty("收货单位")
|
@ExcelProperty("收货单位")
|
||||||
private String name;
|
private String name;
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ public interface AddressQueryService {
|
||||||
* @param addressSelect 入参
|
* @param addressSelect 入参
|
||||||
* @return List<AddressEntity>
|
* @return List<AddressEntity>
|
||||||
*/
|
*/
|
||||||
List<AddressEntity> queryAddress(AddressSelect addressSelect);
|
PageResult<AddressVO> queryAddress(AddressSelect addressSelect);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据地址id集合查询地址信息
|
* 根据地址id集合查询地址信息
|
||||||
|
|
@ -60,4 +60,6 @@ public interface AddressQueryService {
|
||||||
|
|
||||||
List<AddressExcelVO> queryAddressExcel3();
|
List<AddressExcelVO> queryAddressExcel3();
|
||||||
|
|
||||||
|
void exportAddress(String taskId,HttpServletResponse response);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,9 @@ package net.lab1024.sa.admin.module.business.wms.base.address.service.impl;
|
||||||
import cn.idev.excel.ExcelWriter;
|
import cn.idev.excel.ExcelWriter;
|
||||||
import cn.idev.excel.FastExcel;
|
import cn.idev.excel.FastExcel;
|
||||||
import cn.idev.excel.write.metadata.WriteSheet;
|
import cn.idev.excel.write.metadata.WriteSheet;
|
||||||
|
import cn.idev.excel.write.metadata.style.WriteCellStyle;
|
||||||
|
import cn.idev.excel.write.metadata.style.WriteFont;
|
||||||
|
import cn.idev.excel.write.style.HorizontalCellStyleStrategy;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
|
@ -18,16 +21,20 @@ import net.lab1024.sa.admin.module.business.wms.base.address.domain.vo.AddressVO
|
||||||
import net.lab1024.sa.admin.module.business.wms.base.address.manager.AddressManager;
|
import net.lab1024.sa.admin.module.business.wms.base.address.manager.AddressManager;
|
||||||
import net.lab1024.sa.admin.module.business.wms.base.address.service.AddressQueryService;
|
import net.lab1024.sa.admin.module.business.wms.base.address.service.AddressQueryService;
|
||||||
import net.lab1024.sa.admin.module.business.wms.base.item.domain.vo.ItemsExcelVO;
|
import net.lab1024.sa.admin.module.business.wms.base.item.domain.vo.ItemsExcelVO;
|
||||||
|
import net.lab1024.sa.admin.module.business.wms.excel.ExportTaskService;
|
||||||
import net.lab1024.sa.base.common.domain.PageResult;
|
import net.lab1024.sa.base.common.domain.PageResult;
|
||||||
import net.lab1024.sa.base.common.exception.BusinessException;
|
import net.lab1024.sa.base.common.exception.BusinessException;
|
||||||
import net.lab1024.sa.base.common.util.SmartPageUtil;
|
import net.lab1024.sa.base.common.util.SmartPageUtil;
|
||||||
import net.lab1024.sa.base.common.util.SmartResponseUtil;
|
import net.lab1024.sa.base.common.util.SmartResponseUtil;
|
||||||
import net.lab1024.sa.base.module.support.dict.constant.DictConst;
|
import net.lab1024.sa.base.module.support.dict.constant.DictConst;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.ibatis.cursor.Cursor;
|
import org.apache.ibatis.cursor.Cursor;
|
||||||
|
import org.apache.poi.ss.usermodel.IndexedColors;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
@ -43,6 +50,9 @@ public class AddressQueryServiceImpl implements AddressQueryService {
|
||||||
@Resource
|
@Resource
|
||||||
private AddressManager addressManager;
|
private AddressManager addressManager;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ExportTaskService exportTaskService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页查询
|
* 分页查询
|
||||||
*
|
*
|
||||||
|
|
@ -56,13 +66,15 @@ public class AddressQueryServiceImpl implements AddressQueryService {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 地址下拉查询
|
* 地址下拉分页查询
|
||||||
*
|
*
|
||||||
* @param addressSelect 入参
|
* @param addressSelect 入参
|
||||||
* @return List<AddressEntity>
|
* @return List<AddressEntity>
|
||||||
*/
|
*/
|
||||||
public List<AddressEntity> queryAddress(AddressSelect addressSelect) {
|
public PageResult<AddressVO> queryAddress(AddressSelect addressSelect) {
|
||||||
return addressManager.list();
|
Page<?> page = SmartPageUtil.convert2PageQuery(addressSelect);
|
||||||
|
List<AddressVO> list = addressDao.queryAddress(page, addressSelect);
|
||||||
|
return SmartPageUtil.convert2PageResult(page, list);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -197,5 +209,66 @@ public class AddressQueryServiceImpl implements AddressQueryService {
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void exportAddress(String taskId, HttpServletResponse response) {
|
||||||
|
System.out.println("开始读取地址数据...");
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
SmartResponseUtil.setDownloadFileHeader(response, "收货地址信息.xlsx", null);
|
||||||
|
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
|
||||||
|
headWriteCellStyle.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex());
|
||||||
|
|
||||||
|
WriteFont headWriteFont = new WriteFont();
|
||||||
|
headWriteFont.setFontName("宋体");
|
||||||
|
headWriteFont.setColor(IndexedColors.WHITE.getIndex());
|
||||||
|
headWriteCellStyle.setWriteFont(headWriteFont);
|
||||||
|
|
||||||
|
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
|
||||||
|
contentWriteCellStyle.setFillForegroundColor(IndexedColors.BLACK.getIndex());
|
||||||
|
|
||||||
|
HorizontalCellStyleStrategy horizontalCellStyleStrategy =
|
||||||
|
new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
|
||||||
|
|
||||||
|
try (ExcelWriter excelWriter = FastExcel.write(response.getOutputStream(), AddressExcelVO.class).registerWriteHandler(horizontalCellStyleStrategy).build()) {
|
||||||
|
WriteSheet writeSheet = FastExcel.writerSheet("收货地址信息").build();
|
||||||
|
//总条数
|
||||||
|
long total = addressManager.count();
|
||||||
|
// 初始化为最小ID-1
|
||||||
|
long lastId = 0;
|
||||||
|
// 根据测试调整
|
||||||
|
int pageSize = 2000;
|
||||||
|
//进度条
|
||||||
|
long processed = 0;
|
||||||
|
while (true) {
|
||||||
|
List<AddressVO> batch = addressDao.listByCursor(lastId, pageSize);
|
||||||
|
if (batch.isEmpty()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
List<AddressExcelVO> excelData = new ArrayList<>();
|
||||||
|
for (AddressVO address : batch) {
|
||||||
|
AddressExcelVO excelVO = AddressExcelVO.builder()
|
||||||
|
.name(address.getName())
|
||||||
|
.person(address.getPerson())
|
||||||
|
.telephone(address.getTelephone())
|
||||||
|
.address(address.getAddress())
|
||||||
|
.build();
|
||||||
|
excelData.add(excelVO);
|
||||||
|
}
|
||||||
|
excelWriter.write(excelData, writeSheet);
|
||||||
|
lastId = batch.stream().mapToLong(AddressVO::getAddressId).max().orElse(0);
|
||||||
|
processed += batch.size();
|
||||||
|
|
||||||
|
//计算进度条
|
||||||
|
long progress = processed * 100 / total;
|
||||||
|
exportTaskService.updateProgress(taskId, progress);
|
||||||
|
System.out.println("已处理:" + processed + "条数据,进度:" + progress + "%");
|
||||||
|
}
|
||||||
|
System.out.println("导出耗时:" + (System.currentTimeMillis() - startTime) + "ms");
|
||||||
|
excelWriter.finish();
|
||||||
|
exportTaskService.updateProgress(taskId, 100);
|
||||||
|
exportTaskService.cleanupTask(taskId);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new BusinessException("导出失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
package net.lab1024.sa.admin.module.business.wms.excel;
|
||||||
|
|
||||||
|
import jakarta.servlet.ServletOutputStream;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.ConcurrentMap;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Slf4j
|
||||||
|
public class ExportTaskService {
|
||||||
|
private final ConcurrentMap<String, Long> progressMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
public String createTask() {
|
||||||
|
String taskId = System.currentTimeMillis() + "-" + new Random().nextInt(1000000);
|
||||||
|
progressMap.put(taskId, 0L);
|
||||||
|
return taskId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isTaskExists(String taskId) {
|
||||||
|
return progressMap.containsKey(taskId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateProgress(String taskId, long progress) {
|
||||||
|
progressMap.put(taskId, progress);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getProgress(String taskId) {
|
||||||
|
return progressMap.getOrDefault(taskId, -1L);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cleanupTask(String taskId) {
|
||||||
|
progressMap.remove(taskId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
<!-- 查询结果列 -->
|
<!-- 查询结果列 -->
|
||||||
<sql id="base_columns">
|
<sql id="base_columns">
|
||||||
t_address.address_id,
|
t_address
|
||||||
|
.
|
||||||
|
address_id
|
||||||
|
,
|
||||||
t_address.name,
|
t_address.name,
|
||||||
t_address.person,
|
t_address.person,
|
||||||
t_address.telephone,
|
t_address.telephone,
|
||||||
|
|
@ -26,9 +29,20 @@
|
||||||
order by t_address.address_id desc
|
order by t_address.address_id desc
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="listByCursor" resultType="net.lab1024.sa.admin.module.business.wms.base.address.domain.vo.AddressVO">
|
<select id="queryAddress" resultType="net.lab1024.sa.admin.module.business.wms.base.address.domain.vo.AddressVO">
|
||||||
SELECT
|
SELECT
|
||||||
t_address.address_id,
|
<include refid="base_columns"/>
|
||||||
|
FROM t_address
|
||||||
|
<where>
|
||||||
|
<!--收货单位-->
|
||||||
|
<if test="addressSelect.name != null ">
|
||||||
|
AND t_address.name like concat(#{addressSelect.name},'%')
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="listByCursor" resultType="net.lab1024.sa.admin.module.business.wms.base.address.domain.vo.AddressVO">
|
||||||
|
SELECT t_address.address_id,
|
||||||
t_address.name,
|
t_address.name,
|
||||||
t_address.person,
|
t_address.person,
|
||||||
t_address.telephone,
|
t_address.telephone,
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,15 @@ import cn.idev.excel.FastExcel;
|
||||||
import cn.idev.excel.write.handler.SheetWriteHandler;
|
import cn.idev.excel.write.handler.SheetWriteHandler;
|
||||||
import cn.idev.excel.write.metadata.holder.WriteSheetHolder;
|
import cn.idev.excel.write.metadata.holder.WriteSheetHolder;
|
||||||
import cn.idev.excel.write.metadata.holder.WriteWorkbookHolder;
|
import cn.idev.excel.write.metadata.holder.WriteWorkbookHolder;
|
||||||
|
import cn.idev.excel.write.metadata.style.WriteCellStyle;
|
||||||
|
import cn.idev.excel.write.metadata.style.WriteFont;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePartName;
|
import org.apache.poi.openxml4j.opc.PackagePartName;
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
import org.apache.poi.openxml4j.opc.TargetMode;
|
import org.apache.poi.openxml4j.opc.TargetMode;
|
||||||
|
import org.apache.poi.ss.usermodel.IndexedColors;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFPictureData;
|
import org.apache.poi.xssf.usermodel.XSSFPictureData;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFRelation;
|
import org.apache.poi.xssf.usermodel.XSSFRelation;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
|
|
@ -42,6 +45,12 @@ public final class SmartExcelUtil {
|
||||||
public static void exportExcel(HttpServletResponse response, String fileName, String sheetName, Class head,Collection<?> data) throws IOException {
|
public static void exportExcel(HttpServletResponse response, String fileName, String sheetName, Class head,Collection<?> data) throws IOException {
|
||||||
// 设置下载消息头
|
// 设置下载消息头
|
||||||
SmartResponseUtil.setDownloadFileHeader(response, fileName, null);
|
SmartResponseUtil.setDownloadFileHeader(response, fileName, null);
|
||||||
|
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
|
||||||
|
headWriteCellStyle.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex());
|
||||||
|
WriteFont headWriteFont = new WriteFont();
|
||||||
|
headWriteFont.setFontName("宋体");
|
||||||
|
headWriteFont.setColor(IndexedColors.WHITE.getIndex());
|
||||||
|
headWriteCellStyle.setWriteFont(headWriteFont);
|
||||||
// 下载
|
// 下载
|
||||||
FastExcel.write(response.getOutputStream(), head)
|
FastExcel.write(response.getOutputStream(), head)
|
||||||
.autoCloseStream(Boolean.FALSE)
|
.autoCloseStream(Boolean.FALSE)
|
||||||
|
|
@ -49,6 +58,7 @@ public final class SmartExcelUtil {
|
||||||
.doWrite(data);
|
.doWrite(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通用单 sheet水印 导出
|
* 通用单 sheet水印 导出
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue