Apache-poi
POI是Apache软件基金会用Java编写的免费开源的跨平台的 Java API
Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
所以POI的主要功能是可以用Java操作Microsoft Office的相关文件
但是一般我们都是用来操作Excel相关文件。
但是一般我们都是用来操作Excel相关文件。
- HSSF一读写Microsoft Excel XLS
- XSSF一读写Microsoft Excel OOXML XLSX
- HWPF一读写Microsoft Word DOC
- HSLF一提供读写Microsoft PowerPoint
操作Excel文件区分版本: 2003版本(包含2003)以前的扩展名为.xls需要用HSSFWorkbook类操作 2007版本(包含2007)以后的扩展名为.xlsx需要用XSSFWorkbook类操作
工具类介绍
一个Excel文件。我们可以分为
POI中对应的操作类
操作类 | 描述 |
---|---|
XSSFWorkBook | 表示一个Excel文件,这个类主要操作后缀XLSX的excel文件 |
XSSFSheet | 表示一个Excel下的,一个工作页 |
Row | 表示一个工作页下的,一行数据 |
Cell | 表示一个行数据下的,一个单元格数据 |
操作类
这里只是展示部分,更多的操作,可以查看poi的官方文档
XSSFWorkBook(工作薄)
方法 | 描述 |
---|---|
new XSSFWorkBook() | 构造函数,根据传入 字符串:文件路径,文件流:文件File,等获取一个Excel整体 |
getSheetAt(0); | 根据下标获取,工作薄下的工作表Sheet对象 |
getSheet(""); | 根据 工作表名称 获取,工作薄下的工作表Sheet对象 |
Sheet(工作表)
方法 | 描述 |
---|---|
getLastRowNum() | 获取最后一个存在数据的行号,下标从0开始计算的。可以用于便利for-i循环 |
getRow() | 根据下表获取行对象 Row |
直接forEache | 可以快速的循环遍历操作 for(Row row : sheet ) |
Row(行数据)
方法 | 描述 |
---|---|
直接forEache | 可以快速的循环遍历操作 for(Cell cell: row) |
getCell() | 根据下表获取Cell对象,单元格数据 |
getRowNum() | 获取行号 |
Cell(单元格对象)
方法 | 描述 |
---|---|
getStringCellValue() | 获取单元格数据,返回String类型的 |
setCellType(CellType.STRING) | 设置单元格类型 |
getRow() | 获取所在行 |
读取操作
引入依赖
<!--用于解析Excel文件-->
<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>
展示我的Excel文件内容
展示代码
public class ReadExcelPoi {
public static void main(String[] args) {
readExcel("E:\TestFile\poiTest.xlsx");
}
/**
* 指定Excel文件路径打印文件内容
*
* @param excelPath excel的文件路径
*/
public static void readExcel(String excelPath) {
try {
File file = new File(excelPath);
//获得该文件的输入流
FileInputStream stream = new FileInputStream(file);
// 获取Excel 工作薄
Workbook sheets = new XSSFWorkbook(stream);
//获取一个工作表(sheet页),下标从0开始
Sheet sheet = sheets.getSheetAt(0);
// 遍历工作表中的所有行数据
for (int i = 0; i <= sheet.getLastRowNum(); i++) {
// 获取行数
Row row = sheet.getRow(i);
// 遍历工作表中的所有单元格数据
for (Cell cell : row) {
// 如果单元格是数值类型默认 会是 number 类型。所以这里设置单元格都是String类型
cell.setCellType(CellType.STRING);
// 打印所有的单元格数据
System.out.print(cell.getStringCellValue());
System.out.print(" ");
}
System.out.println();
}
//关流
sheets.close();
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
异常
Excel中的单元格是数值类型,默认是number类型
设置所有的单元格数据格式为 String类型
// 设置单元格类型为String类型
cell.setCellType(CellType.STRING);
写入操作
展示代码
public class ReadExcelPoi {
public static void main(String[] args) {
importExcel();
}
/**
* 将数据插入到指定Excel文件中
*/
public static void importExcel() {
try {
//创建工作簿 类似于创建Excel文件
XSSFWorkbook workbook = new XSSFWorkbook();
//创建 sheetname页名
XSSFSheet sheet = workbook.createSheet("员工信息");
sheet.setColumnWidth(3, 20 * 256);//给第3列设置为20个字的宽度
sheet.setColumnWidth(4, 20 * 256);//给第4列设置为20个字的宽度
//创建一行,下标从0开始
XSSFRow row = sheet.createRow(0);
//创建这行中的列,下标从0开始 (表头)
XSSFCell cell = row.createCell(0);
// 给cell 0下表赋值
cell.setCellValue("姓名");
//创建这行中的列,并给该列直接赋值
row.createCell(1).setCellValue("年龄");
row.createCell(2).setCellValue("性别");
row.createCell(3).setCellValue("生日");
row.createCell(4).setCellValue("手机号");
// 设置表里内容
row = sheet.createRow(1);
row.createCell(0).setCellValue("T");
row.createCell(1).setCellValue("保密");
row.createCell(2).setCellValue("男");
row.createCell(3).setCellValue("保密");
row.createCell(4).setCellValue("12121212121");
row = sheet.createRow(2);
row.createCell(0).setCellValue("T");
row.createCell(1).setCellValue("18");
row.createCell(2).setCellValue("女");
row.createCell(3).setCellValue("2000-01-01");
row.createCell(4).setCellValue("12121212122");
//设定 路径
File file = new File("E:\TestFile\info.xlsx");
FileOutputStream stream = new FileOutputStream(file);
// 需要抛异常
workbook.write(stream);
//关流
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
异常
这里选中的文件需要已存在
文件被其他进程使用,比如被工具打开,就会出现占用
重复操作,该操作是覆盖原Excel数据。不属于接着文件内容输入
重复操作,该操作是覆盖原Excel数据。不属于接着文件内容输入
关于文件的字符串 /
// 因为指定文件 \ 这个字符 属于java的转义符号
// 我们可以使用
String path = "E:\TestFile\info.xlsx";
String path1 = "E:/TestFile/info.xlsx";