java 读取excel数据 poi导入excel 数据 java导入excel表格 java import excel

时间:2025-01-29 07:54:53

        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 空格