生成Excel文件并上传到阿里云OSS

代码

		@Resource
	    private ExcelUtils excelUtils;
		@Async("doSomethingExecutor")
        Future doCreateStockOutExcel(Date endTime, Date beginTime, Object storeNo) {
            List stockOutEoList = stockOutMapper.findByStoreNo(storeNo.toString(), beginTime, endTime);
            //生成记录在缺货报表列表
            if (EmptyUtil.notEmpty(stockOutEoList)) {
                //在内存中创建一个Excel文件
                XSSFWorkbook workbook = new XSSFWorkbook();
                sheetStockOut(workbook, stockOutEoList);
                String excelName = DateUtil.dateStr6(beginTime) + ".xls";
                String dir = storeNo.toString() + "/" + StockOutEo.EXCEL_DIR;
                String downloadUrl = aliOssUtils.putExcel(workbook, dir, excelName);
                createStockOutExcel(downloadUrl, storeNo.toString(), dir + "/" + excelName, 1);
            } else {
                createStockOutExcel(null, storeNo.toString(), null, 0);
            }
            return new AsyncResult(null);
        }
        
        private void sheetStockOut(XSSFWorkbook workbook, List stockOutEoList) {
        XSSFSheet sheet = workbook.createSheet("缺货报表");
        //创建行,0表示第一行
        XSSFRow row = sheet.createRow(0);
        //创建单元格,0表示第一个单元格
        row.createCell(0).setCellValue("缺货报表");
        XSSFRow row1 = sheet.createRow(1);
        ExcelUtils.setTableForm(row1, ExcelUtils.stockOutLists);
        excelUtils.setStockOutTableData(sheet, stockOutEoList);
    }

创建EXCEL工具类

@Component
public class ExcelUtils {

    @Resource
    private P360RequestUtils p360RequestUtils;

    @Resource
    private OsLog osLog;

    @Resource
    private RtisUtil rtisUtil;

    public static List collectRowLists = Arrays.asList("移动收银", "自助收银", "扫码购", "实体销售(不含实体POS收银机)", "屈臣氏云店", "到店业务", "到家业务", "平台销售", "总计");

    public static List collectLists = Arrays.asList("业务类型", "销售额", "会员销售额占比", "销售笔数", "客单价", "销售件数", "客单量", "OB销售额", "EB销售额", "OB销售额占比", "EB销售额占比", "会员卡销售量");
    public static List totalLists = Arrays.asList("订单编号", "订单日期", "订单实付金额", "销售人员", "商品编码", "商品明细", "销售数量", "商品含税销售金额", "订单状态", "退货数量");
    public static List detailLists = Arrays.asList("订单号", "订单日期", "订单渠道", "订单类型", "部门", "品牌", "货号", "商品名称", "数量", "销售金额", "实付金额", "销售人员");
    public static List stockOutLists = Arrays.asList("日期", " 商品编码", "名称", "条形编码", "20点实时库存", "盘点数量", "备注");

    public static void setTableForm(XSSFRow row, List tableFormList) {
        for (int index = 0; index < tableFormList.size(); index++) {
            row.createCell(index).setCellValue(tableFormList.get(index));
        }
    }

    public static void setCollectTableData(XSSFSheet sheet, int index, List dataList) {

    }

    public void setDetailTableData(XSSFSheet sheet, List dataList) {
        if (null != dataList && !dataList.isEmpty()) {
            for (int i = 0; i < dataList.size(); i++) {
                SaleDetailDTO saleDetailDTO = dataList.get(i);
                XSSFRow row = sheet.createRow(i + 2);
                row.createCell(0).setCellValue(saleDetailDTO.getItemNo());
                row.createCell(1).setCellValue(saleDetailDTO.getOrderTime());
                row.createCell(2).setCellValue(saleDetailDTO.getOrderChannel());
                row.createCell(3).setCellValue(saleDetailDTO.getOrderType());
                row.createCell(4).setCellValue(saleDetailDTO.getDepartment());
                row.createCell(5).setCellValue(saleDetailDTO.getBrand());
                row.createCell(6).setCellValue(saleDetailDTO.getItemNo());
                row.createCell(7).setCellValue(saleDetailDTO.getItemNameZht());
                row.createCell(8).setCellValue(saleDetailDTO.getOrderQty());
                row.createCell(9).setCellValue(saleDetailDTO.getOriginPrice().toString());
                row.createCell(10).setCellValue(saleDetailDTO.getActualPrice().toString());
                row.createCell(11).setCellValue(saleDetailDTO.getOptName());
            }
        }
    }

