资讯专栏INFORMATION COLUMN

简单好用-JAVA使用POI解析Excel

wangjuntytl / 1728人阅读

摘要:相信使用的目前已经非常多了,我这边提供一个非常简单便利又通用的解析工具类,代码最后有示例代码。可以按照本文直接使用。

相信使用POI的目前已经非常多了,我这边提供一个非常简单便利又通用的POI解析工具类,代码最后有示例代码。可以按照本文直接使用。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
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.poifs.filesystem.POIFSFileSystem;

/**
 * 
 * Title: ExcelReader
* Description: 可以读取xls,xlsx等文件
* Copyright @ 2012~2016 xiaour.github.com .All rights reserved.
* @author 小鱼儿 * @createDate 2016年8月23日 * @version v1.0 */ public class ExcelReader { private POIFSFileSystem fs; private HSSFWorkbook wb; private HSSFSheet sheet; private HSSFRow row; private static Logger logger = LogManager.getLogger(ExcelReader.class); private String fileFullPath; private int sheetNo; public ExcelReader(String fileFullPath, int sheetNo) { super(); this.fileFullPath = fileFullPath; this.sheetNo = sheetNo; } /** * 读取Excel数据内容 * @param InputStream * @param sheetNo sheet 页号 * @return Map 包含单元格数据内容的Map对象 */ public List> readExcel() { logger.info("开始解析xls..."); sheetNo--;//从1开始及从0开始 InputStream is = null; try { is = new FileInputStream(fileFullPath); } catch (FileNotFoundException e1) { logger.error(e1); } Map dataMap = null; List> dataList= new ArrayList<>(); String value = ""; try { fs = new POIFSFileSystem(is); wb = new HSSFWorkbook(fs); } catch (IOException e) { logger.error(e); } sheet = wb.getSheetAt(sheetNo); row = sheet.getRow(0); // 标题总列数 int colNum = row.getPhysicalNumberOfCells(); String[] keyArray = new String[colNum]; for (int i = 0; i < colNum; i++) { keyArray[i] = getCellFormatValue(row.getCell((short) i)); } int rowNum = sheet.getLastRowNum(); // 正文内容应该从第二行开始,第一行为表头的标题 for (int i = 2; i <= rowNum; i++) { dataMap= new HashMap<>(); row = sheet.getRow(i); if(row!=null){ int j = 0; while (j < colNum) { //这里把列循环到Map if(row.getCell((short) j)!=null){ value = getCellFormatValue(row.getCell((short) j)).trim(); dataMap.put(keyArray[j],value); } j++; } value = ""; dataList.add(dataMap); } } logger.info("解析xls完成..."); try { if(is!=null) is.close(); } catch (IOException e) { logger.error(e.toString()); } return dataList; } /** * 根据HSSFCell类型设置数据 * @param cell * @return */ private String getCellFormatValue(HSSFCell cell) { String cellvalue = ""; if (cell != null) { // 判断当前Cell的Type switch (cell.getCellType()) { // 如果当前Cell的Type为NUMERIC case HSSFCell.CELL_TYPE_NUMERIC: case HSSFCell.CELL_TYPE_FORMULA: { // 判断当前的cell是否为Date if (HSSFDateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); cellvalue = sdf.format(date); } // 如果是纯数字 else { // 取得当前Cell的数值 DecimalFormat df = new DecimalFormat("0"); String dfStr = df.format(cell.getNumericCellValue()); cellvalue = dfStr; } break; } // 如果当前Cell的Type为STRIN case HSSFCell.CELL_TYPE_STRING: // 取得当前的Cell字符串 cellvalue = cell.getRichStringCellValue().getString(); break; // 默认的Cell值 default: cellvalue = " "; } } else { cellvalue = ""; } return cellvalue; } public static void main(String[] args) { List> dataList; // 对读取Excel表格标题测试 ExcelReader excelReader = new ExcelReader("D:okcoin-2016-08-3XZS.xls",1); dataList = excelReader.readExcel(); for(Map theMap:dataList){ System.out.println(theMap); } } }

这个类导入相应的jar之后就可以用了哦。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65255.html

相关文章

  • 慕课网_《解密JAVA实现Excel导入导出》学习总结

    时间:2017年07月06日星期四说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:课程介绍 1-1 预备知识 基础知识 struts2框架(上传下载功能) xml解析技术(导入模板) JQuery EasyUI(前台美观) 课程目录 实现方式 定制导入模版 导入文件 导...

    enrecul101 评论0 收藏0
  • POI Sax 事件驱动解析Excel2007文件(较大数据量的读存导出)

    摘要:方式解析全称,它是一个接口,也是一个软件包。另外,推模型可用于广播环境,能够同时注册多个,并行接收事件,而不是在一个管道中一个接一个地进行处理。这些语法分析器是最灵活的,因为它们还支持。 xcel2007版本的代码如下,本文主要是用于POI解析大文件Excel容易出现内存溢出的现象而提出解决方案,故此解决了大数据量的Excel文件解析的难度,在此拿出来贡献给大家,谢谢! 1.Offic...

    cod7ce 评论0 收藏0
  • POI技术—用于java开发解析excel的抽象类

    摘要:单元格各类型数据读取基本类型处理的数据包括字符型数据,数字日期公式等。下面是单元格类型说明实例解析中数据,要求转换为文本方式存储写一个解析的抽象类版本的版本的解析的文件格式有误 1.单元格各类型数据读取 1.1 基本类型 处理的Excel数据包括字符型数据,数字、日期、公式等。 下面是单元格类型说明: showImg(https://segmentfault.com/img/bVMjd...

    xfee 评论0 收藏0
  • Java实现excel导入导出学习笔记1 - 实现方式

    摘要:需要的技术框架利用其上传下载功能解析技术定制导入模板制作前台与格式对应,版本低,兼容性好与格式对应组成的几个概念工作薄工作表行记录单元格创建中的的详见如创建创建工作簿创建工作表创建第一行创建一个文件存盘名字性別男解析文件创建,读取文件 需要的技术 1、strut2框架 利用其上传下载功能2、xml解析技术 定制导入模板3、jquery UI 制作前台 4、showImg(/i...

    wean 评论0 收藏0
  • Excel大批量数据的导入和导出,如何做优化?

    摘要:并且在对的抽象中,每一行,每一个单元格都是一个对象。对支持使用官方例子需要继承,覆盖方法,每读取到一个单元格的数据则会回调次方法。概要Java对Excel的操作一般都是用POI,但是数据量大的话可能会导致频繁的FGC或OOM,这篇文章跟大家说下如果避免踩POI的坑,以及分别对于xls和xlsx文件怎么优化大批量数据的导入和导出。一次线上问题这是一次线上的问题,因为一个大数据量的Excel导出...

    Tecode 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<