使用回调方式写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 ...
随机推荐
- 使用生活实例理解Asp.net运行时
学习编程语言,掌握面向对象的编程思想尤为重要,一旦理解了面向对象的这种概念,那么好些地方拿到生活中去理解,就容易的多了.书本上的枯燥干涩的语言,对于好多人来说,即难懂,更难长时间牢牢记得.但是编程语言 ...
- 【Linux 进程】之关于父子进程之间的数据共享分析
之前我们通过fork()函数,得知了父子进程之间的存在着代码的拷贝,且父子进程都相互独立执行,那么父子进程是否共享同一段数据,即是否存在着数据共享.接下来我们就来分析分析父子进程是否存在着数据共享. ...
- OptionParser模块学习
from optparse import OptionParser import sys useage = [] test_parser = OptionParser(usage="%pro ...
- Linux符号连接的层数过多
转:http://blog.csdn.net/ta893115871/article/details/7458869 创建符号链接的时候一定要使用绝对路径,例如:/usr/local/cxxt/con ...
- yii创建与设置默认控制器并载入模板
yii创建与设置默认控制器并载入模板 一.创建控制器 在protected下的controllers文件夹中创建自定义的控制器文件,比如: IndexController.php (文件名首字母大写) ...
- 现代编译原理--第二章(语法分析之LR(1))
(转载请表明出处 http://www.cnblogs.com/BlackWalnut/p/4472772.html) 前面已经介绍过LL(1),以及如何使用LL(1)文法.但是LL(K)文法要求在 ...
- 201621123008 《Java程序设计》第一周学习总结
1. 本章学习总结 对于我们学计算机的学生而言,要想提高编程能力,只有多练习,把我们所学到的东西运用到实践中去,整天抱着书本冥思苦想而不动手到具体的环境中去试验是很难有所提升的.大一学C语言的时候平时 ...
- ubuntu下常用操作
屏幕截图: 可以用ubuntu自带的截图软件:gnome-screenshot. 该工具截图区域并且复制到剪切板命令为 gnome-screenshot -c -a,可以给该命令添加快捷方式,alt ...
- Mysql 查看表结构的命令
创建数据库create database abc; 显示数据库 show databases; 使用数据库 use 数据库名; 直接打开数据库 mysql -h localhost -u root - ...
- hive的用户和用户权限
HiverServer2支持远程多客户端的并发和认证,支持通过JDBC.Beeline等连接操作.hive默认的Derby数据库,由于是内嵌的文件数据库,只支持一个用户的操作访问,支持多用户需用mys ...