1.几个javaBean的定义

因为javabean比较简单 这里就不详细写了,get set和构造方法自己定义

public class Excel {private String fileName;private String suffix;private String type;private List<SheetBean> sheets;//get set//Constructor
}public class SheetBean {private String sheetName;private List<RowData> data;private Headers headers;//get set//Constructor
}public class Headers {//有合并列的时候用到private Map<String,List<String>> allColumns;//所有的主要的列,如果有合并列,则代表最下面那一行的列,eg:第一行有合并列,那么columns代表第二行的所有列private List<String> columns;
}public class RowData {private int rowIndex;private int columns;private Map<String,Object> data;private Map<String,CellBean> cells;
}public class CellBean {private int colIndex;private String colName;private Object value;private String type;private int width;private int colSpan;private int rowSpan;
}

EXCEL解析

poi jar包版本是3.17的

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler.SheetContentsHandler;
import org.apache.poi.xssf.model.StylesTable;
import org.apache.poi.xssf.usermodel.XSSFComment;
import org.springframework.beans.BeanUtils;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;public class ExcelHelper {private static final Logger logger = LogManager.getLogger(ExcelParser.class);/*** 表格默认处理器*/private ISheetContentHandler contentHandler = new DefaultSheetHandler();/*** 读取数据*/private Excel excel=new Excel();/*** 转换表格,默认为转换第一个表格* @param stream* @return* @throws InvalidFormatException* @throws IOException* @throws ParseException*/public ExcelHelper parse(InputStream stream)throws InvalidFormatException, IOException, ParseException {return parse(stream, 1);}/**** @param stream* @param sheetId:为要遍历的sheet索引,从1开始* @return* @throws InvalidFormatException* @throws IOException* @throws ParseException*/public synchronized ExcelHelper parse(InputStream stream, int sheetId)throws InvalidFormatException, IOException, ParseException {// 每次转换前都清空数据
//      datas.clear();excel=new Excel();// 打开表格文件输入流OPCPackage pkg = OPCPackage.open(stream);try {// 创建表阅读器XSSFReader reader;try {reader = new XSSFReader(pkg);} catch (OpenXML4JException e) {logger.error("读取表格出错");throw new ParseException(e.fillInStackTrace());}// 转换指定单元表String sheetName="rId"+sheetId;
//          sheetName="全国点位资源表";SheetBean sheetBean=new SheetBean(sheetName);InputStream shellStream = reader.getSheet(sheetName);try {InputSource sheetSource = new InputSource(shellStream);StylesTable styles = reader.getStylesTable();ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(pkg);getContentHandler().init(sheetBean);// 设置读取出的数据// 获取转换器XMLReader parser = getSheetParser(styles, strings);parser.parse(sheetSource);List<SheetBean> sheets=new ArrayList<SheetBean>();sheets.add(sheetBean);excel.setSheets(sheets);} catch (SAXException e) {logger.error("读取表格出错");throw new ParseException(e.fillInStackTrace());} finally {shellStream.close();}} finally {pkg.close();}return this;}/*** 获取表格读取数据,获取数据前,需要先转换数据<br>* 此方法不会获取第一行数据** @return 表格读取数据*/public Excel getDatas() {return excel;}/*** 获取表格读取数据,获取数据前,需要先转换数据** @param dropFirstRow*    删除第一行表头记录* @return 表格读取数据*/
//  public Excel getDatas(boolean dropFirstRow) {//      if (dropFirstRow && datas.size() > 0) {//          datas.remove(0);// 删除表头
//      }
//      return excel;
//
//  }/*** 获取读取表格的转换器** @return 读取表格的转换器* @throws SAXException* SAX错误*/protected XMLReader getSheetParser(StylesTable styles, ReadOnlySharedStringsTable strings) throws SAXException {XMLReader parser = XMLReaderFactory.createXMLReader();parser.setContentHandler(new XSSFSheetXMLHandler(styles, strings, getContentHandler(), false));return parser;}public ISheetContentHandler getContentHandler() {return contentHandler;}public void setContentHandler(ISheetContentHandler contentHandler) {this.contentHandler = contentHandler;}/*** 表格转换错误*/public class ParseException extends Exception {private static final long serialVersionUID = -2451526411018517607L;public ParseException(Throwable t) {super("表格转换错误", t);}}public interface ISheetContentHandler extends SheetContentsHandler {/*** 设置转换后的数据集,用于存放转换结果** @param datas*    转换结果*/void init(SheetBean SheetBean);}/*** 默认表格解析handder*/class DefaultSheetHandler implements ISheetContentHandler {/*** 读取数据*/private SheetBean sheetBean;List<RowData> sheetData=new ArrayList<RowData>();// 读取行信息private RowData readRow=null;private ArrayList<String> columns = new ArrayList<String>();@Overridepublic void init(SheetBean SheetBean) {this.sheetBean = SheetBean;//  this.columsLength = columsLength;}@Overridepublic void startRow(int rowNum) {//System.out.print("开始解析第"+rowNum+"行。");readRow=null;if (rowNum != 0) {readRow=new RowData(rowNum);}else {if(sheetBean.getData()==null) {sheetBean.setData(sheetData);}}}@Overridepublic void endRow(int rowNum) {//System.out.println("第"+rowNum+"行解析结束。");if (rowNum == 0) {//表头 列if(sheetBean.getHeaders()==null) {Headers headers=new Headers(columns);sheetBean.setHeaders(headers);}}else {RowData row=new RowData();BeanUtils.copyProperties(readRow, row);sheetData.add(row);}readRow = null;}@Overridepublic void cell(String cellReference, String formattedValue, XSSFComment comment) {int colIndex = getCellIndex(cellReference);//转换A1,B1,C1等表格位置为真实索引位置try {if(readRow!=null) {int rowIndex=readRow.getRowIndex();String colName=columns.get(colIndex);if(colName==null) {System.out.println(rowIndex);}CellBean cellBean=new CellBean(colIndex,colName,formattedValue);readRow.getCells().put(colName, cellBean);readRow.getData().put(colName, formattedValue);}else {columns.set(colIndex, formattedValue);}} catch (IndexOutOfBoundsException e) {int size = columns.size();for (int i = colIndex - size+1;i>0;i--){columns.add(null);}columns.set(colIndex,formattedValue);logger.info(e.getMessage()+" "+e.getCause());}}@Overridepublic void headerFooter(String text, boolean isHeader, String tagName) {}/*** 转换表格引用为列编号** @param cellReference*    列引用* @return 表格列位置,从0开始算*/public int getCellIndex(String cellReference) {String ref = cellReference.replaceAll("\\d+", "");int num = 0;int result = 0;for (int i = 0; i < ref.length(); i++) {char ch = cellReference.charAt(ref.length() - i - 1);num = (int) (ch - 'A' + 1);num *= Math.pow(26, i);result += num;}return result - 1;}}
}

3.调用

public static void test2() {try {String date1=CommonUtil.getFormat("yyyy-MM-dd HH:mm:ss").format(new Date());String filePath = "F:\\20210624XXX.xlsx";File file = new File(filePath);//   log.info("需要读取的文件fileName:{}", file.getName());FileInputStream inputStream = new FileInputStream(file);ExcelHelper excelParser = new ExcelHelper();ExcelHelper parse = excelParser.parse(inputStream);Excel excel=parse.getDatas();//EXCEL文件的内容全在 excel对象里了,可以自己解析利用了String date2=CommonUtil.getFormat("yyyy-MM-dd HH:mm:ss").format(new Date());System.out.println("开始时间:"+date1+"\t结束时间:"+date2);} catch (Exception e) {e.printStackTrace();}
}

4.扩展

4.1实战中,可通过parse方法或者init方法传入Map<String,Object> fieldsMap ,将columns直接翻译成需要的字段集合。便于直接利用
4.2 可通过声明一个导入类 继承ExcelHelper 或者实现 ISheetContentHandler,直接进行过滤验证等操作,完成后将过滤好的集合返回用于保存,这个方法会在后面的文章提供实现。

要说的就这些了,希望这篇文章能对大家有用,如果感觉有用的话,请点个赞吧!

使用POI读取大量数据EXCEL文件,并解析成自定义javaBean相关推荐

  1. java中mypoiexception_Java中使用POI读取大的Excel文件或者输入流时发生out of memory异常参考解决方案...

    注意:此参考解决方案只是针对xlsx格式的excel文件! 背景 前一段时间遇到一种情况,服务器经常宕机,而且没有规律性,查看GC日志发生了out of memory,是堆溢出导致的,分析了一下堆的d ...

  2. java 读excel 流_Java中使用POI读取大的Excel文件或者输入流时发生out of memory异常参考解决方案...

    原文:https://www.cnblogs.com/cksvsaaa/p/7280261.html 注意:此参考解决方案只是针对xlsx格式的excel文件! 背景 前一段时间遇到一种情况,服务器经 ...

  3. poi 顺序解析word_利用POI读取word、Excel文件的最佳实践教程

    前言 POI是 Apache 旗下一款读写微软家文档声名显赫的类库.应该很多人在做报表的导出,或者创建 word 文档以及读取之类的都是用过 POI.POI 也的确对于这些操作带来很大的便利性.我最近 ...

  4. python读取txt文件并写入excel-Python实现读取并写入Excel文件过程解析

    需求是有两个Excel文件:1.xlsx,2.xlsx,比较2.xlsx中的A,B列和1.xlsx中的A,B列:查找1.xlsx中存在,2.xlsx中不存在的行数据,输出到result.xlsx文件中 ...

  5. python读取文件名写入excel_Python实现读取并写入Excel文件过程解析

    需求是有两个Excel文件:1.xlsx,2.xlsx,比较2.xlsx中的A,B列和1.xlsx中的A,B列:查找1.xlsx中存在,2.xlsx中不存在的行数据,输出到result.xlsx文件中 ...

  6. python编程读取写入excel_Python实现读取并写入Excel文件过程解析

    需求是有两个Excel文件:1.xlsx,2.xlsx,比较2.xlsx中的A,B列和1.xlsx中的A,B列:查找1.xlsx中存在,2.xlsx中不存在的行数据,输出到result.xlsx文件中 ...

  7. Java导入Excel文件日期解析成了中文问题解决

    Excel文件日期为2018-12-12,在解析出来的时候变成了 12-十二月-2018 cell.setCellType(Cell.CELL_TYPE_STRING);//根据不同类型转化成字符串 ...

  8. 在线EXCEL文件数据转换解析工具

    在线EXCEL文件数据转换解析工具 在线EXCEL文件数据转换解析工具 本工具支持将EXCEL文件转解析成JSON,CSV,HTML以及公式格式,直接将文件拖入文件上传区即可实时转换, 数据仅在客户端 ...

  9. springboot整合poi读取数据库数据和图片动态导出excel

    springboot整合poi读取数据库数据和图片动态导出excel 第一次操作 话不多说就直接上代码 实现代码 需要的依赖 <dependency><groupId>org. ...

最新文章

  1. JVM虚拟机参数配置官方文档
  2. tsne pca 自编码器 绘图(CC2)——一定记得做无量纲化处理使用standardscaler,数据聚类更明显...
  3. 目睹鸿蒙开创四大至高位面,吞噬星空 绝非鸿蒙系列,完结前最后的分析【申精】...
  4. gRPC学习记录(一)--概念性知识
  5. linux以服务的方式启动mongodb,linux以服务的方式启动MongoDB
  6. C 流插入和流提取运算符的重载
  7. Linux 学习重点内容(第二节)
  8. 第40课 儿歌《打老虎》-2021.08.10 《小学生C++趣味编程》
  9. postgresql如何让主键自增
  10. 新时代的web与app开发
  11. 基于Velocity开发自己的模板引擎
  12. 【HDU3336】Count the String(kmp--每个前缀出现的次数)
  13. 编译原理完整学习笔记(三):词法分析
  14. 单片机数码管动态显示时钟C语言,8位数码管显示电子时钟c51单片机程序
  15. Android真机连接局域网PC服务器的方法
  16. 如何下载广东省卫星地图高清版大图
  17. Android--ImageView读取本地路径图片
  18. java调用R 画词云
  19. 学编程的 3 个正经建议,学弟学妹们记得收藏呀,这波赚大发了!
  20. html5 并发测试工具,超实用压力测试工具-ab工具

热门文章

  1. HIVE常见面试题以及实战练习(六)
  2. 打包安卓apk后的V1和V2签名
  3. PoE交换机供电距离只能跑100米,就不能再远一点吗?
  4. java程序计算圆周率
  5. 东南蒙纳士计算机复试,2016年东南大学——蒙纳士大学双硕士学位研究生复试通知...
  6. 小玩意--用必应每日图片换桌面壁纸(Python)
  7. 余额重估(Revaluation Balances)相关设置和操作
  8. 54. 流编辑器sed技术概览
  9. 2022届应届生办理落户上海流程是怎样的?
  10. 怎么给word文档注音_请教如何在WORD文档中给汉语拼音加上声调?