java:excel文件读写一、poi初识
1 简介
1.由apache公司提供
2.java编写的免费开源的跨平台java api
3.Microsoft Office格式档案读和写的功能
优劣势:Jxl消耗小,图片和图形支持有限;Poi:功能更加完善。
2 Poi包结构
HSSF: 读写Microsoft Excel xls
XSSF: 读写Microsoft Excel OOXML xlsx
HWPF: 读写Microsoft Word doc
HSLF: 提供读写Microsoft PowerPoint
apache poi官网: https://poi.apache.org/components/index.html
3 依赖配置
依赖搜索:https://search.maven.org/
使用以前低版本的依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.17</version>
</dependency>
4 Poi封装的对象
XSSFWorkbook:工作簿
XSSFSheet:工作表
Row:行
Cell:单元格
5 案例
POI,API在线文档地址:https://poi.apache.org/apidocs/5.0/,或者低版本的https://poi.apache.org/apidocs/3.17/
5.1 从Excel文件读取数据
(1)创建工作簿
(2)获取工作表
(3)遍历工作表获得行对象
(4)遍历行对象获取单元格对象
(5)获得单元格中的值
下面使用根据文件名地址来构建工作簿对象:
XSSFWorkbook(java.lang.String path)
Constructs a XSSFWorkbook object given a file name.
新建:测试.xlsx文件,放入项目文件夹下:
获取工作表的API如下:
package com.xiaoxu.excel;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.IOException;
public class readExcel {
public static void main(String[] args) throws IOException {
//1.获取工作簿
XSSFWorkbook x=new XSSFWorkbook("D:\\java_auto_test\\src\\main\\java\\com\\xiaoxu\\data\\测试.xlsx");
//2.获取工作表
XSSFSheet sheet = x.getSheetAt(0);
//3.获取行
for (Row cells : sheet) {
//4.获取单元格
for (Cell cell : cells) {
//设置单元格内容的type
cell.setCellType(CellType.STRING);
//获取单元格中的内容
String value = cell.getStringCellValue();
System.out.println(value);
}
}
}
}
若没有设置:
//设置单元格内容的type
cell.setCellType(CellType.STRING);
执行抛错:
如果读取到的excel中的value为空,那么可以增加过滤(跳过)的操作:
修改测试.xlsx:
修改代码执行:
package com.xiaoxu.excel;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.IOException;
public class readExcel {
public static void main(String[] args) throws IOException {
//1.获取工作簿
XSSFWorkbook x=new XSSFWorkbook("D:\\java_auto_test\\src\\main\\java\\com\\xiaoxu\\data\\测试.xlsx");
//2.获取工作表
XSSFSheet sheet = x.getSheetAt(0);
//3.获取行
for (Row cells : sheet) {
//4.获取单元格
for (Cell cell : cells) {
//设置单元格内容的type
cell.setCellType(CellType.STRING);
//获取单元格中的内容
String value = cell.getStringCellValue();
if("".equals(value)){
continue;
}
System.out.println(value);
}
}
//释放资源
x.close();
}
}
执行:
去掉过滤,打开文件,执行代码(可知close释放资源时,文件不能打开,否则会抛错,且最后一行只有第一列才具有值,后面并没有输出空值):
顺便一提,获取sheet的name(根据索引获取),如果超过sheet的索引,会抛出IllegalArgument异常:
5.2 写入数据到Excel文件中
代码:
package com.xiaoxu.excel;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class WriteExcel {
public static void main(String[] args) throws IOException {
//1.创建工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
//2.创建工作表
XSSFSheet sheet = workbook.createSheet("工作表1");
//3.创建行
XSSFRow row = sheet.createRow(0);
//创建单元格
row.createCell(0).setCellValue("苹果");
row.createCell(1).setCellValue("梨子");
row.createCell(2).setCellValue("香蕉");
XSSFRow row2 = sheet.createRow(1);
row2.createCell(0).setCellValue("1.0");
row2.createCell(1).setCellValue("2.0");
row2.createCell(2).setCellValue("3.0");
//输出流
FileOutputStream out = new FileOutputStream("D:\\java_auto_test\\src\\main\\java\\com\\xiaoxu\\data\\测试2.xlsx");
workbook.write(out);
out.flush();
//释放资源
out.close();
workbook.close();
System.out.println("成功写入excel");
}
}
执行:
成功写入excel
同上方读取excel,写入excel也不能打开文件写入,否则抛出进程无法访问的异常。数据正常写入: