使用回调方式写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 ...
随机推荐
- go,函数作为参数类型
package main import "fmt" type testInt func(int) bool // 声明了一个函数类型 func isOdd(integer int) ...
- pre换行段落间距
<!DOCTYPE html><html><head lang="en"><meta charset="UTF-8"& ...
- cdoj第13th校赛初赛H - Hug the princess
http://acm.uestc.edu.cn/#/contest/show/54 H - Hug the princess Time Limit: 3000/1000MS (Java/Others) ...
- Asp.net实现同页面内多图片自动上传并带预览显示
FileUpload控件实现单按钮图片自动上传并带预览显示 1.实现原理: 此方法适合针对有后台生成的图片相关内容,例如购物网站商品展示页面中的封面图片,图片的数量由后台访问数据库,并加载到页面.这种 ...
- 二叉树中的最大路径和 · Binary Tree Maximum Path Sum
[抄题]: 给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和) [思维问题]: 不会写分合法 [一句话思路]: 用两次分治:ro ...
- 创建HTML元素的方法
第一种:使用 parent.appendchild()方法 HTML页面 <div id="div1"></div> JS文件 //第一步创建标签元素节点 ...
- AE教程:学会这个,你做的Logo就可以单独出道了
一.确定所需要做的动效 1.制作logo背景形状动效 2.制作U的动效 3.制作I的动效 4.制作消失动效 二.制作logo背景形状动效1.”合成 - 新建合成“ 新建一个1000*800的合成 2. ...
- To set Nginx Upload Size For “413–Request Entity Too Large” Error
Modify NGINX Configuration File sudo nano /etc/nginx/nginx.conf Search for this variable: client_max ...
- Debian use sudo
刚安装好的Debian默认还没有sudo功能.1.安装sudo# apt-get install sudo2.编辑 /etc/sudoers ,添加如下行# visudoroot ALL=(ALL:A ...
- Java NIO系列教程(十一) Java NIO 与 IO
Java NIO系列教程(十一) Java NIO与IO 当学习了 Java NIO 和 IO 的 API 后,一个问题马上涌入脑海: 我应该何时使用 IO,何时使用 NIO 呢?在本文中,我会尽量清 ...