`
prodream
  • 浏览: 106136 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

POI的简单封装

阅读更多

在一次开发中,需要做excle数据导入。

 

开发中我发现,将一列作为一个对象来进行处理,可以大大的方便程序的操作.

 

package com.wac.business.filedataconvey.excle;
import ognl.Ognl;
import ognl.OgnlException;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import com.wac.business.filedataconvey.util.ExcleUtil;
import com.wac.business.filedataconvey.util.MsgBuilder;
public class ExcleColumn {
 //普通列
 public final static int COLUMN_TYPE_COMMON = 0;
 //金额列
 public final static int COLUMN_TYPE_MONEY = 1;
 //时间列
 public final static int COLUMN_TYPE_DATE = 2;
 //带下拉列
 public final static int COLUMN_TYPE_LIST = 3;
 //单元格允许填入的字符的最大长度
 public final static int MAX_LENGTH = 100;
 private HSSFWorkbook workbook = null;
 private String dataSheetName;
 private String referenceSheetName;
 private boolean emptyCellAllowed = false;
 private int posStartRow;
 private int size;
 private int colIndex;
 private String propertyName;
 private int columnType;
 private String errorMsg;
 private ListMap<String, String> vs = null;
 public ExcleColumn(HSSFWorkbook workbook) {
  if (workbook == null)
   throw new NullPointerException("workbook is null");
  this.workbook = workbook;
 }
 public String getDataSheetName() {
  return dataSheetName;
 }
 public void setDataSheetName(String dataSheetName) {
  this.dataSheetName = dataSheetName;
 }
 public void setReferenceSheetName(String referenceSheetName) {
  this.referenceSheetName = referenceSheetName;
 }
 public boolean isEmptyCellAllowed() {
  return emptyCellAllowed;
 }
 public void setEmptyCellAllowed(boolean emptyCellAllowed) {
  this.emptyCellAllowed = emptyCellAllowed;
 }
 public int getPosStartRow() {
  return posStartRow;
 }
 public void setPosStartRow(int posStartRow) {
  this.posStartRow = posStartRow;
 }
 public int getSize() {
  return size;
 }
 public void setSize(int size) {
  this.size = size;
 }
 public int getColIndex() {
  return colIndex;
 }
 public void setColIndex(int colIndex) {
  this.colIndex = colIndex;
 }
 public String getPropertyName() {
  return propertyName;
 }
 public void setPropertyName(String propertyName) {
  this.propertyName = propertyName;
 }
 public int getColumnType() {
  return columnType;
 }
 public void setColumnType(int columnType) {
  this.columnType = columnType;
 }
 public String getErrorMsg() {
  return errorMsg;
 }
 public void setErrorMsg(String errorMsg) {
  this.errorMsg = errorMsg;
 }
 public ListMap<String, String> getVs() {
  return vs;
 }
 public void setVs(ListMap<String, String> vs) {
  this.vs = vs;
 }
 public HSSFWorkbook getWorkbook() {
  return workbook;
 }
 public HSSFSheet getDataSheet() {
  return workbook.getSheet(this.dataSheetName);
 }
 public HSSFSheet getRefSheet() {
  return workbook.createSheet(this.referenceSheetName + colIndex);
 }
 /**
  *
  * @param rowIndex 行
  * @return
  */
 public HSSFCell getCell(int rowIndex) {
  HSSFSheet sheet = workbook.getSheet(this.dataSheetName);
  HSSFRow row = sheet.getRow(rowIndex);
  HSSFCell cell = row.getCell(this.colIndex);
  return cell;
 }
 public Object getValue(int rowIndex, MsgBuilder mb) {
  if (rowIndex < posStartRow || rowIndex >= posStartRow + size) {
   throw new IllegalAccessError("请求解析的行超出了可以解析行的范围");
  }
  Object o = ExcleUtil.parseCell(this,rowIndex);
  if (o == null&&!isEmptyCellAllowed()) {
   if (getCell(rowIndex) == null) {
    HSSFSheet sheet = workbook.getSheet(this.dataSheetName);
    HSSFRow row = sheet.getRow(rowIndex);
    HSSFCell cell=row.createCell(this.colIndex);
    mb.add(cell, errorMsg);
   } else
    mb.add(getCell(rowIndex), errorMsg);
   return null;
  }
  return o;
 }
 public void setBeanValue(int rowIndex, MsgBuilder mb, Object bean) {
  Object o = getValue(rowIndex, mb);
  if (o != null)
   try {
    Ognl.setValue(propertyName, bean, o);
   } catch (OgnlException e) {
    // TODO Auto-generated catch block
    throw new IllegalAccessError();
   }
  else {
   //如果为空,检查是否允许为空
   if (!isEmptyCellAllowed())
    throw new RuntimeException("先检查数据在做保持操作!");
  }
 }
}

 

1.首先抽象出了4类列

     下拉列表,日期,金额,普遍

2.方法:

    getCell(int rowIndex) 获取该对象在某行的cell对象

    parse(int rowIndex,MsgBuilder mb) 解析该对象在某列的cell的值

    setProperty(int rowIndex,MsgBuilder,Object o) 上一个方法的更高级的方法,实际上这个方法是要依赖上一方法的,而且考虑到内存的消耗,所以要调用parse对excle进行检查,然后调用setProperty 进行数据提取被封装到bean中.

分享到:
评论

相关推荐

    poi简单的封装工具

    【标题】"poi简单的封装工具"涉及到的主要知识点是Java中的Apache POI库,这是一个用于处理Microsoft Office格式文件的开源库,特别适用于Excel文件的操作。在Java编程中,Apache POI库提供了一种方便的方式来创建、...

    java中excel导出工具poi接口封装

    这种封装通常会创建一个或多个高级接口,隐藏了底层复杂的细节,让调用者能更简单、直观地完成Excel文件的导出操作。 Apache POI提供了HSSF(Horrible Spreadsheet Format)和XSSF(XML Spreadsheet Format)两个...

    POI操作Excel的封装

    1. **工作簿和工作表操作**:封装`Workbook`和`Sheet`的创建、读取和保存,提供简单的API如`createWorkbook()`,`readWorkbook()`,`saveWorkbook()`。 2. **单元格数据处理**:对`Row`和`Cell`的读写进行封装,例如`...

    高德地图POI搜索封装 iOS 集成一行代码调用

    这就是如何在iOS应用中集成高德地图POI搜索功能并进行封装,使得调用变得简单易行。这个过程涉及到地图SDK的集成、搜索请求的创建与发送、以及结果的处理和显示。通过封装,可以更好地管理和复用搜索逻辑,提升代码...

    poi导出excel二次封装,简单易用,完全不需要了解poi的api就可以使用

    对poi导出excel进行了二次封装,封装后只需要使用模板导出excel就可以了,简单易用,example包里面有几个实例,可以看看,该工程已经上传到github上了,有兴趣的同学可以一起来改进它,...

    基于poi对excel操作的简单封装和必要的poi3.17包

    基于poi对excel操作的简单封装及必要的poi3.17包。针对excel文件或输入流,按行或者单元格解析处理,提供简单的通用单元格数据获取方法(数字类单元格返回Double, 日期返回Date, 公式返回计算后的结果,其它返回...

    POI操作EXCEL文件的简单封装

    本篇文章将深入探讨如何使用Apache POI对Excel文件进行简单的封装,以便在Java项目中更方便地操作Excel数据。 首先,我们需要了解Apache POI的基本概念。POI提供了HSSF和XSSF两个API,分别用于处理老版本的BIFF8...

    Poi的运用,对poi进行了简单封装,可以上传,下载客户资料,可以读取模板下载客户资料

    Poi的运用,对poi进行了简单封装,可以上传,下载客户资料,可以读取模板下载客户资料

    POI 封装操作Excel(导入、导出)

    本例采用javabean + 注解的方式,对POI进行了封装,旨在针对不同的Excel文档用同样的方法处理,已到达代码的重复利用。该jar包包含导入 Import 和导出 Export Excel两部分。 (一)导入: /** * 描述: Excel 导入...

    java excle导出封装 poi jxls exlce导出源码

    jXLS提供了一种模板语法,使得开发者可以通过简单的占位符如`${key}`来动态填充数据。这种语法支持条件判断,例如`${key==1?"asdf":""}`,这表示如果`key`的值等于1,单元格将显示"asdf",否则显示空字符串。 在...

    基于POI的Excel操作Java类

    为更方便的使用POI的API来操作Excel(2003)文件,对POI中针对Excel文件的读写进行了简单封装。此类中包含以下功能: 1.根据模板创建Excel文件 2.获取及更新Excel文件内容 3.创建、复制Sheet 4.设置Sheet名称 ... ...

    easypoi POI封装工具类 office开发模板导入导出.zip

    【标题】"easypoi POI封装工具类 office开发模板导入导出"涉及的核心知识点是Java中的easypoi库以及Apache POI项目,它们主要用于处理Microsoft Office文档,如Excel、Word和PowerPoint。easypoi是对Apache POI进行...

    spring-excel-demo--poi 封装对象注解式导入导出--springboot--注释非常完整,适合初学者研究!!!

    只实现了简单的excel导入导出,不支持特殊模版的定义。 里面包含的知识点(适合初学者学习的demo): 1、poi-excel 基本操作(工具) 2、自定义注解的使用 3、全局异常捕获的定义 4、jkd1.8新特性:Lambda 表达式 、...

    poi解析导入word (简单Demo使用)

    在"poi解析导入word (简单Demo使用)"这个主题中,我们将深入探讨如何使用Apache POI库来读取、修改和创建Word文档。这个项目包含了一个POM文件(项目对象模型),一个Demo示例,以及一个docx文件,提供了完整的导入...

    简单poi导入excel2003 与2007

    标题 "简单poi导入excel2003 与2007" 暗示了这个压缩包中的内容可能涉及使用Apache POI库来处理不同版本的Excel文件,主要是Excel 2003和2007。Apache POI是Java中广泛使用的库,用于读取和写入Microsoft Office格式...

    POI导出Tree结构数据(连接线).doc

    为了避免此次坑,我们需要对其进行简单的封装,使得Row对象不被重复创建,确保指定行的Row对象只能创建一次。 我们可以使用getInstance()方法来获取Row对象,而不是使用默认的createRow()方法。这可以避免Row对象的...

    java导入导出excel需要poi包

    10. **最佳实践**: 在实际项目中,建议将POI操作封装为服务或工具类,以提高代码复用性和可维护性。 Apache POI库的强大之处在于其灵活性和广泛的兼容性,它为Java开发者提供了一种强大且易用的方式来处理Excel文件...

    安卓使用poi读取及修改word文档

    这通常需要引入如Android-POI这样的库,它是对Apache POI的轻量级封装,适合Android平台使用。 1. **集成Apache POI到Android项目** 在Android Studio中,可以通过Gradle依赖管理来添加Android-POI库。在项目的...

    POI3.9驱动模式读取excel2007封装为map(包含空单元格)

    通过POI3.9驱动模式读取excel2007时,对含有空的单位格处理实现,使用起来很简单了

    apache.poi所需要的jar包集合

    版本:4.1.0 jar包个数:7个 apache的poi,操作Excel的包,亲测 jdk11 maven项目环境下包含本地jar使用有效,并给出了简单易用的封装。 传送门:我的博文:基于poi4.1.0的Excel表读写操作 日期:2020.12.15日

Global site tag (gtag.js) - Google Analytics