Java使用poi包读取Excel文档代码分享

 更新时间:2017年12月04日 14:32:04   作者:yan456jie  
这篇文章主要介绍了Java使用poi包读取Excel文档代码分享,具有一定借鉴价值,需要的朋友可以参考下。

项目需要解析Excel文档获取数据,就在网上找了一些资料,结合自己这次使用,写下心得:

1、maven项目需加入如下依赖:

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

直接上测试类,类里有完善的注释:

package shindo.Java;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
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.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelUtil {

  public static void main(String[] args) {
    String path = "D:\\IDE\\workspace-Neon\\Java\\src\\refund.xls";
    try {
      List<List<String>> result = new ExcelUtil().readXls(path);
      System.out.println(result.size());
      for (int i = 0; i < result.size(); i++) {
        List<String> model = result.get(i);
        System.out.println("orderNum:" + model.get(0) + "--> orderAmount:" + model.get(1));
      }

    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * 
  * @Title: readXls 
  * @Description: 处理xls文件
  * @param @param path
  * @param @return
  * @param @throws Exception  设定文件 
  * @return List<List<String>>  返回类型 
  * @throws
  * 
  * 从代码不难发现其处理逻辑:
  * 1.先用InputStream获取excel文件的io流
  * 2.然后穿件一个内存中的excel文件HSSFWorkbook类型对象,这个对象表示了整个excel文件。
  * 3.对这个excel文件的每页做循环处理
  * 4.对每页中每行做循环处理
  * 5.对每行中的每个单元格做处理,获取这个单元格的值
  * 6.把这行的结果添加到一个List数组中
  * 7.把每行的结果添加到最后的总结果中
  * 8.解析完以后就获取了一个List<List<String>>类型的对象了
  * 
   */
  private List<List<String>> readXls(String path) throws Exception {
    InputStream is = new FileInputStream(path);
    // HSSFWorkbook 标识整个excel
    HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
    List<List<String>> result = new ArrayList<List<String>>();
    int size = hssfWorkbook.getNumberOfSheets();
    // 循环每一页,并处理当前循环页
    for (int numSheet = 0; numSheet < size; numSheet++) {
      // HSSFSheet 标识某一页
      HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
      if (hssfSheet == null) {
        continue;
      }
      // 处理当前页,循环读取每一行
      for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
        // HSSFRow表示行
        HSSFRow hssfRow = hssfSheet.getRow(rowNum);
        int minColIx = hssfRow.getFirstCellNum();
        int maxColIx = hssfRow.getLastCellNum();
        List<String> rowList = new ArrayList<String>();
        // 遍历改行,获取处理每个cell元素
        for (int colIx = minColIx; colIx < maxColIx; colIx++) {
          // HSSFCell 表示单元格
          HSSFCell cell = hssfRow.getCell(colIx);
          if (cell == null) {
            continue;
          }
          rowList.add(getStringVal(cell));
        }
        result.add(rowList);
      }
    }
    return result;
  }

  /**
   * 
  * @Title: readXlsx 
  * @Description: 处理Xlsx文件
  * @param @param path
  * @param @return
  * @param @throws Exception  设定文件 
  * @return List<List<String>>  返回类型 
  * @throws
   */
  private List<List<String>> readXlsx(String path) throws Exception {
    InputStream is = new FileInputStream(path);
    XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
    List<List<String>> result = new ArrayList<List<String>>();
    // 循环每一页,并处理当前循环页
    for (XSSFSheet xssfSheet : xssfWorkbook) {
      if (xssfSheet == null) {
        continue;
      }
      // 处理当前页,循环读取每一行
      for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
        XSSFRow xssfRow = xssfSheet.getRow(rowNum);
        int minColIx = xssfRow.getFirstCellNum();
        int maxColIx = xssfRow.getLastCellNum();
        List<String> rowList = new ArrayList<String>();
        for (int colIx = minColIx; colIx < maxColIx; colIx++) {
          XSSFCell cell = xssfRow.getCell(colIx);
          if (cell == null) {
            continue;
          }
          rowList.add(cell.toString());
        }
        result.add(rowList);
      }
    }
    return result;
  }

  // 存在的问题
  /*
   * 其实有时候我们希望得到的数据就是excel中的数据,可是最后发现结果不理想
   * 如果你的excel中的数据是数字,你会发现Java中对应的变成了科学计数法。
   * 所以在获取值的时候就要做一些特殊处理来保证得到自己想要的结果
   * 网上的做法是对于数值型的数据格式化,获取自己想要的结果。
   * 下面提供另外一种方法,在此之前,我们先看一下poi中对于toString()方法:
   * 
   * 该方法是poi的方法,从源码中我们可以发现,该处理流程是:
   * 1.获取单元格的类型
   * 2.根据类型格式化数据并输出。这样就产生了很多不是我们想要的
   * 故对这个方法做一个改造。
   */
  /*public String toString(){
    switch(getCellType()){
      case CELL_TYPE_BLANK:
        return "";
      case CELL_TYPE_BOOLEAN:
        return getBooleanCellValue() ? "TRUE" : "FALSE";
      case CELL_TYPE_ERROR:
        return ErrorEval.getText(getErrorCellValue());
      case CELL_TYPE_FORMULA: 
        return getCellFormula();
      case CELL_TYPE_NUMERIC:
        if(DateUtil.isCellDateFormatted(this)){
          DateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy")
          return sdf.format(getDateCellValue());
        }
        return getNumericCellValue() + "";
      case CELL_TYPE_STRING: 
        return getRichStringCellValue().toString();
      default :
        return "Unknown Cell Type:" + getCellType();
    }
  }*/

  /**
   * 改造poi默认的toString()方法如下
  * @Title: getStringVal 
  * @Description: 1.对于不熟悉的类型,或者为空则返回""控制串
  *        2.如果是数字,则修改单元格类型为String,然后返回String,这样就保证数字不被格式化了
  * @param @param cell
  * @param @return  设定文件 
  * @return String  返回类型 
  * @throws
   */
  public static String getStringVal(HSSFCell cell) {
    switch (cell.getCellType()) {
    case Cell.CELL_TYPE_BOOLEAN:
      return cell.getBooleanCellValue() ? "TRUE" : "FALSE";
    case Cell.CELL_TYPE_FORMULA:
      return cell.getCellFormula();
    case Cell.CELL_TYPE_NUMERIC:
      cell.setCellType(Cell.CELL_TYPE_STRING);
      return cell.getStringCellValue();
    case Cell.CELL_TYPE_STRING:
      return cell.getStringCellValue();
    default:
      return "";
    }
  }
}

