Java使用poi框架实现导入EXCEL文件
在Java开发工作中有很多地方用到excel导入功能,整理一下这方面的使用,以后有更好的方法会持续更新
本文章仅供产考,如有不符,欢迎留言指出。
思路分析:
1、首先获取文件并判断文件类型(.xls/.xlsx)
2、读取sheet表
3、动态读取每行每列
导入依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
解析Excel
package Excel;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import javax.sound.midi.Soundbank;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.*;
public class ExcelXml {
public static void main(String[] args) {
Workbook workbook=null;
Sheet sheet=null;//工作表
Row row=null;//行数
List<Map<String,String>> list=null;
String cellDate=null;//接收每个单元格的值
String filePath="C:\\Users\\Loner\\Desktop\\Retail_provision_20190130.xlsx";//文件路径
//String colums[]={"name","age","score"};//手动添加表头,改过后可以动态获取表头
workbook=readExcel(filePath);
if(workbook!=null){
list=new ArrayList<Map<String,String>>();
sheet=workbook.getSheetAt(0);//获取第一个sheet表格
int rownum=sheet.getPhysicalNumberOfRows();//获取最大行数
row=sheet.getRow(0);
int column=row.getPhysicalNumberOfCells();//获取最大列数
String[] cols=new String[column];
for (int i = 0; i < rownum; i++) {
Map<String,String> map=new LinkedHashMap<String,String>();
row=sheet.getRow(i);
if(row!=null){
for (int i1 = 0; i1 < column; i1++) {
cellDate=(String)getCellFormatValue(row.getCell(i1));//获取每个单元格的值
if(i==0){
cols[i1]=cellDate;//如果是第一行则获取表头
}else{
map.put(cols[i1],cellDate);//如果不是第一行则存入Map
}
}
}else{
break;
}
list.add(map);
}
}
for (Map<String,String> map : list){
for (Map.Entry<String,String> entry : map.entrySet()){
System.out.print(entry.getKey()+":"+entry.getValue()+",");
}
}
}
//读取Excel文件 filePath:文件路径
public static Workbook readExcel(String filePath){
Workbook workbook=null;
if(filePath==null){
return null;
}
//截取"."之后的字符
String extString=filePath.substring(filePath.lastIndexOf("."));
InputStream input=null;
try {
input=new FileInputStream(filePath);//输入流读取文件
//根据不同的后缀调用不同解析方法
if(".xls".equals(extString)){
return workbook= new HSSFWorkbook(input);
}else if(".xlsx".equals(extString)){
workbook=new XSSFWorkbook(input);
return workbook;
}else {
return workbook=null;
}
} catch (Exception e) {
e.printStackTrace();
}
return workbook;
}
//格式化单元格类型
//这里使用的3.14版本的poi,高版本的poi一下方法可能会过时,如使用高版本建议更换以下方法
public static Object getCellFormatValue(Cell cell){
Object cellValue=null;
if(cell!=null){
switch (cell.getCellType()){
case 0:{
cellValue=String.valueOf(cell.getNumericCellValue());
break;
}
case 2:{
if(DateUtil.isCellDateFormatted(cell)){
cellValue=cell.getDateCellValue();
}else{
cellValue=String.valueOf(cell.getNumericCellValue());
}
break;
}
case 1:{
cellValue=cell.getRichStringCellValue().getString();
break;
}
default:
cellValue="";
}
}else {
cellValue="";
}
return cellValue;
}
}