场景是这样的:为了做一个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 servicesSystem.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 {//存放serviceprivate 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 servicesSensorServices sensorservices=new SensorServices();//test berth servicesBerthService berthService=new BerthService();//注册service//SerivicesRegister register=new SerivicesRegister(sensorservices);
ExcelUtil.readAndSetData(file, new ExcelDataSetter() {@Overridepublic Sensor setCellData(HSSFRow row) {sensor.setName(row.getCell(0).getStringCellValue());sensor.setAge(row.getCell(1).getStringCellValue());return sensor;}},sensorservices);//test berth servicesExcelUtil.readAndSetData(file,new ExcelDataSetter() {@Overridepublic 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

针对上面的设计问题,希望各位指教指教。

转载于:https://www.cnblogs.com/juepei/p/4071128.html

使用回调方式写POI导入excel工具类相关推荐

  1. Java导入Excel工具类使用教程

    前言: 本工具类提供了Excel导入功能,通过反射机制将Excel中数据映射到实体类中,从而获取Excel数据,工具类依赖org.apache.poi包.支持RESTful API,支持Spring ...

  2. 自定义POI的excel工具类-xls-xlsx

    自定义POI的excel工具类-xls-xlsx 使用jdk8(java8)实现Excel导出,随意切换 xls和xlsx.自己只是封装了比较常用方法,07版生成还有bug.ε=(´ο`*)))唉 j ...

  3. poi导入数据工具类,直接复制使用,有详细注释

    poi导入工具类,直接复制使用,有详细的注释 前言 一.引入依赖 二.封装的工具类以及注解类直接copy使用 首先是工具类无需做操作 然后是封装的两个注解类,也是直接复制使用 测试工具类功能 测试实体 ...

  4. JAVA使用POI写入excel 工具类【通用】

    使用写入excel工具类的例子 说明:改工具类是网上公开的,来源现在找不着了,我只是在原基础上修改了下,抽离了泛型.如有侵权,请通知博主 工具类代码: package com.system.util; ...

  5. java 导入excel工具类_java Excel工具类,导入导出Excel数据

    java Excel工具类,导入导出Excel数据,导入数据对合并表格有判断获取数据: 导出数据到Excel,Excel文件不存在会创建. 使用的是poi处理,兼容Excel. 对反射不够理解,目前先 ...

  6. Java基于POI读取Excel工具类

    为什么为封装此工具类? 由于公司供应链部门业务需要,对Excel处理这块有较为严苛的要求.为了提高开发效率,从实际项目出发封装了通用自定义读取Excel工具类. 功能概述 支持读取全部excel数据 ...

  7. POI导入导出工具类

    导入POI依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</art ...

  8. POI导出Excel工具类(简单看完就会)

    (一)POI介绍 Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. .NET的开发人员则可以利用NPOI ...

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

    在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完成的功能是:读取Excel.汇总Exc ...

最新文章

  1. Linux命令scp用于远程文件的拷贝(上传和下载)
  2. 通过案例了解puppet创建虚拟资源解决资源冲突问题
  3. matlab优化算法案例分析与应用_最优化计算与matlab实现(18)——粒子群优化算法——权重改进的粒子群算法...
  4. P4126 [AHOI2009]最小割(网络流/最小割)
  5. mysql建表时主键_mysql建表时怎么设置主键?
  6. jQuery CSS 操作函数
  7. raw socket编程实例
  8. 朴素贝叶斯+拉普拉斯平滑代码实现
  9. 【亲测可用】win7下移动硬盘无法访问,拒绝访问位置不可用时的解决方案!
  10. 1060驱动java,丽境1060数位板驱动下载
  11. 进程间通信-消息机制
  12. [转]爬虫的现状和反爬虫
  13. C++ 重载、重写及其区别
  14. 私域流量池怎么运营?从三个点去考虑
  15. 字节跳动校招面试题演练
  16. ubuntu下docker的lnmp(二) 安装php-fpm之 下载镜像启动容器
  17. dir file list.file list.dirs
  18. 修炼内功——理解函数栈帧创建和销毁
  19. 设文件索引结点中有7个地址项
  20. (免费分享)基于JavaWeb的高校试题库管理系统设计与实现 毕业论文+项目源码及数据库文件(已发)

热门文章

  1. linux默认csh修改命令,Solaris中默认Shell的修改以及命令行补全的设置
  2. linux内核syscall_define6,Syscall系统调用Linux内核跟踪
  3. 如何阅读微控制器数据手册:简介和第一步
  4. Java基础-序列化与反序列化
  5. T-Mobile旗下网站又曝安全漏洞 允许任何人查看他人账户信息
  6. android连接sqlite进行简单的增删改查和事务管理
  7. Json串到json对象的转换
  8. 如何确定SharePoint 2007的一次增量爬网会处理多少条更新呢?
  9. CISCO-CCNA课程介绍
  10. hex文件和bin文件区别