目前我只會這兩種,以后掌握其他的方法再更新。
(關於頁面如何調用后台)
1 var url = '你的后台路徑'; 2 $('<form method="post" action="' + url + '"></form>').appendTo('body').submit().remove();
第一種:用代碼畫出Excel,再導出。
優點:沒啥優點;
缺點:
1、代碼量大,難於維護。稍微改動一個地方就要更改很多代碼,所謂牽一發而動全身。
2、樣式難以控制,像哪里需要加粗、哪里需要背景色之類的,是比較難描述的。
操作步驟:
1、POM中添加POI的依賴,如圖:
2、創建Workbook對象,為其開辟堆棧內存,代碼:
Workbook workbook = new XSSFWorkbook();
3、創建表單,表單可以創建多個,這里只創建一個表單,代碼:
Sheet sheet = workbook.createSheet();
4、給表單設置名字,以下代碼中第一個參數是指第幾個表單的意思,如果你創建了兩個表單,現在要給第二個表單設置名字,那么第一個參數應該設置為1,因為索引都是從0開始計算的。我們現在給第一個表單設置名字,代碼:
workbook.setSheetName(0, "給我一個名字吧");// 表單名
5、創建行,我們這里以表頭示例,因為所有行的創建方法都是一樣的。參數代表創建第幾行,我們這里創建第一行,參數給0,同樣是因為索引都是從0開始計算。代碼:
Row headRow = sheet.createRow(0);//創建第一行
6、創建單元格,這里只創建一個單元格,因為所有單元格的創建方法都是一樣的,只是給的參數不同而已。代碼:
Cell headCell = headRow.createCell(0);//創建第一行的第一個單元格
7、給單元格設置樣式,代碼:
CellStyle headCellStyle = workbook.createCellStyle();//創建單元格樣式對象 Font font = workbook.createFont(); font.setBold(true);// 是否加粗 font.setFontHeightInPoints((short)14);// 字體大小 cellStyle.setFont(font); cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平居中 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中 headCell.setCellStyle(headCellStyle );//把設置好的樣式對象給單元格
8、給單元格插入值,代碼:
headCell.setCellValue("單元格的內容");
9、設置列寬,代碼:
sheet.setColumnWidth(1, headCell.getStringCellValue().getBytes().length * 256);// 設置列寬
sheet.createFreezePane(3, 4); // 凍結第四行第三列
10、合並單元格,這里我要在第一行合並9個單元格,所以代碼如下:
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 8));// 合並表頭 四個參數按順序釋義分別為:要合並的開始行索引、結束行索引、開始列索引、結束列索引
11、設置行高,代碼:
headRow.setHeightInPoints((2 * sheet.getDefaultRowHeightInPoints()));// 設置行高度
12、以上11個步驟是最基本的excel表單創建、行創建、單元格創建、合並、插入值等方法,具體要畫成什么模樣,使用上面的方法隨意發揮即可。接下來講如何寫入流並在瀏覽器中提示下載:
1 try { 2 Workbook workbook = new XSSFWorkbook(); 3 //省略Excel的繪制步驟 這些步驟就是以上11個步驟 4 File file = new File(System.getProperty("java.io.tmpdir") + File.separator + "文件名" + ".xlsx");// 提示下載文件 5 OutputStream out = new FileOutputStream(file); 6 workbook.write(out); 7 out.flush(); 8 out.close(); 9 HttpHeaders headers = new HttpHeaders(); 10 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); 11 headers.setContentDispositionFormData("attachment",StringUtils.newStringIso8859_1(StringUtils.getBytesUtf8(file.getName())))); 12 return new ResponseEntity<byte[]>(Files.toByteArray(file),headers, HttpStatus.CREATED); 13 } catch (FileNotFoundException e) { 14 e.printStackTrace(); 15 } catch (IOException e) { 16 e.printStackTrace(); 17 }
13、瀏覽器提示信息如下(這里用的谷歌瀏覽器導出):
14、至此方法一分享完畢。
第二種:使用模板導出Excel。
優點:
1、表單樣式都是模板提供的,不需要自己去調整。就算要修改樣式,使用微軟工具或者WPS修改后再替換項目中的模板即可,不需要代碼控制。
2、不用手動畫表格之類的,代碼精簡,可以把更多的精力用於數據填充上。
缺點:目前沒發現。
操作步驟:
1、POM中添加POI的依賴,如圖:
2、把需要導出的Excel文件模板放在web項目下,如圖:
3、獲取模板文件,並根據業務需求重命名文件名,代碼:
1 String path = ActionUtil.getRequest().getServletContext().getRealPath("/");// 拿到模板文件 2 String filePath = path + "excelTemplate\\模板文件名.xlsx"; 3 FileInputStream tps = new FileInputStream(new File(filePath)); 4 File file = new File(System.getProperty("java.io.tmpdir") + File.separator + "重新設置的文件名"+ ".xlsx");// 提示下載文件 5 OutputStream out = new FileOutputStream(file);
4、見代碼:
XSSFWorkbook workbook = new XSSFWorkbook();// 新建一個Excel的工作空間 workbook = new XSSFWorkbook(tps);// 把模板復制到新建的Excel
5、給表單填充數據,這里我們給第一個表單填充數據,代碼:
1 Sheet sheet = workbook.getSheetAt(0);//拿到第一個表單 2 Row row_01 = sheet.getRow(1);//拿到第一行 3 row_01.getCell(1).setCellValue("我是有內容的單元格了");//給第一行第二個單元格插入值
6、數據填充方法如同步驟5,根據需要給不同的行和單元格插入數據即可。接下來開始輸出並生成Excel文件,代碼:
1 workbook.write(out); 2 out.flush(); 3 out.close(); 4 HttpHeaders headers = new HttpHeaders(); 5 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); 6 headers.setContentDispositionFormData("attachment",StringUtils.newStringIso8859_1(StringUtils.getBytesUtf8(file.getName())))); 7 return new ResponseEntity<byte[]>(Files.toByteArray(file),headers, HttpStatus.CREATED);
7、步驟6的代碼需要處理異常,這個大家應該都知道怎么處理吧!不知道的話看方法一的步驟12。瀏覽器的下載提示和方法一的步驟13所示是一樣的。至此方法二分享完畢。
怎么樣?整體看下來是不是方法二更加簡單呢?反正我個人是偏向於方法二的!關於POI的相關API網址我在這里分享給大家,畢竟短短一篇博客不可能涵蓋所有的API方法的。
關於POI的更多探索,請參閱官網API:http://poi.apache.org/components/spreadsheet/quick-guide.html