POI的使用程式碼片段
阿新 • • 發佈:2018-12-03
@RequestMapping("/grossExcel") @ResponseBody public void grossExcel(Integer type, String id, String startime, String endtime, Integer value) throws Exception { // 進行資料的獲取 // 型別說明 1:本天 2:本週 3:本月 4:本年 5:自定義年 6:自定義月 7: 自定義天 ------------- 資料的獲取 ArrayList<Object> objects = null; if (type == 1 && "".equals(startime) && "".equals(endtime)) { objects = jtlService.tianonClickon(id); } else if (type == 2 && "".equals(startime) && "".equals(endtime)) { objects = jtlService.tianonClicktow(id); } else if (type == 3 && "".equals(startime) && "".equals(endtime)) { objects = jtlService.tianonClickyue(id); } else if (type == 4 && "".equals(startime) && "".equals(endtime)) { objects = jtlService.tianonClicknian(id); } else if (type == 5 && !"".equals(startime) && !"".equals(endtime)) { objects = jtlService.collectNianClick(id, startime, endtime); } else if (type == 6 && !"".equals(startime) && !"".equals(endtime)) { objects = jtlService.collectYueClick(id, startime, endtime); } else if (type == 7 && !"".equals(startime) && !"".equals(endtime)) { objects = jtlService.collectTianClick(id, startime, endtime); } List<Map<String, Object>> maps = new ArrayList<>(); Map<String, Object> hashMap = new HashMap<>(); if (value == 1) { // 型別 設定的是在下面獲取資料的時候,名稱和值 具體的資料 hashMap.put("time", getString(objects.get(0).toString())); hashMap.put("sxh", "上行"); hashMap.put("flowTotal", getString(objects.get(1).toString())); hashMap.put("tonsTotal", getString(objects.get(2).toString())); maps.add(hashMap); Map<String, Object> hashMap2 = new HashMap<>(); hashMap2.put("time", getString(objects.get(0).toString())); hashMap2.put("sxh", "下行"); hashMap2.put("flowTotal", getString(objects.get(3).toString())); hashMap2.put("tonsTotal", getString(objects.get(4).toString())); maps.add(hashMap2); } else if (value == 2) { // 總量 hashMap.put("time", getString(objects.get(0).toString())); hashMap.put("sxh", "合計"); hashMap.put("flowTotal", getString(objects.get(6).toString())); hashMap.put("tonsTotal", getString(objects.get(5).toString())); maps.add(hashMap); } // 標題下面的文字 List<String> headers = new ArrayList<>(); headers.add("查詢時間"); headers.add("上下行"); headers.add("流量總計(艘)"); headers.add("總準載噸位(噸)"); exportExcel(maps, headers, value); } private String getString(String objects) { int length = objects.length(); return objects.substring(1, length - 1); } /** * 匯出Excel * <p> * <p> * <p> * (船舶登記資料List) * <p> * (表頭) * * @return * @throws Exception * @author huangan */ @SuppressWarnings({"rawtypes", "deprecation"}) public void exportExcel(List<Map<String, Object>> data, List<String> headers, Integer value) throws Exception { //------------------首先建立工作簿 HSSFWorkbook workbook = new HSSFWorkbook(); // 生成一個表格標題 HSSFSheet sheet = null; if (value == 1) { sheet = workbook.createSheet("型別資料"); } else if (value == 2) { sheet = workbook.createSheet("總量資料"); } else { sheet = workbook.createSheet("彙總資料"); } // 生成一個樣式 HSSFCellStyle style = workbook.createCellStyle(); // 設定這些樣式 style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 生成並設定另一個樣式 表示的是內容的大小 HSSFCellStyle style2 = workbook.createCellStyle(); style2.setBorderBottom(HSSFCellStyle.BORDER_THIN); style2.setBorderLeft(HSSFCellStyle.BORDER_THIN); style2.setBorderRight(HSSFCellStyle.BORDER_THIN); style2.setBorderTop(HSSFCellStyle.BORDER_THIN); style2.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 設定標題下一列的文字的 第一個單元格的寬度 sheet.setColumnWidth(0, 12 * 256); // 設定標題下一列的文字的 其他單元格寬度 for (int index = 0; index < headers.size(); index++) { if (index != 2) { sheet.setColumnWidth(index, 20 * 256); } } sheet.setColumnWidth(2, 20 * 260); // 設定大的標題的資料 HSSFCellStyle style3 = workbook.createCellStyle(); style3.setAlignment(HSSFCellStyle.ALIGN_CENTER); style3.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); HSSFRow row1 = sheet.createRow(0); row1.setHeight((short) 600); // 標題字型的大小 HSSFFont font = workbook.createFont(); font.setFontHeightInPoints((short) 16); style3.setFont(font); // 單元格合併 用於合併單元格的 開始行 結束行 開始列 結束列 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3)); //設定標題資料 HSSFRichTextString string = null; // row1 表示第一行 然後建立第0列 HSSFCell cell1 = row1.createCell(0); if (value == 1) { string = new HSSFRichTextString("型別資料"); } else if (value == 2) { string = new HSSFRichTextString("總量資料"); } else { string = new HSSFRichTextString("彙總資料"); } // 建立的內容 cell1.setCellValue(string); // 建立的時候的樣式 cell1.setCellStyle(style3); // 建立第二行 HSSFRow row = sheet.createRow(1); // 第二行裡面的資料 for (short j = 0; j < headers.size(); j++) { HSSFCell cell = row.createCell(j); cell.setCellStyle(style); HSSFRichTextString text = new HSSFRichTextString(headers.get(j)); cell.setCellValue(text); } if (data.size() > 0) { // 取出的船舶首錄資料的條數 int cbslNumbet = data.size(); // 將樣式,資料,傳遞進行,進行表格的生成 loopCbdjData(data.size(), data, sheet, row, headers, style2); } HttpServletResponse response = response(); response.setContentType("application nd.ms-excel;charset=gb2312"); response.setCharacterEncoding("UTF-8"); // 下載的檔名稱 String queryName = ""; if (value == 1) { queryName = "流量彙總分析-型別資料"; } else if (value == 2) { queryName = "流量彙總分析-總量資料"; } else { queryName = "流量彙總分析"; } queryName = URLEncoder.encode(queryName, "UTF-8"); queryName += ".xls"; response.addHeader("Content-Disposition", "attachment;filename=" + new String(queryName.getBytes("UTF-8"), "GBK")); OutputStream out = response.getOutputStream(); workbook.write(out); out.close(); } @SuppressWarnings("rawtypes") public void loopCbdjData(int number, List<Map<String, Object>> data, HSSFSheet sheet, HSSFRow row, List<String> headers, HSSFCellStyle style2) throws Exception { for (int i = 0; i < number; i++) { Map mapCbdj = (Map) data.get(i); // 從第三行開始(第一行是空的,第二行是標題) row = sheet.createRow(i + 2); // 登記號 Object[] obj = new Object[headers.size()]; // 查詢時間 obj[0] = mapCbdj.get("time"); createCell(row, 0, obj[0].toString(), style2); // 上下行 obj[1] = mapCbdj.get("sxh"); createCell(row, 1, obj[1].toString(), style2); // 流量總計 obj[2] = mapCbdj.get("flowTotal"); createCell(row, 2, obj[2].toString(), style2); // 設定總準載噸位 obj[3] = mapCbdj.get("tonsTotal"); createCell(row, 3, obj[3].toString(), style2); } } //update by panqh 2017-05-10 end /** * 給單元格賦值 * * @param row * @param index * @param value * @param normalStyle */ private static void createCell(HSSFRow row, int index, String value, HSSFCellStyle normalStyle) { // 建立單元格 HSSFCell cell = row.createCell(index); // 給第一個單元格賦值 if (value != null) { cell.setCellValue(value); } else { cell.setCellValue(""); } // 設定Style cell.setCellStyle(normalStyle); } // add by shanggq 2018/10/8 end
本案例不能實現單元格內容的自適應寬 -- 有解決方法的請留言