zoukankan      html  css  js  c++  java
  • 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("
    通过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("
    通过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());
                }
            }
        }
    }

    执行结果

  • 相关阅读:
    cube.js 上下文实践的一些说明
    sitespeed.io 开源web 性能监控&&优化工具集
    sideway/joi js 强大的data schma 校验框架
    cube.js 最新版本的一些特性
    cube.js 支持的类型以及格式化
    cube.js 多租户模式使用一个说明
    airbyte 基于singer 扩展的EL 平台
    cube.js dimensions 的一些说明
    cube.js measures 的一些说明
    cube.js 上下文变量
  • 原文地址:https://www.cnblogs.com/lilyo/p/12930469.html
Copyright © 2011-2022 走看看