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

网友投稿 607 2023-03-09


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

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

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

org.apache.poi

poi

3.10-FINAL

org.apache.poi

poi-ooxml

3.10-FINAL

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

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> result = new ExcelUtil().readXls(path);

System.out.println(result.size());

for (int i = 0; i < result.size(); i++) {

List 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> 返回类型

* @throws

*

* 从代码不难发现其处理逻辑:

* 1.先用InputStream获取excel文件的io流

* 2.然后穿件一个内存中的excel文件HSSFWorkbook类型对象,这个对象表示了整个excel文件。

* 3.对这个excel文件的每页做循环处理

* 4.对每页中每行做循环处理

* 5.对每行中的每个单元格做处理,获取这个单元格的值

* 6.把这行的结果添加到一个List数组中

* 7.把每行的结果添加到最后的总结果中

* 8.解析完以后就获取了一个List>类型的对象了

*

*/

private List> readXls(String path) throws Exception {

InputStream is = new FileInputStream(path);

// HSSFWorkbook 标识整个excel

HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);

List> result = new ArrayList>();

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 rowList = new ArrayList();

// 遍历改行,获取处理每个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> 返回类型

* @throws

*/

private List> readXlsx(String path) throws Exception {

InputStream is = new FileInputStream(path);

XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);

List> result = new ArrayList>();

// 循环每一页,并处理当前循环页

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 rowList = new ArrayList();

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

xOzKENzTgLcase 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文档代码分享的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:api 管理平台(API管理平台 开源)
下一篇:整合 接口设计(整合 接口设计图)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~