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流关闭失败");
}
}