使用回调方式写POI导入excel工具类
场景是这样的:为了做一个excel导入的功能,为了尽可能的写一个通用的工具类,将与poi有关的东西都封装起来,以便以其他人员只用关心自己的业务,不用和poi打交道。
写到最后,现在还是会有poi的东西暴漏出来一点,暴漏出来的这个应该是必须的。
为了模拟这个场景,先写两个service方法,用于和数据库交互,存入从模板中读取的数据。代码如下:
1.berthservice
public class BerthService {
public void update(){
System.out.println("this is berth service");
}
}
2.sensorservice
public class SensorServices {
public void update(Sensor sensor){
//do services
System.out.println("success update:"+sensor.getName());
}
}
之所以要写两个service,是为了测试,对于同一个xls模板,是不是可以使用两次。
然后需要写一个实体类,用于将模板中的数据存入其中,这里只写一个sensor的。
3.sensor
public class Sensor {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
上面的准备工作完毕,这里使用回调,需要一个接口,这里其实暴露出了POI里面的HSSFROW这个对象。
public interface ExcelDataSetter {
public Object setCellData(HSSFRow row);
}
然后就是最重要的工具类,传入上面的接口,这个用来读取xls文件,并且进行业务操作的,这里涉及到的都是关于POI的一些操作。
public class ExcelUtil {
//存放service
private static List serviceList=new ArrayList();
public static void readAndSetData(File file,ExcelDataSetter dataSetter, Object services){
FileInputStream fileInputStream=null;
try {
fileInputStream=new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
POIFSFileSystem fs= null;
HSSFSheet hssfSheet=null;
Object dataObj=null;
List<Object> list=new ArrayList<Object>();
Map map=null;
try {
fs = new POIFSFileSystem(fileInputStream);
HSSFWorkbook wb=new HSSFWorkbook(fs);
hssfSheet=wb.getSheetAt(0); // 获取第一个Sheet页
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (hssfSheet!=null){
for (int rowNum=2;rowNum<=hssfSheet.getLastRowNum();rowNum++){
HSSFRow row=hssfSheet.getRow(rowNum);
if (row==null){
continue;
}
//填充数据到对象中
dataObj= dataSetter.setCellData(row);
/*Sensor sensor= (Sensor) dataObj;
System.out.println("get sensor data:"+sensor.getName());
System.out.println("get sensor age:"+sensor.getAge());
services.update(sensor);*/
doServices(services,dataObj);
}
}
}
public static void doServices(Object o,Object dataObj){
if (o instanceof SensorServices) {
Sensor sensor = (Sensor) dataObj;
((SensorServices) o).update(sensor);
}
if (o instanceof BerthService) {
((BerthService) o).update();
}
}
public static void registeService(List list){
serviceList=list;
}
}
在填充数据到对象中之后,调用doServices方法,与数据库进行交互。
这里设计的不是很合理,因为可能会有很多个services方法,doServices里面,这里是写死的,然后根据类型来判断。之前是想设计一个registeService方法,其他人员采用的时候,先在这里注册一下自己的service,就不需要写死service了。这里如果有高手有比较合理的设计方式,请指教指教。
写一个main方法,测试一下。
public class Main {
public static void main(String args[]){
File file=new File("F:/G/test.xls");
final Sensor sensor=new Sensor();
//test sensor services
SensorServices sensorservices=new SensorServices();
//test berth services
BerthService berthService=new BerthService();
//注册service
//SerivicesRegister register=new SerivicesRegister(sensorservices);
ExcelUtil.readAndSetData(file, new ExcelDataSetter() {
@Override
public Sensor setCellData(HSSFRow row) {
sensor.setName(row.getCell(0).getStringCellValue());
sensor.setAge(row.getCell(1).getStringCellValue());
return sensor;
}
},sensorservices);
//test berth services
ExcelUtil.readAndSetData(file,new ExcelDataSetter() {
@Override
public Object setCellData(HSSFRow row) {
return null;
}
},berthService);
}
}
读取的文件里面,有两行数据。

运行main方法,在控制台,就会打印出service中的语句,模拟service的操作。sensor的service是读取该模板的内容并,berthservice纯粹是打印语句。
控制台输出:
success update:wll
success update:zhangsan
this is berth service
this is berth service
针对上面的设计问题,希望各位指教指教。
使用回调方式写POI导入excel工具类的更多相关文章
- 自己封装的poi操作Excel工具类
自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...
- 在java poi导入Excel通用工具类示例详解
转: 在java poi导入Excel通用工具类示例详解 更新时间:2017年09月10日 14:21:36 作者:daochuwenziyao 我要评论 这篇文章主要给大家介绍了关于在j ...
- java里poi操作Excel工具类【我改】
参考原文: https://www.cnblogs.com/yizhang/p/7244917.html 我改: package test; import java.io.File; import j ...
- 使用POI导出EXCEL工具类并解决导出数据量大的问题
POI导出工具类 工作中常常会遇到一些图表需要导出的功能,在这里自己写了一个工具类方便以后使用(使用POI实现). 项目依赖 <dependency> <groupId>org ...
- POI读取excel工具类 返回实体bean集合(xls,xlsx通用)
本文举个简单的实例 读取上图的 excel文件到 List<User>集合 首先 导入POi 相关 jar包 在pom.xml 加入 <!-- poi --> <depe ...
- poi 导入/导出 工具类
package com.holy.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOExcept ...
- POI读取excel工具类(xls,xlsx通用)
package com.boot.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotF ...
- poi读取excel工具类
package com.manage.utils; import ch.qos.logback.core.net.SyslogOutputStream; import com.google.gson. ...
- POI生成Excel工具类
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInp ...
随机推荐
- ECMAScript5之JSON对象属性的遍历顺序
测试浏览器 Chrome.Safari 一 键可以用parseInt解析成整数的,按数值升序顺序. var intObj = { '3.3' : 3.3, '2' : 222, '1' :111 } ...
- mybatis sql语句符号问题
写sql语句<或>不能直接写,而应写作<或>,不然项目不能正常编译启动
- sqlserver查询效率 (转)
很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select * from table1 where name='zhan ...
- 【JVM】浅谈双亲委派和破坏双亲委派
一.前言 笔者曾经阅读过周志明的<深入理解Java虚拟机>这本书,阅读完后自以为对jvm有了一定的了解,然而当真正碰到问题的时候,才发现自己读的有多粗糙,也体会到只有实践才能加深理解,正应 ...
- php 中的信号处理
首先我们需要了解几个函数 pcntl_signal 安装信号处理器,也就是当指定信号发生时,调用函数. pcntl_alarm 指定秒数后向进程发送SIGALRM信号. posix_getpi ...
- mysql优化概述2
一.索引的概念 利用关键字,就是记录的部分数据(某个字段,某些字段,某个字段的一部份),建立与记录位置的对应关系,就是索引.索引的关键字一定是排序的. 二.索引的类型 mysql支持四种索引: 1.主 ...
- 把Linq查询返回的var类型的数据 转换为DataTable EF连接查询
问题:我要获得一个角色下对应的所有用户,需要两表连接查询,虽然返回的只有用户数据,但是我想到若是返回的不只是用户数据,而还要加上角色信息,那么我返回什么类型呢,返回var吗,这样不行. 于是我网上找找 ...
- js记录
--获取后缀名,结果 .jpg var extName = "/upload/head_img/20150902102539.jpg";var ta = extName.subst ...
- 原生JS获取地址了参数
方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var reg = new RegExp("( ...
- TPM、read counts、RPKM/FPKM你选对了吗?
TPM.read counts.RPKM/FPKM你选对了吗? 已有 3940 次阅读 2017-12-15 15:04 |个人分类:RNA-seq|系统分类:科普集锦|关键词:RNA-seq| RN ...