场景是这样的:为了做一个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工具类的更多相关文章

  1. 自己封装的poi操作Excel工具类

    自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...

  2. 在java poi导入Excel通用工具类示例详解

    转: 在java poi导入Excel通用工具类示例详解 更新时间:2017年09月10日 14:21:36   作者:daochuwenziyao   我要评论   这篇文章主要给大家介绍了关于在j ...

  3. java里poi操作Excel工具类【我改】

    参考原文: https://www.cnblogs.com/yizhang/p/7244917.html 我改: package test; import java.io.File; import j ...

  4. 使用POI导出EXCEL工具类并解决导出数据量大的问题

    POI导出工具类 工作中常常会遇到一些图表需要导出的功能,在这里自己写了一个工具类方便以后使用(使用POI实现). 项目依赖 <dependency> <groupId>org ...

  5. POI读取excel工具类 返回实体bean集合(xls,xlsx通用)

    本文举个简单的实例 读取上图的 excel文件到 List<User>集合 首先 导入POi 相关 jar包 在pom.xml 加入 <!-- poi --> <depe ...

  6. poi 导入/导出 工具类

    package com.holy.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOExcept ...

  7. POI读取excel工具类(xls,xlsx通用)

    package com.boot.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotF ...

  8. poi读取excel工具类

    package com.manage.utils; import ch.qos.logback.core.net.SyslogOutputStream; import com.google.gson. ...

  9. POI生成Excel工具类

    import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInp ...

随机推荐

  1. The partial charge density (1)

    ============================================================================================= The pa ...

  2. 二叉树的创建、遍历(递归和非递归实现)、交换左右子数、求高度(c++实现)

    要求:以左右孩子表示法实现链式方式存储的二叉树(lson—rson),以菜单方式设计并完成功能任务:建立并存储树.输出前序遍历结果.输出中序遍历结果.输出后序遍历结果.交换左右子树.统计高度,其中对于 ...

  3. np.hsplit()

    numpy.hsplit numpy.hsplit(ary, indices_or_sections)[source] Split an array into multiple sub-arrays ...

  4. Windows phone 自定义控件(无外观控件)——ColorPicker

    编码前 在上一篇博客中,写的是一个UserControl的子类,它具有固定的外观(虽然也可以通过样式来进行修改,但受到的限制很大).如果你想要使用这个控件的逻辑,但是希望在使用的时候可以更改控件的外观 ...

  5. 115. Distinct Subsequences (String; DP)

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...

  6. 5.Longest Palindromic Substring (String; DP, KMP)

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  7. 【英宝通Unity4.0公开课学习 】(六)76讲到90讲

    还是关于Mecanim动画的内容. 这些讲的每讲长度明显比前面的长,而且很多都涉及到脚本编写. 不过我还是2倍速给略览过去了,主要目的就是学个框架嘛 :) 1. Blend Tree 可嵌套. 可理解 ...

  8. MongoDB安装(一)

    详细图解,记录 win7 64 安装mongo数据库的过程.安装的版本是 MongoDB-win32-x86_64-2008plus-ssl-3.4.1-signed. 示例版本:mongodb-wi ...

  9. struts框架问题五之向值栈中保存数据

    5. 问题五: 向值栈保存数据 (主要针对root栈) > valueStack.push(Object obj); * push方法的底层调用root对象的push方法(把元素添加到0位置) ...

  10. 使用jmeter工具测试上传接口

    1.方法选择post:上传都是post上传. 2.路径输入正确的上传接口路径,并勾选Use multipart/form-data for POST 3.添加文件,文件路径尽量不要有中文,防止编码问题 ...