使用回调方式写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

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

时间: 2024-10-22 04:31:35

使用回调方式写POI导入excel工具类的相关文章

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

该工具类主要完成的功能是:读取Excel.汇总Excel的功能.在读取时,可以设定开始和结束读取的位置.设定是否读取多个sheet.设定读取那个或者那些sheet等.在汇总时,如设定是否覆盖目标文件.设定是否比较检查重复内容.设定检查重复的列索引等功能. package com.tgb.ccl.excel.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; impo

POI读取excel工具类 返回实体bean集合

本文举个简单的实例 读取上图的 excel文件到 List<User>集合 首先 导入POi 相关 jar包 在pom.xml 加入 <!-- poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> </dependency> &l

poi操作Excel工具类

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

导入Excel工具类

import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.stereotype.Component; import or

java中excel导入\导出工具类

1.导入工具 1 package com.linrain.jcs.test; 2 3 4 import jxl.Cell; 5 import jxl.Sheet; 6 import jxl.Workbook; 7 import jxl.write.Label; 8 import jxl.write.WritableSheet; 9 10 import java.io.InputStream; 11 import java.lang.reflect.Field; 12 import java.te

一个基于POI的通用excel导入导出工具类的简单实现及使用方法

前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴.经过思考,认为一百个客户在录入excel的时候,就会有一百个格式版本,所以在实现这个功能之前,所以要统一excel的格式.于是提供了一个通用excel模版的下载功能.当所有客户用模版录入好数据再上传到系统,后端对excel进行解析,然后再持久化到数据库. 概述: 此工具类的几大特点 1.基本导入导出

ASP.NET写一个导入EXCEL ,错误调整方式

这两天用ASP.NET写一个导入EXCEL数据到ORACLE的程序,调试通过,但是部署到服务器上就不能用了. Retrieving the COM class factory for component with CLSID {00024500-0000-000 后来终于解决: 在服务器上, 1,运行dcomcnfg打开组件服务 2,依次展开"组件服务"->"计算机"->"我的电脑"->"DCOM配置" 3,

Java 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)

ava 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包) 假设现在要做一个通用的导入方法: 要求: 1.xml的只定义数据库表中的column字段,字段类型,是否非空等条件. 2.excel定义成模板,里面只填写了所需要的数据,有可能数据有问题. 3.在导入的时候就需要对每个excel单元格的数据进行验证. 4.验证完之后,若所有数据正确,那么批量保存.若有一点点错误,就不执行保存操作,并提示错误原因. 思路: 1.完美使用了Map的功能,先将xml中的数据存入map

poi导入excel

Spring+SpringMVC+Maven+MyBatis+Mysql此环境下的POI导入 此文档讲解Excel导入的功能 1.1 POI导入excel 浏览器效果展示: 前端代码 前端Html代码: <!-- 导入 --> <div class="layui-inline"> <div class="layui-input-block" style="margin-left: 10px;"> <but