工具簡介
POI是Apache提供的一款用於處理Microsoft Office的插件,它可以讀寫Excel、Word、PowerPoint、Visio等格式的文件。
其中XSSF是poi對Excel2007(.xlsx)文件操作的Java實現,例如,我們可以使用它來實現產品中常見的導入導出功能。
XSSF的常用類:
|-XSSFWorkbook:Excel文檔對象
|-XSSFSheet:Excel的表單
|-XSSFRow:Excel的行
|-XSSFCell:Excel的單元格
|-XSSFCellStyle:Excel單元格的實現
|-XSSFCellHeader:Excel的表單頭部
|-XSSFCellFooter:Excel的表單尾部
使用工具導出的步驟
0. 導入jar包或添加依賴,主要是apache的poi和poi-ooxml;
1. 新建Excel文檔實例,並且在文檔實例中新建表單;
2. 添加標題,即在Excel表單中新建標題行,然后遍歷標題數據,對每一個數據都新建單元格,然后設置單元格的值,必要時設置樣式;
3. 添加內容,即遍歷內容數據,對每一條數據都新建行(主要不要覆蓋標題行),然后遍行數據,對每一個數據都新建單元格,設置單元格的值和樣式;
4. 返回Excel文檔實例,其他組件(例如controller)使用這個文檔進行輸出流操作,實現文件導出。
導出示例Demo
pom文件
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.0</version> </dependency>
自定義工具類
package cn.monolog.diana.excel.util; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.xssf.usermodel.*; /** * 自定義工具類,用於讀寫Excel2007文件 * created on 2019-05-21 */ public class ExcelUtil { /** * 獲取文檔 * @param sheetname 表單名 * @param title 標題欄 * @param content 內容 * @return */ public static XSSFWorkbook getWorkbook (String sheetname, String[] title, String[][] content) { //新建文檔實例 XSSFWorkbook workbook = new XSSFWorkbook(); //在文檔中添加表單 XSSFSheet sheet = workbook.createSheet(sheetname); //創建單元格格式,並設置居中 XSSFCellStyle style = workbook.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); //創建第一行,用於填充標題 XSSFRow titleRow = sheet.createRow(0); //填充標題 for (int i=0 ; i<title.length ; i++) { //創建單元格 XSSFCell cell = titleRow.createCell(i); //設置單元格內容 cell.setCellValue(title[i]); //設置單元格樣式 cell.setCellStyle(style); } //填充內容 for (int i=0 ; i<content.length ; i++) { //創建行 XSSFRow row = sheet.createRow(i+1); //遍歷某一行 for (int j=0 ; j<content[i].length ; j++) { //創建單元格 XSSFCell cell = row.createCell(j); //設置單元格內容 cell.setCellValue(content[i][j]); //設置單元格樣式 cell.setCellStyle(style); } } //返回文檔實例 return workbook; } }
controller組件
package cn.monolog.diana.excel.controller; import cn.monolog.diana.excel.util.ExcelUtil; import cn.monolog.diana.excel.model.Person; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 用於模擬導入導出組件 * created on 2019-05-21 */ @Controller @RequestMapping("/excel") public class ExcelController { /** * 導出 * @param response */ @RequestMapping(value = "/export") @ResponseBody public void export(HttpServletResponse response) throws ParseException { //獲取要導出的數據列表,在生產環境中要從數據庫中查詢,這里為了簡化,自己創建 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); Person p1 = new Person(182, "張叄", "建築", 25, simpleDateFormat.parse("2014-10-01")); Person p2 = new Person(205, "李肆", "結構", 30, simpleDateFormat.parse("2015-10-01")); Person p3 = new Person(311, "王伍", "給排水", 28, simpleDateFormat.parse("2016-10-01")); Person p4 = new Person(377, "趙陸", "電氣", 31, simpleDateFormat.parse("2017-10-01")); Person p5 = new Person(505, "蔣柒", "暖通", 26, simpleDateFormat.parse("2018-10-01")); List<Person> personList = new ArrayList<>(); personList.add(p1); personList.add(p2); personList.add(p3); personList.add(p4); personList.add(p5); //設置文件名、表單名、標題欄 String fileName = "員工信息表" + simpleDateFormat.format(new Date()) + ".xlsx"; String sheetname = "員工信息表"; String[] title = {"編號", "姓名", "專業", "年齡", "入職日期"}; //聲明表單內容 String[][] content = new String[personList.size()][title.length]; //遍歷要導出的數據列表,構造表單內容 for (int i=0 ; i<personList.size() ; i++) { //獲取表單第i行 String[] row = content[i]; //獲取對應的數據實例 Person person = personList.get(i); //填充內容 row[0] = String.valueOf(person.getId()); row[1] = person.getName(); row[2] = person.getMajor(); row[3] = String.valueOf(person.getAge()); row[4] = simpleDateFormat.format(person.getEnrollmentTime()); } //獲取文檔 XSSFWorkbook workbook = ExcelUtil.getWorkbook(sheetname, title, content); //聲明輸出流 OutputStream outputStream = null; //響應到客戶端 try { //設置響應頭 response.setContentType("application/octet-stream;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8") ); response.addHeader("Pargam", "no-cache"); response.addHeader("Cache-Control", "no-cache"); //獲取輸出流 outputStream = response.getOutputStream(); //用文檔寫輸出流 workbook.write(outputStream); //刷新輸出流 outputStream.flush(); } catch (Exception e) { e.printStackTrace(); } finally { //關閉輸出流 if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }