1.pom.xml中加入poi依賴:
<!-- poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.10-FINAL</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.10-FINAL</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.10-FINAL</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
2.創建導出excel文件模板;

3.controller層實現代碼:
@PostMapping("/excelCarrierOrder")
public ResponseEntity<Resource> excelCarrierOrder(@RequestBody Map<String,Object> params,HttpServletResponse response) throws IOException{
//列表數據
XSSFWorkbook workbook = carrierOrderService.excelCarrierOrder(params);
ByteArrayOutputStream os = new ByteArrayOutputStream();
workbook.write(os);
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0");
response.setHeader("charset", "utf-8");
// 當前日期,用於導出文件名稱
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String name =sdf.format(new Date()) + ".xlsx";
response.setHeader("Content-Disposition", "attachment;filename=\"" + URLEncoder.encode(name, "UTF-8") + "\"");
workbook.write(response.getOutputStream());
if (null != os) {
os.close();
}
return new ResponseEntity<Resource>(null, null, HttpStatus.OK);
}
4.service實現類實現代碼:
@Override
public XSSFWorkbook excelCarrierOrder(Map<String, Object> params) throws IOException {
//模板路徑
String path = "/templates/excel/訂單列表.xlsx";
XSSFWorkbook workboot = new XSSFWorkbook(this.getClass().getResourceAsStream(path));
//sheet頁(默認sheet1頁),也可通過workboot.createSheet("訂單列表")創建sheet頁
XSSFSheet sheetAt = workboot.getSheetAt(0);
//訂單基本表數據
List<CarrierOrderPojo> list = mapper.getExcelCarrierOrder(params);
//開始創建行和表格並且加入數據
//行
XSSFRow row;
int i = 0;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
if(null != list && !list.isEmpty()) {
for (CarrierOrderPojo dto : list) {
//根據訂單id查詢車輛信息
List<CarrierOrderTruck> truckList = truckMapper.getTruckList(dto.getId());
//根據訂單id查詢裝卸車費用
List<CarrierOrderServe> serveList = serveMapper.getServeList(dto.getId());
//根據訂單id查詢采購詳情
List<CarrierOrderDetail> detailList = detailMapper.getCarrierOrderDetailList(dto.getId());
String purchaseOrderNumber = "";
i += 1;
//創建行
row = sheetAt.createRow(i);
//承運商
if(null != dto.getCarrierName()) {
row.createCell(0).setCellValue(dto.getCarrierName());
}else {
row.createCell(0).setCellValue("");
}
//物流單號
if(null != dto.getLogisticsNumber()) {
row.createCell(1).setCellValue(dto.getLogisticsNumber());
}else {
row.createCell(1).setCellValue("");
}
//采購單號
if(null != detailList && !detailList.isEmpty()) {
for (CarrierOrderDetail detaildto : detailList) {
purchaseOrderNumber += detaildto.getPurchaseOrderNumber()+",";
}
row.createCell(2).setCellValue(purchaseOrderNumber.substring(0, purchaseOrderNumber.length()-1));
}else {
row.createCell(2).setCellValue("");
}
//發貨時間
if(null != dto.getTakingDate()) {
row.createCell(3).setCellValue(sdf.format(dto.getTakingDate()));
}else {
row.createCell(3).setCellValue("");
}
//到貨時間
if(null != dto.getDeliveryDate()) {
row.createCell(4).setCellValue(sdf.format(dto.getDeliveryDate()));
}else {
row.createCell(4).setCellValue("");
}
//總體積
if(null != dto.getTotalAllVolume()) {
row.createCell(5).setCellValue(dto.getTotalAllVolume()+"m³");
}else {
row.createCell(5).setCellValue("");
}
//箱型
if(null != truckList && !truckList.isEmpty()) {
for (CarrierOrderTruck truckdto : truckList) {
if("面包車".equals(truckdto.getTruckType())) {
row.createCell(6).setCellValue(truckdto.getTruckNumber()+"輛");
}else if("金杯車".equals(truckdto.getTruckType())){
row.createCell(7).setCellValue(truckdto.getTruckNumber()+"輛");
}else if("2米7平板".equals(truckdto.getTruckType())){
row.createCell(8).setCellValue(truckdto.getTruckNumber()+"輛");
}else if("3米8平板".equals(truckdto.getTruckType())){
row.createCell(9).setCellValue(truckdto.getTruckNumber()+"輛");
}else if("4米2平板".equals(truckdto.getTruckType())){
row.createCell(10).setCellValue(truckdto.getTruckNumber()+"輛");
}else if("4米2廂車".equals(truckdto.getTruckType())){
row.createCell(11).setCellValue(truckdto.getTruckNumber()+"輛");
}else if("4米2高欄".equals(truckdto.getTruckType())){
row.createCell(12).setCellValue(truckdto.getTruckNumber()+"輛");
}else if("6米8廂車".equals(truckdto.getTruckType())){
row.createCell(13).setCellValue(truckdto.getTruckNumber()+"輛");
}else if("6米8高欄".equals(truckdto.getTruckType())){
row.createCell(14).setCellValue(truckdto.getTruckNumber()+"輛");
}else if("7米6廂車".equals(truckdto.getTruckType())){
row.createCell(15).setCellValue(truckdto.getTruckNumber()+"輛");
}else if("9米6廂車".equals(truckdto.getTruckType())){
row.createCell(16).setCellValue(truckdto.getTruckNumber()+"輛");
}else if("9米6高欄".equals(truckdto.getTruckType())){
row.createCell(17).setCellValue(truckdto.getTruckNumber()+"輛");
}else if("12米5廂車".equals(truckdto.getTruckType())){
row.createCell(18).setCellValue(truckdto.getTruckNumber()+"輛");
}else if("13米高欄".equals(truckdto.getTruckType())){
row.createCell(19).setCellValue(truckdto.getTruckNumber()+"輛");
}else if("16米5廂車".equals(truckdto.getTruckType())){
row.createCell(20).setCellValue(truckdto.getTruckNumber()+"輛");
}else if("17米5廂車".equals(truckdto.getTruckType())){
row.createCell(21).setCellValue(truckdto.getTruckNumber()+"輛");
}
}
}
//送貨距離
if(null != dto.getDistance()) {
row.createCell(22).setCellValue(dto.getDistance()+"km");
}else {
row.createCell(22).setCellValue("");
}
//運輸費用
if(null != dto.getFreight()) {
row.createCell(23).setCellValue(dto.getFreight()+"元");
}else {
row.createCell(23).setCellValue("");
}
//裝貨費用,卸貨費用
if(null != serveList && !serveList.isEmpty()) {
for (CarrierOrderServe servedto : serveList) {
if("裝貨".equals(servedto.getServiceType())) {
row.createCell(24).setCellValue(servedto.getPrice()+"元");
}else if("卸貨".equals(servedto.getServiceType())){
row.createCell(25).setCellValue(servedto.getPrice()+"元");
}
}
}
//異常費用
if(null != dto.getOtherCost()) {
row.createCell(26).setCellValue(dto.getOtherCost()+"元");
}else {
row.createCell(26).setCellValue("");
}
//合計
if(null != dto.getTotalCost()) {
row.createCell(27).setCellValue(dto.getTotalCost()+"元");
}else {
row.createCell(27).setCellValue("");
}
//備注
if(null != dto.getCarrierRemark()) {
row.createCell(28).setCellValue(dto.getCarrierRemark());
}else {
row.createCell(28).setCellValue("");
}
}
}
return workboot;
}
5.項目中引入第2步創建的模板,要與Service實現類中path路徑對應:

6.效果:

7.XSSFWorkbook 做導出也可以不引入模板,通過workboot.createSheet("訂單列表")創建sheet頁,並設定表格樣式,可實現相同的效果。但是我覺得導入模板比較簡單,容易上手。
如有錯誤,請指出,謝謝!
