workbook字节流生成(springboot+grpc)

springboot的controller层:

    @RequestMapping("/getOrderRankReportExcel")
    public void getOrderRankReportExcel(@RequestParam Long startDate,
                                        @RequestParam Long endDate,
                                        @RequestParam(required = false, defaultValue = "activeShopCount") String
                                                orderColumn,
                                        @RequestParam(required = false, defaultValue = "100") Integer topNum,
                                        @RequestParam(required = false, defaultValue = "0,2,999") String sysType,
                                        @RequestParam(required = false, defaultValue = "1") String groupByType,
                                        @RequestParam(required = false, defaultValue = "0") Integer isTestShopIncluded,
                                        HttpServletResponse response) throws
            Exception {
        ReportServiceOuterClass.OrderRankReportRequest.Builder builder = ReportServiceOuterClass.OrderRankReportRequest.newBuilder();

        builder.setStartDate(startDate);
        builder.setEndDate(endDate);
        builder.setOrderColumn(orderColumn);
        builder.setSysType(sysType);
        builder.setGroupByType(groupByType);
        builder.setIsTestShopIncluded(isTestShopIncluded);
        builder.setTopNum(topNum);

        setGroupByType(groupByType, builder);

        ReportServiceGrpc.ReportServiceBlockingStub blockingStub = getReportServiceBlockingStub();
		// 取得workbook字节流
        ReportServiceOuterClass.OrderRankReportExcelResponse grpcResponse = blockingStub
                .orderRankReportExcel(builder.build());
		// 生成excel到输出流
        String filename = "orderRankReportExcel.xlsx";

        byte[] bytes = grpcResponse.getData().getRecord().toByteArray();
        response.setContentType("application/x-msdownload");
        response.setContentLength(bytes.length);
        response.setHeader("Content-Disposition", "attachment;filename="
                + filename);
        response.getOutputStream().write(bytes);
    }

grpc的service接口:

    @Override
    public void orderRankReportExcel(ReportServiceOuterClass.OrderRankReportRequest request, StreamObserver<ReportServiceOuterClass.OrderRankReportExcelResponse> responseObserver) {
        try {
        	// 调用具体业务
            ReportServiceOuterClass.OrderRankReportExcelResponse response = reportService
                    .getOrderRankReportExcel(request);

            responseObserver.onNext(response);
            responseObserver.onCompleted();
        } catch (Exception e) {
            throw new StatusRuntimeException(Status.INTERNAL.withDescription(e.getMessage())
                    .withCause(e));
        }
    }

    public OrderRankReportExcelResponse getOrderRankReportExcel
            (OrderRankReportRequest request) throws IllegalAccessException, IOException {
        OrderRankReportExcelResponse.Builder builder = OrderRankReportExcelResponse.newBuilder();

        Common.ResponseHeader header = ErrorCodeUtil.generateHeader(MisErrorCode.SUCCESS);
        builder.setHeader(header);

        OrderRankReportExcelResponse.Data.Builder dataBuilder = OrderRankReportExcelResponse.Data.newBuilder();
		// 获得字节流
        ByteString byteString = getOrderRankReportExcelResponse(request);

        dataBuilder.setRecord(byteString);

        builder.setData(dataBuilder.build());

        return builder.build();
    }


核心代码(取得数据及生成workbook):

    private ByteString getOrderRankReportExcelResponse(OrderRankReportRequest request) throws IllegalAccessException, IOException {
    	// 获得数据(忽略)
        OrderRankReportResponse orderRankReportResponse = getOrderRankReportResponse(request);
        List<OrderRankReport> recordsList = orderRankReportResponse.getData().getRecordsList();

        List<OrderRankReportModel> recordModelList = new ArrayList<OrderRankReportModel>();
        for (OrderRankReport rankReport : recordsList) {
            OrderRankReportModel orderRankReportModel = ProtoConverter.messageToBean(rankReport, OrderRankReportModel.class);
            recordModelList.add(orderRankReportModel);
        }

		// 创建workbook
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet spreadsheet = workbook.createSheet("订单排行榜");

        Field[] fields = OrderRankReportModel.class.getDeclaredFields();

        List<Field> fieldList = remoteExcelNotShowField(fields);

        //填充表头
        XSSFRow row = spreadsheet.createRow(0);
        for (int cellId = 0; cellId < fieldList.size(); cellId++) {
            Field field = fieldList.get(cellId);
            field.setAccessible(true);
            XSSFCell cell = row.createCell(cellId);

            String displayName = getExcelDisplayName(field);

            cell.setCellValue(displayName);
        }

        //填充内容
        for (int rowId = 0; rowId < recordModelList.size(); rowId++) {
            row = spreadsheet.createRow(rowId + 1);

            OrderRankReportModel report = recordModelList.get(rowId);
            for (int cellId = 0; cellId < fieldList.size(); cellId++) {
                Field field = fieldList.get(cellId);
                field.setAccessible(true);
                XSSFCell cell = row.createCell(cellId);
                // 取出model对应域的值
                cell.setCellValue(field.get(report).toString());
            }
        }

		// 返回字节流
        return getWorkBookByteString(workbook);

    }

    private ByteString getWorkBookByteString(XSSFWorkbook workbook) {
        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
        	// workbook写入ByteArrayOutputStream进行转化
            workbook.write(out);
            ByteString byteString = ByteString.copyFrom(out.toByteArray());
            return byteString;
        } catch (IOException e) {
            throw new IllegalStateException("导出excel binary流关闭失败");
        }
    }


生成的excel:














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值