Java-读取Excel

Posted LilyoO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java-读取Excel相关的知识,希望对你有一定的参考价值。

一、配置需要的jar包

1、需要在pom.xml中配置需要使用的包:org.apache.poi

    <!--poi-->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>3.10-FINAL</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>3.10-FINAL</version>
    </dependency>
    <!--poi-end-->

2、配置完成后,点击Maven-install,Maven会自动下载包

二、准备一个Excel,数据如下

三、第一种实现方式:使用List<List<String>>来存放读取的数据

1、创建一个java类:ExcelUtil

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;

import java.io.*;
import java.util.*;

public class ExcelUtil {
    Member member = new Member();

    public static List<List<String>> getExcel(String filePath, String sheetName) {
        List<List<String>> dataList = new ArrayList<>();//用来存放从Excel中读取的数据
        Workbook wb = null;
        try {
            InputStream is = new FileInputStream(filePath);//打开Excel文件
            wb = WorkbookFactory.create(is);//创建一个Workbook对象
            is.close();//关闭输入流
            if (wb != null) {
                Sheet sheet = wb.getSheet(sheetName);//根据sheet页的名字来获取sheet对象
                //Sheet sheet = wb.getSheetAt(0);//获取下标为0的sheet页
                int maxRownum = sheet.getLastRowNum();//获取的是最后一行的编号(编号从0开始)。
                //int maxRownum = sheet.getPhysicalNumberOfRows();//获取的是物理行数,也就是不包括那些空行(隔行)的情况。
                Row firstRow = sheet.getRow(0);//获取第一行的row对象
                int maxColnum = firstRow.getPhysicalNumberOfCells();//获取第一行的最大列的下标
                System.out.println(maxColnum);
                for (int i=0;i<=maxRownum;i++){//循环行
                    List<String> list = new ArrayList<>();//创建一个list用来存放每一行的值
                    String estr ="";//用来存放单元格的值
                    for (int j=0;j<maxColnum;j++){//循环列
                        if (sheet.getRow(i).getCell(j) != null) {//判断单元格是否为空
                            estr = sheet.getRow(i).getCell(j).toString();//取出这个单元格的值
                        }else {
                            estr="";
                        }
                        //System.out.println(firstColumns+"---"+estr);
                        list.add(estr);//把单元格的值放到list里
                    }
                    dataList.add(list);//list添加到list里
                }
                //System.out.println(dataList);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return dataList;//返回list
    }
}

2、写一个ExcelTest类来测试

import java.util.List;

public class ExcelTest {
    public static void main(String[] args) {
        String filePath = "/Users/renli/PycharmProjects/untitled/testFile/SendCredit.xlsx";//Excel存放的路径(我的电脑是macbook所以没有盘符)
        String sheetName = "Sheet1";//需要获取的sheetName
        List<List<String>> rows = ExcelUtil.getExcel(filePath, sheetName);//调用getExcel方法,获取到一个List<List<String>>
        //System.out.println(rows);
        //System.out.println(rows.size());

        for (List<String> list:rows) {
            System.out.println(list.get(0) + "---->" + list);
            int i = 0;
            for (String s : list) {
                System.out.println("测试编码为 " + list.get(0) + " 的第 " + (i + 1) + " 个值:" + s);
                i++;
            }
        }
    }
}

执行结果

三、第二种实现方式:使用Map<String, List<String>>来存放读取的数据

1、创建一个java类:ExcelUtil

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
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.ss.usermodel.WorkbookFactory;

import java.io.*;
import java.util.*;

public class ExcelUtil {

    public static Map<String, List<String>> getExcel(String filePath, String sheetName) {
        Map<String, List<String>> dataList = new HashMap<>();//用来存放从Excel中读取的数据
        Workbook wb = null;
        try {
            InputStream is = new FileInputStream(filePath);//打开Excel文件
            wb = WorkbookFactory.create(is);//创建一个Workbook对象
            is.close();//关闭输入流
            if (wb != null) {
                Sheet sheet = wb.getSheet(sheetName);//根据sheet页的名字来获取sheet对象
                //Sheet sheet = wb.getSheetAt(0);//获取下标为0的sheet页
                //int rows = sheet.getLastRowNum();//获取的是最后一行的编号(编号从0开始)。
                int maxRownum = sheet.getPhysicalNumberOfRows();//获取的是物理行数,也就是不包括那些空行(隔行)的情况。
                Row firstRow = sheet.getRow(0);//获取第一行的row对象
                int maxColnum = firstRow.getPhysicalNumberOfCells();//获取第一行的最大列的下标
                //System.out.println(maxColnum);
                for (int i=0;i<maxRownum;i++){//循环行
                    List<String> list = new ArrayList<>();//创建一个list用来存放每一行的值
                    String firstColumns = sheet.getRow(i).getCell(0).toString();//获取每一行的第一列的值,用来做map的Key
                    String estr ="";//用来存放单元格的值
                    for (int j=0;j<maxColnum;j++){//循环列
                        if (sheet.getRow(i).getCell(j) != null) {//判断单元格是否为空
                            estr = sheet.getRow(i).getCell(j).toString();//取出这个单元格的值
                        }else {
                            estr="";
                        }
                        //System.out.println(firstColumns+"---"+estr);
                        list.add(estr);//把单元格的值放到list里
                    }
                    dataList.put(firstColumns,list);//把list存放到map里
                }
                //System.out.println(dataList);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return dataList;//返回map
    }
}

2、写一个ExcelTest类来测试

import java.util.List;
import java.util.Map;

public class ExcelTest {
    public static void main(String[] args) {
        String filePath = "/Users/renli/PycharmProjects/untitled/testFile/SendCredit.xlsx";//Excel存放的路径(我的电脑是macbook所以没有盘符)
        String sheetName = "Sheet1";//需要获取的sheetName
        Map<String, List<String>> rows = ExcelUtil.getExcel(filePath, sheetName);//调用getExcel方法,获取到一个Map<String, List<String>>
        //System.out.println(rows);
        //System.out.println(rows.size());

        //第一种方式:推荐,尤其是容量大时
        System.out.println("\\n通过Map.entrySet遍历key和value");
        for (Map.Entry<String, List<String>> entry : rows.entrySet()) {
            String key = entry.getKey();
            List<String> list = entry.getValue();
            System.out.println(key + "---->" + list);
            int i = 0;
            for (String s : list) {
                System.out.println("测试编码为 " + key + " 的第 " + (i + 1) + " 个值:" + s);
                i++;
            }
        }

        //第二种方式:普通使用,二次取值(性能差)
        System.out.println("\\n通过Map.keySet遍历key和value:");
        for (String key : rows.keySet()) {//取出Map中所有的Key的值,遍历
            System.out.println(key + "---->" + rows.get(key));
            List<String> list = rows.get(key);//取出Map中Key为key的value的值,赋值给一个list
            for (int i = 0; i < list.size(); i++) {//循环遍历list
                //list.get(i)根据下标获取值
                System.out.println("测试编码为 " + key + " 的第 " + (i + 1) + " 个值:" + list.get(i).toString());
            }
        }
    }
}

执行结果

以上是关于Java-读取Excel的主要内容,如果未能解决你的问题,请参考以下文章

java 取Excel带有小数点数据,不能取完整,只能取小数点的后面2位,怎么解决?

solr分布式索引实战分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例

java如何读取整个excel文件的内容

从excel表格读取数据用Java代码实现批量上传写入数据库

用java的poi类读取一个excel表格的内容后再写入到一个新excel表格中的完整代码

java使用poi读取excel时,电话号码变成了科学计数法,整数变成double,怎么改过来