## 實踐環境 Win10 Java JDK1.8 ## 代碼實現 pom.xml配置 ```xml 4.0.0 com.shouke example 1.0 1.8 ${java.version} ${java.version} 4.1.2 org.apache.poi poi-ooxml ${p ...
實踐環境
Win10
Java JDK1.8
代碼實現
pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.shouke</groupId>
<artifactId>example</artifactId>
<version>1.0</version>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<poi.ooxml.version>4.1.2</poi.ooxml.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.ooxml.version}</version>
</dependency>
<dependencies>
</project>
讀取Excel
代碼實現
exmple.xml
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.util.Iterator;
public class JavaStudy {
public static void readExcel(String filePath) throws Exception {
//獲取文件流
FileInputStream inputStream = new FileInputStream(filePath);
//1.創建工作簿
Workbook workbook = new XSSFWorkbook(inputStream);
//2.得到Sheet表
// Sheet sheet = workbook.getSheet("Sheet1"); // 通過Sheet名稱獲取
Sheet sheet = workbook.getSheetAt(0); // 通過索引獲取 //獲取第1個Sheet表
//3.獲取行
Row row = sheet.getRow(0); // 獲取第1行 // 註意:行索引從0開始
System.out.println(sheet.getFirstRowNum()); // 獲取首行(內容行)索引 // 輸出:0
System.out.println(sheet.getLastRowNum()); // 獲取最後行(內容行)索引 // 輸出:5
//4.獲取單元格
Cell cell = row.getCell(0); // 獲取行的第0個元
//5.獲取單元格的值
System.out.println(getValue(cell)); // 輸出:姓名
System.out.println(row.getFirstCellNum()); // 獲取當前行第一個內容單元格索引 // 輸出:0
System.out.println(row.getLastCellNum()); // 獲取當前行最後內容單元格往後下一個單元格的索引 // 輸出:7 // 輸出值為:最後內容單元格索引+1
// 遍歷當前行內容化單元格
// 方法1:
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
cell = cellIterator.next();
System.out.println(cell);
}
// 方法2:
row.forEach(currCell -> {
System.out.print(currCell+", ");
System.out.println(currCell.getCellType());
});
// 遍歷獲取所有內容行單元格的值
for (int rowIndex=0; rowIndex<=sheet.getLastRowNum(); rowIndex++) {
row = sheet.getRow(rowIndex);
for(int colIndex=0; colIndex<row.getLastCellNum(); colIndex++) {
System.out.println(getValue(row.getCell(colIndex)));
}
}
inputStream.close();
}
public static Object getValue(Cell cell) {
//匹配類型數據
Object cellValue = null;
if (cell != null) { // 單元格未經過編輯的情況下,一定為null //cell為null的情況下,對空單元格調用API會導致上述for迴圈提前結束
CellType cellType = cell.getCellType(); // 獲取單元格數值類型
switch (cellType) {
case STRING: //字元串
System.out.print("String類型:");
cellValue = cell.getStringCellValue();
break;
case BOOLEAN: //布爾類型
System.out.print("Boolean類型:");
cellValue = cell.getBooleanCellValue();
break;
case BLANK: //空
System.out.print("BLANK類型:"); // 填寫值後,請清理掉值,從沒填過值,那麼cell=null,合併的單元格被當做一個單元格
break;
case NUMERIC: //數字(整數、小數、日期)
System.out.print("NUMERIC類型:");
if (DateUtil.isCellDateFormatted(cell)) { //日期
System.out.print("日期:");
cellValue = cell.getDateCellValue(); // cell.getDateCellValue() 返回Date類型數據
} else {
System.out.print("數字:");
cellValue = cell.getNumericCellValue();
System.out.println(1.0E50 == (Double) cellValue);
}
break;
case FORMULA:
System.out.print("公式類型:");
cellValue = cell.getCellFormula();
break;
case ERROR:
System.out.print("數據類型錯誤");
break;
}
} else {
System.out.println("cell為空");
}
return cellValue;
}
// 測試
public static void main(String[] args) {
try{
JavaStudy.readExcel("D:\\codePojects\\Study\\src\\main\\resource\\example.xlsx");
} catch (Exception e) {
}
}
}
補充說明
創建工作簿
POI創建工作簿的API有3種:
-
HSSFWorkbook
: 此API用於操作Excel 2003及之前的版本(文件擴展名.xls
),優點是導出速度快,缺點是導出的行數有局限性,最多為65535行,超出65536條後系統就會報錯。對記憶體消耗比較大,容易造成記憶體溢出(OOM)。 -
XSSFWorkbook
: 此API用於操作Excel 2007及往後的版本(文件擴展名.xlsx
),優點是導出的數據行數突破65535,最大可導出1048576行,缺點導出速度慢,對記憶體消耗比較大,容易造成記憶體溢出(OOM)。 -
SXSSFWorkbook
:POI3.8開始,新增此API,是XSSFWorkbook
API的相容流式擴展,主要解決當使用XSSFWorkbook
方式導出大數據量時,記憶體溢出的問題,支持導出大量的數據。其原理就是使用硬碟空間代替記憶體:僅保存最新的數據行在記憶體里供查看,在此之前的數據行都會被寫入到硬碟里(Windows電腦的話,是寫入到C盤根目錄下的temp文件夾)。被寫入到硬碟里的數據行是不可見的/不可訪問的。只有還保存在記憶體里的才可以被訪問到。
以XSSFWorkbook
API為例,可以通過多種方式來創建工作簿,常見用法如下:
//獲取文件流
FileInputStream inputStream = new FileInputStream(excelFilePath);
//創建工作簿
Workbook workbook = new XSSFWorkbook(inputStream);
// 或者
//創建文件
File file = new File(excelFilePath);
Workbook workbook = new XSSFWorkbook(file);
// 或者
Workbook workbook = new XSSFWorkbook(excelFilePath);
獲取單元格類型
CellType getCellType();
返回類型為CellType
,在org.apache.poi.ss.usermodel.CellType
中定義,它是一個枚舉類型,源碼如下:
public enum CellType {
@Internal(
since = "POI 3.15 beta 3"
)
_NONE(-1),
NUMERIC(0), // // 數字(整數、小數、日期)
STRING(1),
FORMULA(2), // 公式,即單元格內容通過公式計算出來
BLANK(3), // 為空//什麼時候會存儲空值,取決於所使用的表格軟體
BOOLEAN(4),
ERROR(5);
寫入Excel
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class JavaStudy {
public static void writeExcel(String filePath) throws IOException {
Workbook workbook = new XSSFWorkbook();
// Sheet sheet = workbook.createSheet();
Sheet sheet = workbook.createSheet("study"); // 創建Sheet時指定Sheet名詞
Row row = sheet.createRow(0); // 創建第1行
Cell firstCell = row.createCell(0); // 創建第1個單元格
firstCell.setCellValue("hello"); // 設置單元格的值
Cell secondCell = row.createCell(1); // 創建第2個單元格
secondCell.setCellValue("shouke");
row = sheet.createRow(1); // 創建第2行
firstCell = row.createCell(0, CellType.STRING); // 設置單元格的值和類型
firstCell.setCellValue("你好");
secondCell = row.createCell(1, CellType.NUMERIC); // 創建第2個單元格
secondCell.setCellValue(2023);
FileOutputStream fileOutputStream = new FileOutputStream(filePath); // 如果文件已存在,則覆蓋已有文件
workbook.write(fileOutputStream);
fileOutputStream.close();
workbook.close();
}
// 測試
public static void main(String[] args) {
try{
JavaStudy.writeExcel("D:\\codePojects\\Study\\src\\main\\resource\\result.xlsx");
} catch (Exception e) {
}
}
}
生成Excel文件內容如下:
作者:授客
微信/QQ:1033553122
全國軟體測試QQ交流群:7156436
Git地址:https://gitee.com/ishouke
友情提示:限於時間倉促,文中可能存在錯誤,歡迎指正、評論!
作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額隨意,您的支持將是我繼續創作的源動力,打賞後如有任何疑問,請聯繫我!!!
微信打賞
支付寶打賞 全國軟體測試交流QQ群