Hello,大家好,我是Steafan,今天爲大家帶來如何使用POI操作Excel文件,話不多說,直入正題。
本片博文默認讀者已經搭建好了SpringBoot的架子,還沒有搭建springBoot的朋友,請先搭建好SpringBoot框架。
一、引入POI依賴
引入的POI依賴要和你的SpringBoot版本保持兼容,否則無法使用POI。
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
<scope>compile</scope>
</dependency>
二、Excel導出工具類封裝
工具類中幾乎每行都有對代碼的詳細解釋,這裏不再贅述。注意一下使用POI中各類引入的包,不要導錯包了。這個工具類最後是將處理好的Excel文件已流的形式輸出並提供給用戶下載,即當用戶點擊導出按鈕時會彈出下載框,供用戶下載,且文件名稱是用戶自定義的,格式爲Excel格式。
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
*
* @author steafan
*
*/
public class ExcelUtil {
/**
* 將條件數據寫入Excel並導出,提供文件下載
*
*/
public static void excelExport(HttpServletResponse response, String[] cellTitle,
List<Map<String, Object>> dataList, List<String> keyList) throws IOException {
// 取到所有數據,創建Excel
// 創建Excel文件
XSSFWorkbook myWorkbook = new XSSFWorkbook();
// 創建sheet
XSSFSheet excelSheet = myWorkbook.createSheet("sheet");
// 創建待用row
XSSFRow row = excelSheet.createRow(0);
XSSFCellStyle cellStyle = myWorkbook.createCellStyle();
// 創建一個居中格式
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
XSSFCell cell = null;
// 填充列名並設置樣式
for(int i = 0; i < cellTitle.length; i++) {
// 創建標題數量的單元格
cell = row.createCell(i);
// 填充該單元格數據爲列標題
cell.setCellValue(cellTitle[i]);
cell.setCellStyle(cellStyle);
}
Map map = null;
for(int i = 0; i < dataList.size(); i++) {
// 創建數據條數
row = excelSheet.createRow(i + 1);
map = dataList.get(i);
for(int j = 0; j < keyList.size(); j++) {
// 創建數據單元格數量
row.createCell(j).setCellValue(map.get(keyList.get(j)).toString());
}
}
// 將導出的Excel進行下載
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + "EXCELFILE" + ".xls");
response.flushBuffer();
OutputStream outputStream = response.getOutputStream();
myWorkbook.write(outputStream);
myWorkbook.close();
outputStream.flush();
outputStream.close();
}
}
三、導入Excel並對Excel中的數據進行解析工具類封裝
Excel導入是將Excel文件以輸入流的方式進行導入,即InputStream形式,注意一下使用POI中各類引入的包,不要導錯包了。
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.*;
public class ResolveExcel {
public static Map<String,List<List<String>>> getServerBasedSheetInfo(InputStream is, String suffix) throws Exception {
// 獲取到需要解析的Excel文件
Workbook workbook = getWorkbook(is, suffix);
Map<String,List<List<String>>> map = new HashMap<>();
// 獲取到需要解析的sheet頁,索引從0開始
Sheet sheet0 = workbook.getSheetAt(0);
List<List<String>> first = new ArrayList();
// 獲取一共有幾行
for (int i = 0; i <= sheet0.getLastRowNum(); i++) {
Row row = sheet0.getRow(i);
List<String> cellList = new ArrayList<>();
// 獲取所有單元格的數量
for (int j = 0; j <= row.getLastCellNum() - 1; j++) {
// 獲取每一行的所有單元格
if(row.getCell(j) != null) {
cellList.add(getCellValue(row.getCell(j)));
}else{
cellList.add(null);
}
}
first.add(cellList);
}
map.put("first",first);
return map;
}
// Excel中不同類型的值的處理
public static String getCellValue(Cell cell){
String cellValue = "未知類型";
switch (cell.getCellType()){
case Cell.CELL_TYPE_NUMERIC: //數字
cellValue = new DecimalFormat("#").format(cell.getNumericCellValue());
break;
case Cell.CELL_TYPE_STRING: //字符串
cellValue = String.valueOf(cell.getStringCellValue());
break;
case Cell.CELL_TYPE_BOOLEAN: //Boolean
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_FORMULA: //公式
cellValue = String.valueOf(cell.getStringCellValue());
break;
case Cell.CELL_TYPE_BLANK: //空值
cellValue = "";
break;
case Cell.CELL_TYPE_ERROR: //故障
cellValue = "非法字符";
break;
}
return cellValue;
}
// 獲取Excel統一方法封裝
public static Workbook getWorkbook(InputStream is, String suffix) throws IOException {
Workbook workbook = null;
if (suffix.equals(".xlsx")){
workbook = new XSSFWorkbook(is);
}else if (suffix.equals(".xls")){
workbook = new HSSFWorkbook(is);
}
return workbook;
}
}
有不懂的地方歡迎留言,我會及時回覆,感謝各位關注!!!