|
|
@ -3,9 +3,14 @@ package com.yxt.supervise.portal.biz.gdsalesreport; |
|
|
|
import cn.hutool.core.io.resource.ClassPathResource; |
|
|
|
import com.alibaba.excel.EasyExcel; |
|
|
|
import com.alibaba.excel.ExcelWriter; |
|
|
|
import com.alibaba.excel.converters.Converter; |
|
|
|
import com.alibaba.excel.util.ListUtils; |
|
|
|
import com.alibaba.excel.util.MapUtils; |
|
|
|
import com.alibaba.excel.write.builder.ExcelWriterBuilder; |
|
|
|
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder; |
|
|
|
import com.alibaba.excel.write.metadata.WriteSheet; |
|
|
|
import com.alibaba.excel.write.metadata.fill.FillConfig; |
|
|
|
import com.alibaba.excel.write.metadata.fill.FillWrapper; |
|
|
|
import com.sun.deploy.net.URLEncoder; |
|
|
|
import com.yxt.common.core.query.PagerQuery; |
|
|
|
import com.yxt.common.core.result.ResultBean; |
|
|
@ -13,6 +18,7 @@ import com.yxt.supervise.portal.api.gdsalesreport.*; |
|
|
|
import io.swagger.annotations.ApiOperation; |
|
|
|
import org.apache.catalina.connector.Response; |
|
|
|
import org.apache.commons.compress.utils.IOUtils; |
|
|
|
import org.apache.poi.ss.util.CellRangeAddress; |
|
|
|
import org.junit.Test; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.web.bind.annotation.PostMapping; |
|
|
@ -24,9 +30,10 @@ import javax.servlet.ServletOutputStream; |
|
|
|
import javax.servlet.http.HttpServletResponse; |
|
|
|
import java.io.IOException; |
|
|
|
import java.io.InputStream; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.text.SimpleDateFormat; |
|
|
|
import java.util.*; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
import static io.netty.handler.codec.smtp.SmtpRequests.data; |
|
|
|
|
|
|
@ -37,7 +44,8 @@ import static io.netty.handler.codec.smtp.SmtpRequests.data; |
|
|
|
@RestController |
|
|
|
@RequestMapping("/report") |
|
|
|
public class GdSalesReportRest { |
|
|
|
|
|
|
|
private static final String EXCEL_FILE_NAME="门店销售明细报表"+ System.currentTimeMillis() +".xlsx"; |
|
|
|
private static final String TEMPLATE_FILE_NAME="C:\\Users\\www19\\Desktop\\1.xlsx"; |
|
|
|
@Autowired |
|
|
|
GdSalesReportService gdSalesReportService; |
|
|
|
|
|
|
@ -50,138 +58,95 @@ public class GdSalesReportRest { |
|
|
|
@PostMapping("/exportStoreSalesReport") |
|
|
|
@ApiOperation(value = "门店销售明细报表") |
|
|
|
public void exportStoreSalesReport(@RequestBody PagerQuery<GdSalesReportQuery> pq, HttpServletResponse response) throws IOException { |
|
|
|
|
|
|
|
String excelFileName = "门店销售明细报表" + System.currentTimeMillis() + ".xlsx"; |
|
|
|
String templateFileName = "C:\\Users\\www19\\Desktop\\1.xlsx"; |
|
|
|
List<StoreSalesReportExcelVo> excelVos =gdSalesReportService.getAllStoreSalesReport(pq); |
|
|
|
//获取模板(模板你可以放在任何位置,前提是你能获取到。这里放在resource下)
|
|
|
|
response.setContentType( "application/vnd.ms-excel"); |
|
|
|
response.setCharacterEncoding("utf8"); |
|
|
|
response.setHeader("Content-disposition","attachment;filename="+ excelFileName); |
|
|
|
response.setHeader("Content-disposition","attachment;filename="+ EXCEL_FILE_NAME ); |
|
|
|
ServletOutputStream outputStream = response.getOutputStream(); |
|
|
|
try (ExcelWriter excelWriter = EasyExcel.write(excelFileName).withTemplate(templateFileName).build()) { |
|
|
|
WriteSheet writeSheet = EasyExcel.writerSheet().build(); |
|
|
|
//writeSheet.setSheetName("门店销售明细报表");
|
|
|
|
// 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
|
|
|
|
// forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
|
|
|
|
// 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
|
|
|
|
// 如果数据量大 list不是最后一行 参照下一个
|
|
|
|
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); |
|
|
|
List<StoreSalesReportExcelVo> excelVos = gdSalesReportService.getAllStoreSalesReport(pq); |
|
|
|
excelWriter.fill(excelVos, writeSheet); |
|
|
|
TotalSales totalSales=new TotalSales(); |
|
|
|
totalSales.setDate("2023-04-17"); |
|
|
|
totalSales.setSum("3"); |
|
|
|
totalSales.setStoreNum("100"); |
|
|
|
excelWriter.fill(totalSales,writeSheet); |
|
|
|
excelWriter.finish(); |
|
|
|
} |
|
|
|
|
|
|
|
List<CellRangeAddress> list = new ArrayList<>(); |
|
|
|
//new CellRangeAddress(开始行,结束行,开始列,结束列)
|
|
|
|
list.add(new CellRangeAddress(3, excelVos.size(), 1, 3)); |
|
|
|
// 创建ExcelWriterBuilder
|
|
|
|
ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(outputStream).withTemplate(TEMPLATE_FILE_NAME); |
|
|
|
ExcelWriter excelWriter = excelWriterBuilder.build(); |
|
|
|
// 创建writeSheet,并注册合并单元格handler
|
|
|
|
WriteSheet writeSheet = EasyExcel.writerSheet(0).registerWriteHandler(new MyHandler(0,list)).build(); |
|
|
|
// 填写配置,forceNewRow true表示自动创建一行,后面的数据后移
|
|
|
|
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); |
|
|
|
//填写数据
|
|
|
|
excelWriter.fill(excelVos, fillConfig, writeSheet); |
|
|
|
// 写入list之前的数据
|
|
|
|
Map<String, Object> map = new HashMap<String, Object>(); |
|
|
|
Date date = new Date(); |
|
|
|
SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd"); |
|
|
|
map.put("date",excelVos.get(1).getDate()); |
|
|
|
map.put("storeNum",excelVos.size()); |
|
|
|
map.put("number","mdxsmxb"+dateFormat.format(date)); |
|
|
|
excelWriter.fill(map, writeSheet); |
|
|
|
// list 后面还有个统计 想办法手动写入
|
|
|
|
// 这里偷懒直接用list 也可以用对象
|
|
|
|
List<List<String>> totalListList = ListUtils.newArrayList(); |
|
|
|
List<String> totalList = ListUtils.newArrayList(); |
|
|
|
totalListList.add(totalList); |
|
|
|
BigDecimal total=new BigDecimal("0"); |
|
|
|
for(StoreSalesReportExcelVo i:excelVos){ |
|
|
|
total=total.add(i.getSalesVolume()); |
|
|
|
} |
|
|
|
totalList.add(""); |
|
|
|
totalList.add(""); |
|
|
|
totalList.add(""); |
|
|
|
totalList.add("统计:"); |
|
|
|
totalList.add(String.valueOf(total)); |
|
|
|
// 这里是write 别和fill 搞错了
|
|
|
|
List<CellRangeAddress> list1 = new ArrayList<>(); |
|
|
|
//new CellRangeAddress(开始行,结束行,开始列,结束列)
|
|
|
|
list1.add(new CellRangeAddress(excelVos.size()+1, excelVos.size()+2, 0, 4)); |
|
|
|
WriteSheet writeSheet1 = EasyExcel.writerSheet(0).registerWriteHandler(new MyHandler(0,list1)).build(); |
|
|
|
excelWriter.write(totalListList,writeSheet1); |
|
|
|
//2
|
|
|
|
List<GoodsSalesReportExcelVo>goodsSalesReportExcelVos= gdSalesReportService.getAllGoodsSalesReport(pq); |
|
|
|
List<CellRangeAddress> Goodlist = new ArrayList<>(); |
|
|
|
WriteSheet writeSheetGood = EasyExcel.writerSheet(1).build(); |
|
|
|
// 填写配置,forceNewRow true表示自动创建一行,后面的数据后移
|
|
|
|
//FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
|
|
|
|
//填写数据
|
|
|
|
excelWriter.fill(goodsSalesReportExcelVos, fillConfig, writeSheetGood); |
|
|
|
// 写入list之前的数据
|
|
|
|
map.put("storeNum",goodsSalesReportExcelVos.size()); |
|
|
|
excelWriter.fill(map, writeSheet); |
|
|
|
// list 后面还有个统计 想办法手动写入
|
|
|
|
// 这里偷懒直接用list 也可以用对象
|
|
|
|
List<List<String>> totalListList1 = ListUtils.newArrayList(); |
|
|
|
List<String> totalList1 = ListUtils.newArrayList(); |
|
|
|
totalListList1.add(totalList1); |
|
|
|
|
|
|
|
for(GoodsSalesReportExcelVo i:goodsSalesReportExcelVos){ |
|
|
|
total=total.add(i.getTotal()); |
|
|
|
} |
|
|
|
totalList1.add(""); |
|
|
|
totalList1.add(""); |
|
|
|
totalList1.add(""); |
|
|
|
totalList1.add(""); |
|
|
|
totalList1.add(""); |
|
|
|
totalList1.add(""); |
|
|
|
totalList1.add("统计:"); |
|
|
|
totalList1.add(String.valueOf(total)); |
|
|
|
// 这里是write 别和fill 搞错了
|
|
|
|
List<CellRangeAddress> list7 = new ArrayList<>(); |
|
|
|
//new CellRangeAddress(开始行,结束行,开始列,结束列)
|
|
|
|
list7.add(new CellRangeAddress(excelVos.size()+1, excelVos.size()+2, 0, 4)); |
|
|
|
WriteSheet writeSheet7 = EasyExcel.writerSheet(1).registerWriteHandler(new MyHandler(0,list7)).build(); |
|
|
|
excelWriter.write(totalListList1,writeSheet7); |
|
|
|
|
|
|
|
|
|
|
|
//excelWriter.fill(totalList,writeSheet1);
|
|
|
|
excelWriter.finish(); |
|
|
|
outputStream.flush(); |
|
|
|
outputStream.close(); |
|
|
|
} |
|
|
|
@Test |
|
|
|
public void edd(){ |
|
|
|
|
|
|
|
String excelFileName = "门店销售明细报表" + System.currentTimeMillis() + ".xlsx"; |
|
|
|
String templateFileName = "C:\\Users\\www19\\Desktop\\1.xlsx"; |
|
|
|
//获取模板(模板你可以放在任何位置,前提是你能获取到。这里放在resource下)
|
|
|
|
// response.setContentType( "application/vnd.ms-excel");
|
|
|
|
// response.setCharacterEncoding("utf8");
|
|
|
|
// response.setHeader("Content-disposition","attachment;filename="+ excelFileName);
|
|
|
|
// ServletOutputStream outputStream = response.getOutputStream();
|
|
|
|
// try (ExcelWriter excelWriter = EasyExcel.write(excelFileName).withTemplate(templateFileName).build()) {
|
|
|
|
// WriteSheet writeSheet = EasyExcel.writerSheet("门店销售明细报表").build();
|
|
|
|
// // 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
|
|
|
|
// // forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
|
|
|
|
// // 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
|
|
|
|
// // 如果数据量大 list不是最后一行 参照下一个
|
|
|
|
// FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
|
|
|
|
// List<StoreSalesReportExcelVo> excelVos =new ArrayList<>();
|
|
|
|
// StoreSalesReportExcelVo storeSalesReportExcelVo=new StoreSalesReportExcelVo();
|
|
|
|
// storeSalesReportExcelVo.setStoreName("1231313");
|
|
|
|
// storeSalesReportExcelVo.setSalesVolume("1313");
|
|
|
|
// storeSalesReportExcelVo.setStoreNum("123132");
|
|
|
|
// storeSalesReportExcelVo.setDate("12313");
|
|
|
|
// excelVos.add(storeSalesReportExcelVo);
|
|
|
|
// excelWriter.fill(excelVos, writeSheet);
|
|
|
|
// //excelWriter.finish();
|
|
|
|
// }
|
|
|
|
|
|
|
|
// try (ExcelWriter excelWriter = EasyExcel.write(excelFileName).withTemplate(templateFileName).build()) {
|
|
|
|
// WriteSheet writeSheet = EasyExcel.writerSheet().build();
|
|
|
|
// WriteSheet writeSheet = EasyExcel.writerSheet("目录").registerWriteHandler(new LinkStyleHandler(linkMap)).build();
|
|
|
|
// // 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
|
|
|
|
// // forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
|
|
|
|
// // 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
|
|
|
|
// // 如果数据量大 list不是最后一行 参照下一个
|
|
|
|
// FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
|
|
|
|
// excelWriter.fill(data(), fillConfig, writeSheet);
|
|
|
|
// excelWriter.fill(data(), fillConfig, writeSheet);
|
|
|
|
// Map<String, Object> map = MapUtils.newHashMap();
|
|
|
|
// List<StoreSalesReportExcelVo> excelVos =new ArrayList<>();
|
|
|
|
// StoreSalesReportExcelVo storeSalesReportExcelVo=new StoreSalesReportExcelVo();
|
|
|
|
// storeSalesReportExcelVo.setStoreName("1231313");
|
|
|
|
// storeSalesReportExcelVo.setSalesVolume("1313");
|
|
|
|
// storeSalesReportExcelVo.setStoreNum("123132");
|
|
|
|
// storeSalesReportExcelVo.setDate("12313");
|
|
|
|
// excelVos.add(storeSalesReportExcelVo);
|
|
|
|
// writeSheet = EasyExcel.writerSheet("门店销售明细报表").build();
|
|
|
|
// excelWriter.fill(map, writeSheet);
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
//response.setContentType("application/vnd.ms-excel");
|
|
|
|
//setCharacterEncoding("utf-8");
|
|
|
|
//response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
|
|
|
|
// attachment这个代表要下载的,如果去掉就直接打开了(attachment-作为附件下载,inline-在线打开)
|
|
|
|
// excelFileName是文件名,另存为或者下载时,为默认的文件名
|
|
|
|
//response.setHeader("Content-disposition","attachment;filename=" + excelFileName + ".xlsx");
|
|
|
|
//response.setHeader("Content-Type","application/octet-stream;charset=utf-8");
|
|
|
|
|
|
|
|
InputStream templateInputStream = null; |
|
|
|
ExcelWriter excelWriter = null; |
|
|
|
WriteSheet userSheet = null; |
|
|
|
WriteSheet branchSheet = null; |
|
|
|
ServletOutputStream outputStream = null; |
|
|
|
|
|
|
|
// try {
|
|
|
|
// outputStream = response.getOutputStream();
|
|
|
|
// templateInputStream = couponOrderTemplateResource.getInputStream();
|
|
|
|
// } catch (IOException e) {
|
|
|
|
// log.error("获取模板失败");
|
|
|
|
// }
|
|
|
|
|
|
|
|
// 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
|
|
|
|
// forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
|
|
|
|
// 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
|
|
|
|
// 如果数据量大 list不是最后一行 参照下一个
|
|
|
|
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); |
|
|
|
List<StoreSalesReportExcelVo> excelVos =new ArrayList<>(); |
|
|
|
StoreSalesReportExcelVo storeSalesReportExcelVo=new StoreSalesReportExcelVo(); |
|
|
|
storeSalesReportExcelVo.setStoreName("1231313"); |
|
|
|
storeSalesReportExcelVo.setSalesVolume("1313"); |
|
|
|
//storeSalesReportExcelVo.setStoreNum("123132");
|
|
|
|
//storeSalesReportExcelVo.setDate("12313");
|
|
|
|
excelVos.add(storeSalesReportExcelVo); |
|
|
|
EasyExcel.write(excelFileName).withTemplate(templateFileName).sheet(1).doWrite(excelVos); |
|
|
|
|
|
|
|
//创建第一个sheet
|
|
|
|
userSheet = EasyExcel.writerSheet().build(); |
|
|
|
|
|
|
|
//填充
|
|
|
|
//excelWriter.fill(excelVos,fillConfig,userSheet);//员工基础信息
|
|
|
|
//excelWriter.fill(gradeAvgDTO,userSheet);//员工平均成绩
|
|
|
|
// //创建第二个sheet
|
|
|
|
// branchSheet = EasyExcel.writerSheet("部门信息").build();
|
|
|
|
// //填充
|
|
|
|
// excelWriter.fill(ftBranchDTOS,fillConfig,branchSheet);//部门基础信息
|
|
|
|
// excelWriter.fill(peopleSumDTO,branchSheet);//总人数
|
|
|
|
|
|
|
|
//关闭
|
|
|
|
//excelWriter.finish();
|
|
|
|
IOUtils.closeQuietly(templateInputStream); |
|
|
|
IOUtils.closeQuietly(outputStream); |
|
|
|
IOUtils.closeQuietly(excelWriter); |
|
|
|
public void publicExport(){ |
|
|
|
|
|
|
|
} |
|
|
|
@PostMapping("/getGoodsSalesReport") |
|
|
|