气死了,之前遇到一个感觉比较好用的poi导入,谁知道现在用起来,各种bug,干脆使用最新的api模仿实现了一个,使用模版方法模式回调,只需要实现接口,处理每一行数据,就ok了。此实现只支持单页sheetIndex
多页实现请参考:http://git.oschina.net/zhuqiang/utils

使用到的jar包pom

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.12</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.12</version>
</dependency>

核心PoiAbstract抽象类

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
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;
/*** 读取xlsx 和 xls,只支持单页sheetIndex* @author zq**/
public abstract class PoiAbstract {Workbook wb = null;public PoiAbstract(String path) {try {InputStream inp = new FileInputStream(path);wb = WorkbookFactory.create(inp);  //使用工厂创建,兼容xlsx 和 xls} catch (Exception e) {new RuntimeException(e.getMessage());}}/*** 遍历Excel所有数据,包含header* * @param sheetIndex*/public void process(int sheetIndex) {int columnNum = 0; // 获取列Sheet sheet = wb.getSheetAt(sheetIndex);if (sheet.getRow(0) != null) {columnNum = sheet.getRow(0).getLastCellNum() - sheet.getRow(0).getFirstCellNum();}if (columnNum > 0) {for (Row row : sheet) {List<String> rowlist = new ArrayList<String>(columnNum);int n = 0;for (int i = 0; i < columnNum; i++) {Cell cell = row.getCell(i, Row.CREATE_NULL_AS_BLANK);switch (cell.getCellType()) {case Cell.CELL_TYPE_BLANK:rowlist.add(n, "");break;case Cell.CELL_TYPE_BOOLEAN:rowlist.add(Boolean.toString(cell.getBooleanCellValue()));break;// 数值case Cell.CELL_TYPE_NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {rowlist.add(String.valueOf(cell.getDateCellValue()));} else {cell.setCellType(Cell.CELL_TYPE_STRING);String temp = cell.getStringCellValue();// 判断是否包含小数点,如果不含小数点,则以字符串读取,如果含小数点,则转换为Double类型的字符串if (temp.indexOf(".") > -1) {rowlist.add(String.valueOf(new Double(temp)).trim());} else {rowlist.add(temp.trim());}}break;case Cell.CELL_TYPE_STRING:rowlist.add(cell.getStringCellValue().trim());break;case Cell.CELL_TYPE_ERROR:rowlist.add("");break;case Cell.CELL_TYPE_FORMULA:cell.setCellType(Cell.CELL_TYPE_STRING);rowlist.add(cell.getStringCellValue());if (rowlist.get(n) != null) {rowlist.set(n, rowlist.get(n).replaceAll("#N/A", "").trim());}break;default:rowlist.add("");break;}n++;}try {this.optRows(sheetIndex, row.getRowNum(), rowlist); // 行结束,调用行,每行的数据} catch (Exception e) {e.printStackTrace();}}}}public abstract void optRows(int sheetIndex, int curRow, List<String> rowlist) throws Exception;
}

PoiRead 简易处理方式

import java.util.ArrayList;
import java.util.List;
/*** 一种感觉比较好的处理方式。信息量比较全。* @author zq**/
public class PoiRead extends PoiAbstract {// 数据处理解析数据的接口private PoiOptRowsInterface poiOptRowsInterface;// 处理数据总数 (如果有总数包含总数)private int optRows_sum = 0;// 处理数据成功数量private int optRows_success = 0;// 处理数据失败数量private int optRows_failure = 0;// excel表格每列标题private List<String> rowtitle;// 失败数据private List<List<String>> failrows;// 失败原因private List<String> failmsgs;// 要处理数据所在的sheet索引,sheet索引从0开始private int sheetIndex;/*** @param path*            导入文件的物理路径* @param sheetIndex*            要读取数据所在sheet序号,从0开始* @param poiOptRowsInterface*            处理读取每一行数据的接口*/PoiRead(String path, int sheetIndex, PoiOptRowsInterface poiOptRowsInterface) {super(path);this.sheetIndex = sheetIndex;this.poiOptRowsInterface = poiOptRowsInterface;this.rowtitle = new ArrayList<String>();this.failrows = new ArrayList<List<String>>();this.failmsgs = new ArrayList<String>();}@Overridepublic void optRows(int sheetIndex, int curRow, List<String> rowlist) throws Exception {// 将rowlist的长度补齐和标题一致int k = rowtitle.size() - rowlist.size();for (int i = 0; i < k; i++) {rowlist.add(null);}if (sheetIndex == this.sheetIndex) {optRows_sum++;if (curRow == 0) {// 记录标题rowtitle.addAll(rowlist);} else {// 接口返回的结果是导入数据的结果,有成功,有失败String result = poiOptRowsInterface.optRows(sheetIndex, curRow, rowlist);if (result != null && !result.equals(PoiOptRowsInterface.SUCCESS)) {optRows_failure++;// 失败统计数加1// 失败数据列表failrows.add(new ArrayList<String>(rowlist));failmsgs.add(result);} else {optRows_success++;}}}}public int getOptRows_sum() {return optRows_sum;}public void setOptRows_sum(int optRows_sum) {this.optRows_sum = optRows_sum;}public int getOptRows_success() {return optRows_success;}public void setOptRows_success(int optRows_success) {this.optRows_success = optRows_success;}public int getOptRows_failure() {return optRows_failure;}public void setOptRows_failure(int optRows_failure) {this.optRows_failure = optRows_failure;}public List<String> getRowtitle() {return rowtitle;}public void setRowtitle(List<String> rowtitle) {this.rowtitle = rowtitle;}public List<List<String>> getFailrows() {return failrows;}public void setFailrows(List<List<String>> failrows) {this.failrows = failrows;}public List<String> getFailmsgs() {return failmsgs;}public void setFailmsgs(List<String> failmsgs) {this.failmsgs = failmsgs;}//测试读取public static void main(String[] args) {PoiRead poiRead = new PoiRead("C:/Users/99299/Desktop/读取测试.xlsx", 0, new Impl());poiRead.process(0);System.out.println("处理数据总数:" + poiRead.getOptRows_sum());System.out.println("处理数据成功数量:" + poiRead.getOptRows_success());System.out.println("处理数据失败数量:" + poiRead.getOptRows_failure());System.out.println("excel表格每列标题:" + poiRead.getRowtitle());System.out.println("失败数据:" + poiRead.getFailrows());System.out.println("失败原因:" + poiRead.getFailmsgs());}}

PoiRead的回调接口PoiOptRowsInterface

import java.util.List;/*** 与 简易实现 PoiRead.java类配合使用的回调接口* @author zq**/
public interface PoiOptRowsInterface {public static final String SUCCESS = "success";/*** 处理excel文件每行数据方法* * @param sheetIndex*            为sheet的序号* @param curRow*            为行号* @param rowlist*            行数据* @return success:返回 SUCCESS 或则 null 表示成功,否则为失败原因* @throws Exception*/public String optRows(int sheetIndex, int curRow, List<String> rowlist) throws Exception;
}

使用示例

编写一个回调接口的实现类

编写该类的一些思路:这里回调给你的是,当前页数,当前处理的行,当前行的所有列数据
在构建该实现类的时候,可以加入各种与数据库的服务,和各种验证方法,比如:可以定义一些变量,把所要保留下来的数据存起来;在返回的字符串中,按照一定的格式记录错误的行和列,在前台jsp页面中就能做到把错误的列都飘红显示。等等。 这里就简单的打印下

import java.util.List;public class Impl implements PoiOptRowsInterface {public String optRows(int sheetIndex, int curRow, List<String> rowlist) throws Exception {System.out.println( curRow + "行------------");for (String st : rowlist) {System.out.print(st + "\t");}System.out.println("");return "xxxxxxxxxx";}}

POI导入,兼容xlsx 和 xls相关推荐

  1. npoi把xlsx文件转为html,C# NPOI 导入与导出Excel文档 兼容xlsx, xls(xf13中已经引用了xlsx的npoi)...

    这里使用的NPOI版本为: 2.1.3.1 版本内包含.Net 2.0 与.Net 4.0 .Net 4.0中包含文件 使用时需引用需要引用所有5个dll 使用到的引用 using NPOI.HSSF ...

  2. Android使用POI操作excel(支持xls和xlsx)

    一.说明及准备工作 1.用于AS使用POI读取.创建.另存excel,兼容xlsx和xls格式 2.下载poi-3.12-android-a.jar.poi-ooxml-schemas-3.12-20 ...

  3. Java Excel导入和导出(支持xls导入,xlsx导入,图片导出,百万数据量导出)

    免费源码下载(提取码:qdhy) 工程结构目录 所需JAR包 <dependencies><!-- JUNIT 测试 --><dependency><grou ...

  4. php excel导入数组,利用PHPExcel导入xlsx/xls,将xlsx、xls转换为数组

    项目的原因有时候我们需要把xls的文件数据导入到数据库,今天青岛星网先跟大家分享:利用PHPExcel导入xlsx/xls,将xlsx.xls转换为数组的思路方法. 利用PHPExcel导入xlsx/ ...

  5. Poi导入Excel校验表头

    我们在日常的开发过程中,poi导入数据要根据注解的列名和顺序进行识别,那么首先要校验模版的正确与否,即表头是否正确,然后才能开始数据和业务层面的校验,最近也是被这个东西烦的不行,解决后记录一下,一个是 ...

  6. poi导入数据工具类,直接复制使用,有详细注释

    poi导入工具类,直接复制使用,有详细的注释 前言 一.引入依赖 二.封装的工具类以及注解类直接copy使用 首先是工具类无需做操作 然后是封装的两个注解类,也是直接复制使用 测试工具类功能 测试实体 ...

  7. POI导入导出EXCEL经典实现

    1.Apache POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能. .NET的开发人员则 ...

  8. Java 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)

    ava 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包) 假设现在要做一个通用的导入方法: 要求: 1.xml的只定义数据库表中的column字段,字段类型,是否非空等条件 ...

  9. Java POI 导入Excell

    ##Java POI 导入Excell 导入表格 public String toExcel(HttpServletRequest request, HttpServletResponse respo ...

最新文章

  1. 铁大Facebook——十天冲刺(5)
  2. 云主机和物理机PK图
  3. 接私活福音,validation组件敏捷开发,效率提升5倍!
  4. Canvas入门-利用Canvas绘制好玩的电子时钟
  5. 端口偷窃(Port Stealing)技术
  6. [导入]Ms XmlDom 异步装载Xml文件
  7. 一定要陪一个男人创业,你会和他一样快速成长,并内心变得强大
  8. 计算机网络数据链路层之其基础概述
  9. 插件制作教程 php,HYBBS插件开发教程 (简单插件) 初识篇
  10. PKPM学习:关于“悬空柱”的问题
  11. Tikhonov regularization 吉洪诺夫正则化(L2正则化)
  12. Centos 7 环境实现内网服务访问
  13. 安装Ubuntu虚拟机
  14. 010 Editor修改指令
  15. 数字电子技术基础——第三章 集成逻辑门电路
  16. 量化交易接口怎么自动选股票?
  17. dvwa详解_DVWA(六):XSS-Reflected 反射型XSS全等级详解
  18. linux端口映射到外网访问,Linux使用Iptables做端口映射远程访问无公网IP的SSH
  19. 井通区块链技术在教育行业的落地应用
  20. 再见阳朔-记在2010圣诞

热门文章

  1. centos7 基于wine安装微信wechat并解决聊天输入框无法显示问题
  2. 小记 TypeScript 中的循环引用问题
  3. 请回答2018:迟来的中国互联网成人礼
  4. 30个Python自学网站,再也不愁找不到资料了
  5. javaWeb 简单注册登录(含数据库连接) -- (一)页面
  6. Android Studio连接手机模拟器
  7. Android基于GridView的卡牌翻转小游戏
  8. 机械革命 深海幽灵Z2-G的主要参数与特性
  9. Java打印输出:8x8x
  10. html5 canvas全屏变色波浪线条动画js特效