不按模板導出excel並合並單元格
阿新 • • 發佈:2018-07-19
odi com resp ast orm servlet adl xlsx ring
java代碼:
/** * 下載清單 * @param response * @param purchaseListQueryVo * @param request */ @RequestMapping(value = "/downloadList", method = RequestMethod.POST) public ResponseEntity<byte[]> downloadList(HttpServletResponse response, PurchaseListQueryVo purchaseListQueryVo, HttpServletRequest request) { ResponseEntity<byte[]> responseEntity = null; //獲取前臺額外傳遞過來的查詢條件 if(log.isDebugEnabled()){ log.debug("purchaseListQueryVo:{}",purchaseListQueryVo); } try { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); List<Map<String, Object>> postCheckList= purchaseListService.downloadList(getMap(purchaseListQueryVo)); String fileName = java.net.URLEncoder.encode("清單導出.xlsx", "UTF-8"); //生成EXCEL XLSX格式 this.exportData(postCheckList, byteArrayOutputStream,purchaseListQueryVo); //設置響應頭讓瀏覽器正確顯示下載 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentDispositionFormData("attachment", fileName); responseEntity = new ResponseEntity<>(byteArrayOutputStream.toByteArray(), headers, HttpStatus.OK); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return responseEntity; }
public void exportData(List<Map<String, Object>> postCheckList, OutputStream outputStream,PurchaseListQueryVo purchaseListQueryVo) { String orderStartTime = purchaseListQueryVo.getOrderStartTime().replace("-", "/").substring(0,10); String orderEndTime = purchaseListQueryVo.getOrderEndTime().replace("-", "/").substring(0,10); String header = null; if(Lang.isEmpty(purchaseListQueryVo.getOrderStartTime())||Lang.isEmpty(purchaseListQueryVo.getOrderEndTime())){ header = " 購貨清單"; }else{ header = orderStartTime + "-"+ orderEndTime + " 購貨清單"; } //EXCEL標題2018-04-26 List<String> titles = Arrays.asList(new String[]{"序號","太平訂單號/禮包賬單號", "總公司", "采購員/禮包創建員機構", "部門", "采購員/禮包創建員", "采購員/禮包創建員賬號","下單時間/賬單時間", "支付方式","應收憑證號","商品名稱","訂購數量","單價","商品總價","不含稅金額","稅額"}); //EXCEL列 List<List<Object>> rows = new ArrayList<>(); //從給定數據獲取指定列作為EXCEL列數據 for (Map<String, Object> map: postCheckList) { List<Object> row = new ArrayList<>(); //序號 row.add(map.get("ROWNUM")); //太平訂單號 row.add(map.get("ORDERNO")); //總公司 row.add(map.get("PARENTCOMPANY")); //采購員機構 row.add(map.get("INVOICENAME")); //部門 row.add(map.get("DEPARTMENT")); //采購員 row.add(map.get("REALNAME")); //采購員賬號 row.add(map.get("USERNAME")); //下單時間 row.add(map.get("DATECREATED")); //支付方式 row.add(map.get("PAYNAME")); //應收憑證號 row.add(map.get("VOUCHERNO")); //商品名稱 row.add(map.get("PRODUCTNAME")); //訂購數量 row.add(map.get("COUNT")); //單價 row.add(new BigDecimal(String.valueOf(map.get("SALEPRICE"))).setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString()); //商品總價 row.add(new BigDecimal(String.valueOf(map.get("COMMODITYAMOUNT"))).setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString()); //不含稅金額 row.add(new BigDecimal(String.valueOf(map.get("NOTAXAMOUNT"))).setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString()); //稅額 row.add(new BigDecimal(String.valueOf(map.get("TAXAMOUNT"))).setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString()); rows.add(row); } XSSFWorkbook xwb = excelService.purchaseListExcelForXLSX(header,titles, rows, "清單"); try { xwb.write(outputStream); outputStream.flush(); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } finally { try { xwb.close(); }catch (Exception e) { e.printStackTrace(); } } }
/** * 專業公司購貨清單生成Excel對象 * @param titles 表頭 * @param rows 數據行 * @param sheetName 工作表名 * @return */ public XSSFWorkbook purchaseListExcelForXLSX(String header,List<String> titles, List<List<Object>> rows, String sheetName) { XSSFWorkbook xwb = new XSSFWorkbook(); XSSFSheet sheet = xwb.createSheet(Lang.isEmpty(sheetName) ? "sheet1" : sheetName); //創建第一行頭部並設置行高及樣式 sheet.addMergedRegion(new CellRangeAddress(0,0,0,titles.size()-1)); XSSFRow row1 = sheet.createRow(0); row1.setHeight((short)600); //標題頭部樣式 //設置字體 XSSFFont fontHeader = xwb.createFont(); fontHeader.setFontName("宋體"); fontHeader.setFontHeightInPoints((short)16); fontHeader.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 字體加粗 XSSFDataFormat formatHeader = xwb.createDataFormat(); //設置單元格格式 XSSFCellStyle styleHeader = xwb.createCellStyle(); styleHeader.setFont(fontHeader); styleHeader.setDataFormat(formatHeader.getFormat("@")); //設置輸入格式為文本格式 styleHeader.setAlignment(XSSFCellStyle.ALIGN_CENTER); styleHeader.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER); styleHeader.setWrapText(true); XSSFCell cell1 = row1.createCell(0); cell1.setCellStyle(styleHeader); cell1.setCellValue(new XSSFRichTextString(header)); //創建第一行並設置行高 XSSFRow row = sheet.createRow(1); row.setHeight((short)400); //標題樣式設置 //設置字體 XSSFFont fontTitle = xwb.createFont(); fontTitle.setFontName("宋體"); fontTitle.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 字體加粗 fontTitle.setFontHeightInPoints((short)10); XSSFDataFormat format = xwb.createDataFormat(); //設置單元格格式 XSSFCellStyle styleTitle = xwb.createCellStyle(); styleTitle.setFont(fontTitle); styleTitle.setDataFormat(format.getFormat("@")); //設置輸入格式為文本格式 styleTitle.setAlignment(XSSFCellStyle.ALIGN_CENTER); styleTitle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER); styleTitle.setWrapText(true); //主體樣式設置 //設置字體 XSSFFont font = xwb.createFont(); font.setFontName("宋體"); font.setFontHeightInPoints((short)10); //設置單元格格式 XSSFCellStyle style = xwb.createCellStyle(); style.setFont(font); style.setDataFormat(format.getFormat("@")); //設置輸入格式為文本格式 style.setAlignment(XSSFCellStyle.ALIGN_LEFT); style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER); style.setWrapText(true); //設置單元格內容 int columnCount = titles.size(); for(int i = 0; i < columnCount; i++){ XSSFCell cell = row.createCell(i); cell.setCellStyle(styleTitle); cell.setCellValue(new XSSFRichTextString(titles.get(i))); if(i==0){ sheet.setColumnWidth(i, 1500); }else if(i==10){ sheet.setColumnWidth(i, 6000); }else{ sheet.setColumnWidth(i, 4000); } sheet.setDefaultColumnStyle(i, style); } Integer seqStartRow = null, seqColumn = 0; String seqPrevious = null; //太平訂單號 Integer orderNoStartrow = null, orderNoColumn = 1; String orderNoPrevious = null; //總公司 Integer parentcompanyStartrow = null, parentcompanyColumn = 2; String parentcompanyPrevious = null; //采購員機構 Integer invoicenameStartrow = null, invoicenameColumn = 3; String invoicenamePrevious = null; //部門 Integer departmentStartrow = null, departmentColumn = 4; String departmentPrevious = null; //采購員 Integer realnameStartrow = null, realnameColumn = 5; String realnamePrevious = null; //采購員賬號 Integer usernameStartrow = null, usernameColumn = 6; String usernamePrevious = null; //下單時間 Integer datecreatedStartrow = null, datecreatedColumn = 7; String datecreatedPrevious = null; //支付方式 Integer paynameStartrow = null, paynameColumn = 8; String paynamePrevious = null; //應收憑證號 Integer vouchernoStartrow = null, vouchernoColumn = 9; String vouchernoPrevious = null; Map<String, Object> returnMap; // 寫入數據行 XSSFCell cell; int rowIdx = 2; Map<Object, Integer> seqMap = new HashMap<>(); int seq = 0; String lastOrderNo = null; try { for(List<Object> dr : rows) { row = sheet.createRow(rowIdx); for(int di=0; di < dr.size(); di++) { if(di == 0) { if(seqMap.containsKey(dr.get(1))) { seq = seqMap.get(dr.get(1)); } else { seq++; seqMap.put(dr.get(1), seq); } } cell = row.createCell(di); cell.setCellStyle(style); String cellValue = ""; if(Lang.isEmpty(dr.get(di))){ cellValue = ""; }else{ cellValue = dr.get(di)+""; } if(rowIdx - 2 != rows.size()-1){ if(di == 0){ returnMap =createOrMargedCell(sheet,row,style,rowIdx,String.valueOf(seq),seqPrevious,seqStartRow,seqColumn, dr.get(1).equals(lastOrderNo)); seqPrevious = (String) returnMap.get("previousValue"); seqStartRow = (Integer) returnMap.get("startRow"); } else if(di == 1){ returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,orderNoPrevious,orderNoStartrow,orderNoColumn,true); orderNoPrevious = (String) returnMap.get("previousValue"); orderNoStartrow = (Integer) returnMap.get("startRow"); } else if(di == 2){ returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,parentcompanyPrevious,parentcompanyStartrow,parentcompanyColumn,dr.get(1).equals(lastOrderNo)); parentcompanyPrevious = (String) returnMap.get("previousValue"); parentcompanyStartrow = (Integer) returnMap.get("startRow"); } else if(di == 3){ returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,invoicenamePrevious,invoicenameStartrow,invoicenameColumn,dr.get(1).equals(lastOrderNo)); invoicenamePrevious = (String) returnMap.get("previousValue"); invoicenameStartrow = (Integer) returnMap.get("startRow"); } else if(di == 4){ returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,departmentPrevious,departmentStartrow,departmentColumn,dr.get(1).equals(lastOrderNo)); departmentPrevious = (String) returnMap.get("previousValue"); departmentStartrow = (Integer) returnMap.get("startRow"); } else if(di == 5){ returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,realnamePrevious,realnameStartrow,realnameColumn,dr.get(1).equals(lastOrderNo)); realnamePrevious = (String) returnMap.get("previousValue"); realnameStartrow = (Integer) returnMap.get("startRow"); } else if(di == 6){ returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,usernamePrevious,usernameStartrow,usernameColumn,dr.get(1).equals(lastOrderNo)); usernamePrevious = (String) returnMap.get("previousValue"); usernameStartrow = (Integer) returnMap.get("startRow"); } else if(di == 7){ returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,datecreatedPrevious,datecreatedStartrow,datecreatedColumn,dr.get(1).equals(lastOrderNo)); datecreatedPrevious = (String) returnMap.get("previousValue"); datecreatedStartrow = (Integer) returnMap.get("startRow"); } else if(di == 8){ returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,paynamePrevious,paynameStartrow,paynameColumn,dr.get(1).equals(lastOrderNo)); paynamePrevious = (String) returnMap.get("previousValue"); paynameStartrow = (Integer) returnMap.get("startRow"); } else if(di == 9){ returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,vouchernoPrevious,vouchernoStartrow,vouchernoColumn,dr.get(1).equals(lastOrderNo)); vouchernoPrevious = (String) returnMap.get("previousValue"); vouchernoStartrow = (Integer) returnMap.get("startRow"); }else{ cell.setCellValue(new XSSFRichTextString(cellValue)); } }else{ cell.setCellValue(new XSSFRichTextString(cellValue)); } } lastOrderNo = orderNoPrevious; rowIdx ++; } } catch (Exception e) { e.printStackTrace(); } return xwb; }
不按模板導出excel並合並單元格