java 读取excel数据 poi导入excel 数据 java导入excel表格 java import excel
一、说明
1、在实际开发中,可能有需求需要将excel导入到业务系统中,具体实现可以使用Apache poi 来实现。
2、依赖pom如下:
<dependency>
<groupId></groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
二、代码实现
1、创建ExcelImport 类,实现excel数据导入
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* description: Excel 数据导入
* @version v1.0
* @author w
* @date 2020年3月30日下午9:46:27
**/
public class ExcelImport {
private ExcelImport INSTANSE = new ExcelImport();
/**
* excel 2003 suffix
*/
private static final String EXCEL_XLS_SUFFIX = ".xls" ;
/**
* excel 2007 或以上 suffix
*/
private static final String EXCEL_XLSX_SUFFIX = ".xlsx";
/**
* 分隔符 "."
*/
public static final String POINT = ".";
/**
* description: 读取excel数据
* @param file
* @return List<List<Object>>
* @version v1.0
* @author w
* @date 2020年3月31日 下午3:36:39
*/
public static List<List<Object>> importFile (File file) throws Exception{
if(file == null) {
return null ;
}
if(().endsWith(EXCEL_XLS_SUFFIX)) {
return readXls(new FileInputStream(file));
}
if(().endsWith(EXCEL_XLSX_SUFFIX)) {
return readXlsx(new FileInputStream(file));
}
throw new RuntimeException("文件不对,必须是excel文件,后缀名以:"+EXCEL_XLS_SUFFIX + " 或者 "+ EXCEL_XLSX_SUFFIX);
}
/**
* description: 导入excel --- 支持web
* @param fileName
* @param inputStream
* @throws Exception
* @return List<List<Object>>
* @version v1.0
* @author w
* @date 2020年3月31日 下午4:51:01
*/
public static List<List<Object>> importFile (MultipartFile multipartFile) throws Exception{
if(multipartFile == null) {
return null ;
}
if(().endsWith(EXCEL_XLS_SUFFIX)) {
return readXls(());
}
if(().endsWith(EXCEL_XLSX_SUFFIX)) {
return readXlsx(());
}
throw new RuntimeException("文件不对,必须是excel文件,后缀名以:"+EXCEL_XLS_SUFFIX + " 或者 "+ EXCEL_XLSX_SUFFIX);
}
/**
* description: 读取03版excel
* @param file
* @return List<List<Object>>
* @version v1.0
* @author w
* @date 2020年3月31日 下午3:38:44
*/
private static List<List<Object>> readXls(InputStream inputStream) throws Exception {
List<List<Object>> list = new ArrayList<>();
// 读取excel
HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
// 获取sheet 页数量
int sheets = ();
for(int num = 0 ; num < sheets ; num++ ) {
HSSFSheet sheet = (num);
if(null == sheet) {
continue ;
}
// sheet 页的总行数
int rows = ();
// startRow 开始读取的行数 --- 第二行开始读
for( int startRow = 1 ;startRow <= rows ; startRow ++) {
HSSFRow row = (startRow);
List<Object> rowList = new ArrayList<>();
if(null != row) {
// row 行中的 单元格总个数
short cells = ();
for(int x = 0 ; x <= cells ; x++) {
HSSFCell cell = (x);
if(null == cell) {
("");
}else {
(getXlsValue(cell));
}
}
(rowList);
}
}
}
return list;
}
/**
* description: 获取 03 版 excel数据
* @param cell
* @return String
* @version v1.0
* @author w
* @date 2020年3月31日 下午3:54:14
*/
private static String getXlsValue(HSSFCell cell) {
if ( () == cell.CELL_TYPE_BOOLEAN) {
return (());
} else if (() == cell.CELL_TYPE_NUMERIC) {
String cellValue = "";
if((cell)){
Date date = (());
cellValue = new SimpleDateFormat("yyyy/MM/dd").format(date);
}else{
DecimalFormat df = new DecimalFormat("#.##");
cellValue = (());
String strArr = ((POINT)+1,());
if(("00")){
cellValue = (0, (POINT));
}
}
return cellValue;
} else {
// 其他类型的值,统一设置为 string
// /ysughw/article/details/9288307
(Cell.CELL_TYPE_STRING);
return (());
}
}
/**
* description: 读取07或以上版本的 excel
* @param file
* @throws Exception
* @return List<List<Object>>
* @version v1.0
* @author w
* @date 2020年3月31日 下午4:01:25
*/
private static List<List<Object>> readXlsx(InputStream inputStream) throws Exception {
List<List<Object>> list = new ArrayList<>();
// 读取excel ,封装到 XSSFWorkbook 对象
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
int sheets = ();
for(int num = 0 ;num < sheets ; num++) {
XSSFSheet sheet = (num);
if(null == sheet) {
continue ;
}
// 获取sheet页的总行数
int rows = ();
for(int startRow = 1 ; startRow <= rows ; startRow++ ) {
// startRow 开始读取的行数, 从第二行开始读取
XSSFRow row = (startRow);
List<Object> rowList = new ArrayList<>();
if(null != row) {
// 获取行总单元格个数
short cells = ();
for(int x = 0 ; x < cells ; x++) {
XSSFCell cell = (x);
if(cell == null) {
("");
}else {
(getXlsxValue(cell));
}
}
(rowList);
}
}
}
return list;
}
/**
* description: 获取07或以上版本 excel 数据
* @param cell
* @return Object
* @version v1.0
* @author w
* @date 2020年3月31日 下午4:09:03
*/
private static Object getXlsxValue(XSSFCell cell) {
if (() == Cell.CELL_TYPE_BOOLEAN) {
return (());
} else if (() == Cell.CELL_TYPE_NUMERIC) {
String cellValue = "";
if ((cell)) {
Date date = (());
cellValue = new SimpleDateFormat("yyyy/MM/dd").format(date);
} else {
DecimalFormat df = new DecimalFormat("#.##");
cellValue = (());
String strArr = ((POINT) + 1, ());
if (("00")) {
cellValue = (0, (POINT));
}
}
return cellValue;
} else {
// 其他类型的值,统一设置为 string
// /ysughw/article/details/9288307
//(Cell.CELL_TYPE_STRING);
return (());
}
}
}
2、测试,直接本地测试 :
@Test
public void test() {
String path = "F:\\poi导出" ;
File file = new File(path);
try {
List<List<Object>> importFile = (file);
(importFile);
} catch (Exception e) {
();
}
}
3、查看控制中输出的数据和excel中的是否一致。
三、总结
1、本示例使用的是 poi 3.15版的,其他版本可能需要做部分调整。
2、对于导入excel数据类型转换,不一定考虑到全部,请根据实际业务情况调整。
3、web情况下导入,请自行创建页面测试,ExcelImport 类中已经提供对应的方法支持。
4、需要源码请私聊我,谢谢。
学习更多:
java 数据导出Excel java POI 导出数据Excel_HaHa_Sir的博客-****博客_java导出excel 空格