workbook字节流生成(springboot+grpc)

来源:互联网 发布:珠海知想科技官网 编辑:程序博客网 时间:2024/06/05 08:59

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:




                                             
0 0
原创粉丝点击