POI導出Excel的兩種方法


目前我只會這兩種,以后掌握其他的方法再更新。

(關於頁面如何調用后台)

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM