POI导入,兼容xlsx 和 xls
气死了,之前遇到一个感觉比较好用的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相关推荐
- 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 ...
- Android使用POI操作excel(支持xls和xlsx)
一.说明及准备工作 1.用于AS使用POI读取.创建.另存excel,兼容xlsx和xls格式 2.下载poi-3.12-android-a.jar.poi-ooxml-schemas-3.12-20 ...
- Java Excel导入和导出(支持xls导入,xlsx导入,图片导出,百万数据量导出)
免费源码下载(提取码:qdhy) 工程结构目录 所需JAR包 <dependencies><!-- JUNIT 测试 --><dependency><grou ...
- php excel导入数组,利用PHPExcel导入xlsx/xls,将xlsx、xls转换为数组
项目的原因有时候我们需要把xls的文件数据导入到数据库,今天青岛星网先跟大家分享:利用PHPExcel导入xlsx/xls,将xlsx.xls转换为数组的思路方法. 利用PHPExcel导入xlsx/ ...
- Poi导入Excel校验表头
我们在日常的开发过程中,poi导入数据要根据注解的列名和顺序进行识别,那么首先要校验模版的正确与否,即表头是否正确,然后才能开始数据和业务层面的校验,最近也是被这个东西烦的不行,解决后记录一下,一个是 ...
- poi导入数据工具类,直接复制使用,有详细注释
poi导入工具类,直接复制使用,有详细的注释 前言 一.引入依赖 二.封装的工具类以及注解类直接copy使用 首先是工具类无需做操作 然后是封装的两个注解类,也是直接复制使用 测试工具类功能 测试实体 ...
- POI导入导出EXCEL经典实现
1.Apache POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能. .NET的开发人员则 ...
- Java 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)
ava 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包) 假设现在要做一个通用的导入方法: 要求: 1.xml的只定义数据库表中的column字段,字段类型,是否非空等条件 ...
- Java POI 导入Excell
##Java POI 导入Excell 导入表格 public String toExcel(HttpServletRequest request, HttpServletResponse respo ...
最新文章
- 铁大Facebook——十天冲刺(5)
- 云主机和物理机PK图
- 接私活福音,validation组件敏捷开发,效率提升5倍!
- Canvas入门-利用Canvas绘制好玩的电子时钟
- 端口偷窃(Port Stealing)技术
- [导入]Ms XmlDom 异步装载Xml文件
- 一定要陪一个男人创业,你会和他一样快速成长,并内心变得强大
- 计算机网络数据链路层之其基础概述
- 插件制作教程 php,HYBBS插件开发教程 (简单插件) 初识篇
- PKPM学习:关于“悬空柱”的问题
- Tikhonov regularization 吉洪诺夫正则化(L2正则化)
- Centos 7 环境实现内网服务访问
- 安装Ubuntu虚拟机
- 010 Editor修改指令
- 数字电子技术基础——第三章 集成逻辑门电路
- 量化交易接口怎么自动选股票?
- dvwa详解_DVWA(六):XSS-Reflected 反射型XSS全等级详解
- linux端口映射到外网访问,Linux使用Iptables做端口映射远程访问无公网IP的SSH
- 井通区块链技术在教育行业的落地应用
- 再见阳朔-记在2010圣诞