    /**
     * 设置缺货数据
     *
     * @param sheet    sheet
     * @param dataList dataList
     */
    public void setStockOutTableData(XSSFSheet sheet, List dataList) {
        if (null != dataList && !dataList.isEmpty()) {
            for (int i = 0; i < dataList.size(); i++) {
                StockOutEo stockOutDTO = dataList.get(i);
                XSSFRow row = sheet.createRow(i + 2);
                //日期
                row.createCell(0).setCellValue(DateUtil.dateStr2(stockOutDTO.getCreateTime()));
                //商品编码
                row.createCell(1).setCellValue(stockOutDTO.getItemNo());
                //名称
                row.createCell(2).setCellValue(stockOutDTO.getItemNameZht());
                //条形编码
                try {
                    AppointProductByItemResp appointProductByItemResp = p360RequestUtils.requestItemDetail(Arrays.asList(stockOutDTO.getItemNo()), stockOutDTO.getStoreNo());
                    if (EmptyUtil.notEmpty(appointProductByItemResp) && appointProductByItemResp.getSuccess()) {
                        ProductList data = appointProductByItemResp.getData();
                        if (EmptyUtil.notEmpty(data) && EmptyUtil.notEmpty(data.getProductList())) {
                            List productList = data.getProductList();
                            productList.forEach(a -> {
                                String barcode = a.getProductBase().getBarcode();
                                row.createCell(3).setCellValue(barcode);
                            });
                        }
                    }
                } catch (Exception e) {
                    osLog.error(ResultEnum.P360_GET_PRODUCT.getCode(), ResultEnum.P360_GET_PRODUCT.getMsg(), e);
                }
                //实时库存
                try {
                    AvaliableStock availableStock = rtisUtil.getAvailableStock(Arrays.asList(stockOutDTO.getItemNo()), Arrays.asList(stockOutDTO.getStoreNo()));
                    if (EmptyUtil.notEmpty(availableStock) && availableStock.getSuccess()) {
                        StoreList data = availableStock.getData();
                        if (EmptyUtil.notEmpty(data)) {
                            List storeList = data.getStoreList();
                            if (EmptyUtil.notEmpty(storeList)) {
                                row.createCell(4).setCellValue(storeList.get(0).getQty());
                            }
                        }
                    }
                } catch (Exception e) {
                    osLog.error(ResultEnum.RTIS_GET_PRODUCT.getCode(), ResultEnum.RTIS_GET_PRODUCT.getMsg(), e);
                }
                //盘点数量
                row.createCell(5).setCellValue("");
                //备注
                row.createCell(6).setCellValue("");
            }
        }
    }

}

OSS工具类

@Component
public class AliOssUtils {
    @Value("${oss.ali.endpoint:}")
    private String endpoint;
    @Value("${oss.ali.accessKeyId:}")
    private String accessKeyId;
    @Value("${oss.ali.accessKeySecret:}")
    private String accessKeySecret;
    @Value("${oss.ali.bucketName:}")
    private String bucketName;
    @Value("${oss.ali.domainUrl:}")
    private String domainUrl;

    @Resource
    private OsLog osLog;

    public OSS getOssClient() {
        // 创建OSSClient实例。
        return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }

    public String getDomainUrl() {
        return domainUrl;
    }

    /**
     * 上传excel
     *
     * @param workbook
     * @param dir       目录
     * @param excelName 文件名
     * @return
     */
    public String putExcel(XSSFWorkbook workbook, String dir, String excelName) {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            workbook.write(bos);
        } catch (IOException e) {
        } finally {
            try {
                bos.close();
            } catch (IOException e) {
            }
        }
        byte[] brray = bos.toByteArray();
        InputStream is = new ByteArrayInputStream(brray);
        OSS ossClient = getOssClient();
        try {
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, dir + "/" + excelName, is);
            // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
            // ObjectMetadata metadata = new ObjectMetadata();
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            // metadata.setObjectAcl(CannedAccessControlList.Private);
            // putObjectRequest.setMetadata(metadata);
            // 上传文件
            ossClient.putObject(putObjectRequest);
            //设置过期时间
            LocalDateTime time = LocalDateTime.now().plusDays(5);
            Date expiration = Date.from(time.atZone(ZoneId.systemDefault()).toInstant());
            return ossClient.generatePresignedUrl(bucketName, dir + "/" + excelName, expiration).toString();
        } catch (OSSException oe) {
            osLog.error(ResultEnum.SYS_ERROR.getCode(), ResultEnum.SYS_ERROR.getMsg(), oe.getErrorMessage());
        } catch (ClientException ce) {
            osLog.error(ResultEnum.SYS_ERROR.getCode(), ResultEnum.SYS_ERROR.getMsg(), ce.getErrorMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return null;
    }

    public void deleteExcel(String excelUrl) {
        if (EmptyUtil.notEmpty(excelUrl)) {
            OSS ossClient = getOssClient();
            try {
                boolean b = ossClient.doesObjectExist(bucketName, excelUrl);
                if (b) {
                    ossClient.deleteObject(bucketName, excelUrl);
                }
            } catch (OSSException oe) {
                osLog.error(ResultEnum.SYS_ERROR.getCode(), ResultEnum.SYS_ERROR.getMsg(), oe.getErrorMessage());
            } catch (ClientException ce) {
                osLog.error(ResultEnum.SYS_ERROR.getCode(), ResultEnum.SYS_ERROR.getMsg(), ce.getErrorMessage());
            } finally {
                if (EmptyUtil.notEmpty(ossClient)) {
                    ossClient.shutdown();
                }
            }
        }

    }
}

你可能感兴趣的:(后端,JAVA,开发工具,阿里云,java,云计算)