最近因为项目需要从文档读取数据进行存储,因此花了点时间对这个知识点进行了一些学习和总结,通过自己的学习使用心得,希望对大家有所帮助。关于POI的介绍,网上有很多大牛都介绍的很详细,读者有时间可以去看看,这里我只做应用层面的说明,帮助你快速掌握使用。
1.在原项目架构基础上导入以下所需maven配置。(非maven项目请自行下载jar包)
<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.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
2.读取表格实现方法
public void addDataByExeclImport(MultipartFile file) throws Exception {
if (file.exists()) { //判断文件是否存在
String[] split = file.getOriginalFilename().split("\\."); //获取文件的后缀名,"."是特殊字符,需要转化
Workbook wb; //定义文档对象
InputStream is = file.getInputStream();
if ("xls".equals(split[1])) { //xls,xlsx对文档对象的实现方式是不同的,需要不同对待
wb= new HSSFWorkbook(is);
}else if ("xlsx".equals(split[1])){
wb = new XSSFWorkbook(is);
}else {
System.out.println("文件类型错误");
return null;
}
Sheet sheet = wb.getSheetAt(0); //开始解析工作表(说明1,见后文)
int firstRowNum = sheet.getFirstRowNum(); //获取当前表格的第一行
int lastRowNum = sheet.getLastRowNum(); //获取当前表格的最后一行(说明2,见后文)
//遍历数据集
for (int rIndex = firstRowNum; rIndex <= lastRowNum; rIndex++) {
Row row = sheet.getRow(rIndex); // 获取当前行数据
if (row != null) {
int firstCellNum = row.getFirstCellNum(); //当前行的第一列
int lastCellNum = row.getLastCellNum(); //当前行的最后一列(说明3,见后文)
for (int cIndex = firstCellNum; cIndex < lastCellNum; cIndex++) {
row.getCell(cIndex).setCellType(Cell.CELL_TYPE_STRING); //设置列值类型,基本都为STRING型没问题
String value = row.getCell(cIndex).getStringCellValue(); //获取列值
System.out.println(value); //打印测试值
}
}
}
}
}
说明:
1.工作表:下面Sheet1,Sheet2...就是工作表,在方法里下标是从0开始的,如果你只有一个sheet,就选0读取当前工作表内容。
2.所谓最后一行,就是指数据不为空的最后一行。如图第6行是最后一行,哪怕只有1个值,空值第7行才不算进行数里。
3.最后一列概念如说明2。
特别说明:
如果数据存在合并单元格的情况,如下图取值需要注意。当按照行遍历数据的时候,第一行按照列读取数据是正常的,也就是第1行在读取B列的时候,会取到值为2,读B列的时候则为4。但是从第2行开始,往下所有在读取B,D两列的时候值为" ",这就需要自己根据需求处理。
以上就是关于POI对表格的基本操作,当然更复杂的操作还可以看POI文档。关于读取之后的操作大家根据自身需要来处理,就不扩展说了,希望以上内容能够对读者快速实现相关功能有所帮助。