使用回调方式写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 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工具类相关推荐
- Java导入Excel工具类使用教程
前言: 本工具类提供了Excel导入功能,通过反射机制将Excel中数据映射到实体类中,从而获取Excel数据,工具类依赖org.apache.poi包.支持RESTful API,支持Spring ...
- 自定义POI的excel工具类-xls-xlsx
自定义POI的excel工具类-xls-xlsx 使用jdk8(java8)实现Excel导出,随意切换 xls和xlsx.自己只是封装了比较常用方法,07版生成还有bug.ε=(´ο`*)))唉 j ...
- poi导入数据工具类,直接复制使用,有详细注释
poi导入工具类,直接复制使用,有详细的注释 前言 一.引入依赖 二.封装的工具类以及注解类直接copy使用 首先是工具类无需做操作 然后是封装的两个注解类,也是直接复制使用 测试工具类功能 测试实体 ...
- JAVA使用POI写入excel 工具类【通用】
使用写入excel工具类的例子 说明:改工具类是网上公开的,来源现在找不着了,我只是在原基础上修改了下,抽离了泛型.如有侵权,请通知博主 工具类代码: package com.system.util; ...
- java 导入excel工具类_java Excel工具类,导入导出Excel数据
java Excel工具类,导入导出Excel数据,导入数据对合并表格有判断获取数据: 导出数据到Excel,Excel文件不存在会创建. 使用的是poi处理,兼容Excel. 对反射不够理解,目前先 ...
- Java基于POI读取Excel工具类
为什么为封装此工具类? 由于公司供应链部门业务需要,对Excel处理这块有较为严苛的要求.为了提高开发效率,从实际项目出发封装了通用自定义读取Excel工具类. 功能概述 支持读取全部excel数据 ...
- POI导入导出工具类
导入POI依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</art ...
- POI导出Excel工具类(简单看完就会)
(一)POI介绍 Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. .NET的开发人员则可以利用NPOI ...
- 自己封装的poi操作Excel工具类
在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完成的功能是:读取Excel.汇总Exc ...
最新文章
- Linux命令scp用于远程文件的拷贝(上传和下载)
- 通过案例了解puppet创建虚拟资源解决资源冲突问题
- matlab优化算法案例分析与应用_最优化计算与matlab实现(18)——粒子群优化算法——权重改进的粒子群算法...
- P4126 [AHOI2009]最小割(网络流/最小割)
- mysql建表时主键_mysql建表时怎么设置主键?
- jQuery CSS 操作函数
- raw socket编程实例
- 朴素贝叶斯+拉普拉斯平滑代码实现
- 【亲测可用】win7下移动硬盘无法访问,拒绝访问位置不可用时的解决方案!
- 1060驱动java,丽境1060数位板驱动下载
- 进程间通信-消息机制
- [转]爬虫的现状和反爬虫
- C++ 重载、重写及其区别
- 私域流量池怎么运营?从三个点去考虑
- 字节跳动校招面试题演练
- ubuntu下docker的lnmp(二) 安装php-fpm之 下载镜像启动容器
- dir file list.file list.dirs
- 修炼内功——理解函数栈帧创建和销毁
- 设文件索引结点中有7个地址项
- (免费分享)基于JavaWeb的高校试题库管理系统设计与实现 毕业论文+项目源码及数据库文件(已发)