总结

以上就是本文关于Java使用poi包读取Excel文档代码分享的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • 详解Spring Boot配置排序依赖技巧

    详解Spring Boot配置排序依赖技巧

    本篇文章主要介绍了Spring Boot配置排序依赖技巧,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • spring Profile如何为不同环境提供不同的配置支持

    spring Profile如何为不同环境提供不同的配置支持

    这篇文章主要介绍了spring Profile如何为不同环境提供不同的配置支持,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • SpringBoot实现MapperScan添加动态配置(占位符)

    SpringBoot实现MapperScan添加动态配置(占位符)

    这篇文章主要介绍了SpringBoot实现MapperScan添加动态配置(占位符),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • SpringBoot整合高德地图天气查询的全过程

    SpringBoot整合高德地图天气查询的全过程

    这篇文章主要给大家介绍了关于SpringBoot整合高德地图天气查询的相关资料,文中通过图文介绍的非常详细,对大家学习或者使用springboot具有一定的参考学习价值,需要的朋友可以参考下
    2021-12-12
  • 详解Struts2中配置默认Action的方法

    详解Struts2中配置默认Action的方法

    本篇文章主要介绍了详解Struts2中配置默认Action的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • SpringBoot请求参数接收方式

    SpringBoot请求参数接收方式

    这篇文章主要介绍了SpringBoot请求参数接收方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 面向切面的Spring通过切点来选择连接点实例详解

    面向切面的Spring通过切点来选择连接点实例详解

    这篇文章主要为大家介绍了面向切面的Spring通过切点来选择连接点实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Java如何导出zip压缩文件

    Java如何导出zip压缩文件

    这篇文章主要介绍了Java如何导出zip压缩文件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Elasticsearch 自动重启脚本创建实现

    Elasticsearch 自动重启脚本创建实现

    这篇文章主要为大家介绍了Elasticsearch 自动重启脚本创建实现详解分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 使用MockMvc进行controller层单元测试 事务自动回滚的完整案例

    使用MockMvc进行controller层单元测试 事务自动回滚的完整案例

    这篇文章主要介绍了使用MockMvc进行controller层单元测试 事务自动回滚的完整案例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论