Java 读取Excel ( xls 和 xlsx 格式 )

在项目中遇到需要读取 Excel 中的数据 并导入 Word 中的需求,研究了一下在这里做个笔记

编写思路:

我这里使用的是 poi,其他读取 Excel 的工具也差不多都是这个思路

  • 把表格想象成一个二维数组,然后逐一遍历每一个对象。
  • 其实我根据感觉直接看 Excel 的格式更好理解,就是使用 Java 取出 第几行第几列的值而已 。
  • 这里容易忽略的问题就是一个 Excel 文件可能会有多个页签,首先要循环页签的数量,然后在循环每一个页签中的行和列。

环境准备:

  • 首先肯定是 Jar 包,我用的就是这些

  • 然后创建一个 Excel,写点字

开始写代码: (后面有完整代码)

判断文件格式:

读取两种 Excel 需要用的对象是不同的(有点坑)

读取 xls格式的文件需要使用 HSSFWorkbook;

读取 xlsx 格式的文件需要使用 XSSFWorkbook;

所以需要程序员手动判断一下  ========>

	//判断文件格式
    private static Workbook readExcel(String filePath){
        if(filePath==null){
            return null;
        }
        String extString = filePath.substring(filePath.lastIndexOf("."));
        
        try {
            InputStream is = new FileInputStream(filePath);
            if(".xls".equals(extString)){
                return new HSSFWorkbook(is);
            }else if(".xlsx".equals(extString)){
                return new XSSFWorkbook(is);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

获得某一个单元格的数据:

  • 然后我们就可以调用一下这个方法,得到相应的对象

           Workbook wb = readExcel(filePath);

  • 拿到对象之后就是我们的读取操作了,首先要知道这个 Excel 到底有多少个页签

           就是这个方法:wb.getNumberOfSheets();// 它是从1开始的

  • 然后是知道这个页签里面一共有多少行数据

            Sheet sheet = wb.getSheetAt(sheetNum);

            sheet.getLastRowNum();// 它是从0开始的。

  • 下一步要知道当前行有多少列

            Row row = sheet.getRow(rowNum);

            row.getLastCellNum();  // 它又是从1开始的

  • 到这里就可以取出某一格里面的数据了

           Cell cell = sheet.getRow(rowNum).getCell(cellNum);

完整代码:


import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadExcel {

	public static void main(String[] args) {
		Workbook wb = null;  
		Sheet sheet = null;
		Row row = null;

		String filePath = "F:\\1.xlsx";
		wb = readExcel(filePath);
		if (wb != null) {
			try {
				List<List<List<Object>>> list = new ArrayList<>();
				
				System.err.println("页签数量:" + wb.getNumberOfSheets());
				// 循环页签
				for (int sheetNum = 0; sheetNum < wb.getNumberOfSheets(); sheetNum++) {
					// 指定页签的值
					sheet = wb.getSheetAt(sheetNum);
					// 定义存放一个页签中所有数据的List
					List<List<Object>> sheetList = new ArrayList<>();
				
					System.err.println("行总数:" + sheet.getLastRowNum());
					// 循环行
					for (int rowNum = 0; rowNum <= sheet.getLastRowNum(); rowNum++) {
						// 指定行的值
						row = sheet.getRow(rowNum);
						// 定义存放一行数据的List
						List<Object> rowList = new ArrayList<>();
						// 循环列
						System.err.println("列总数:" + row.getLastCellNum());
						for (int cellNum = 0; cellNum < row.getLastCellNum(); cellNum++) {
							Cell cell = sheet.getRow(rowNum).getCell(cellNum);
							rowList.add(getStringCellValue(cell));
						}
						sheetList.add(rowList);
					}
					list.add(sheetList);
				}
				System.err.println(list.toString());
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	
	   //判断文件格式
    private static Workbook readExcel(String filePath){
        if(filePath==null){
            return null;
        }
        String extString = filePath.substring(filePath.lastIndexOf("."));
        
        try {
            @SuppressWarnings("resource")
			InputStream is = new FileInputStream(filePath);
            if(".xls".equals(extString)){
                return new HSSFWorkbook(is);
            }else if(".xlsx".equals(extString)){
                return new XSSFWorkbook(is);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
 
    
    
	@SuppressWarnings("deprecation")
	public static String getStringCellValue(Cell cell) {
		String cellvalue = "";
		if (cell == null) {
			return "";
		}
		switch (cell.getCellType()) {
		case Cell.CELL_TYPE_STRING:
			cellvalue = cell.getStringCellValue();
			break;
		case Cell.CELL_TYPE_NUMERIC:
			if (DateUtil.isCellDateFormatted(cell)) {
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				Date date = cell.getDateCellValue();
				cellvalue = sdf.format(date);
			} else {
				cellvalue = String.valueOf(cell.getNumericCellValue());
			}
			break;
		case Cell.CELL_TYPE_BOOLEAN:
			cellvalue = String.valueOf(cell.getBooleanCellValue());
			break;
		case Cell.CELL_TYPE_BLANK:
			cellvalue = "";
			break;
		default:
			cellvalue = "";
			break;
		}
		if (cellvalue == "") {
			return "";
		}
		return cellvalue;
	}
}

发布了34 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_36623327/article/details/89236029