1. 程式人生 > >不按模板導出excel並合並單元格

不按模板導出excel並合並單元格

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並合並單元格