自己造轮子系列:web环境下解析上传的excel文件中的数据的开源库

来源:互联网 发布:网络推广大熊猫优化 编辑:程序博客网 时间:2024/06/08 05:06

作为一名web开发人员,必然接触过处理上传的excel文件的业务(通常是解析其中的数据并且存储到数据库中)。为了下次再遇到类似的业务场景可以无缝使用已经写过的代码,我选择了将此业务中的逻辑抽取出来,写成一个通用的Java类库,并且打包为jar文件,这样下次就可以直接在工程中引用,无需再次编写业务代码。本着分享的原则,我把代码开源到了GitHub(经过实际项目的测试,具有可靠性),有兴趣的朋友可以去看看,项目地址:terencewu.excel,打包后发布的jar文件的下载地址为:terencewu.excel.jar(建议下载最新版,以前的版本有一些bug)。最新版的jar包支持xls以及xlsx格式的解析,并且添加了对于excel中空白单元格的处理,调试信息也非常丰富。下面我就来介绍一下这个jar如何使用,以及适用的场景。

1.适用的业务场景以及处理方式

一个web项目需要导入excel文件,并且解析其中的数据,把数据存储到数据库中。一般来说,我们考虑把一行数据包装成一个类的实例,然后对这个实例进行持久化操作,考虑这个业务场景下的几种情况:

(1.1) excel表格中的元数据与业务类的字段完全一致。

在这种情况下,我们只需要编写一个业务实体类,并且提供以下参数:

 临时文件目录(String), excel文件的存储路径(String)(不带有最后的文件分隔符), , 缓冲区大小(int), 文件最大尺寸(long), excel文件数据开始的行号(int)(是需要插入的数据开始的行号,不是表头所在的行号), 数据开始的列号(int)将上述数据根据上述显示的顺序放入到一个Object[]中, 假设命名为configs 获取一个ExcelProcessor对象: ExcelProcessor processor = ExcelProcessor.getExcelProcessor();设置processor的属性: processor.setConfigurations(Object[] configs, Connection connection); //configs为第2步设置的数组, connection为数据库连接对象执行实际的excel操作: processor.storeExcelDatas(HttpServletRequest request, Class classT, String[] fieldsNames, String sql)(将会返回存储失败的业务对象的List集合)(request为包含上传的excel文件的http请求, classT为与excel表头对应的业务实体对象的Class对象, fieldsNames为业务类中需要插入到数据库中的那些域名称的数据, sql为带有通配符"?"的SQL语句)


(1.2) 数据库中需要插入一个类似id功能的字段(不是数据库自动生成),或者是某类状态数据(是否审核,是否提交),而excel表格中并没有提供该类数据。

(1.2.1) 根据id的类型继承相应的抽象类,若是整型,那么自定义业务类,继承AbstractIntegerIdDomain;若是字符串类型,则业务类继承AbstractStringIdDomain, 假设继承完以后的业务类为AbstractDomain(1.2.2) 若数据库中需要插入一些状态相关的字段(如是否提交,是否审核等),而这些字段在excel中也没有,那么在做完第一步的工作时,需要在AbstractDomain中添加上述状态字段(1.2.3) 编写实际的业务类,需要继承AbstractDomain,且添加上与excel表头对应的字段(注意顺序不能乱)(1.2.4) 生成HttpParser对象: HttpParser parser = getHttpParser(String fileStoredPath, String tempFilePath, int bufferSize, long maxFileSize);(1.2.5) 生成HSSFWorkbook对象的List(若上传了多个excel文件,只有一个文件的情况下,List的大小为1) List workbooks = parser.generateHssfWorkbooks(HttpServletRequest request, String fileStoredPath);(1.2.6) 生成ExcelReader对象: ExcelReader reader = ExcelReader.getExcelReader(int dataBeginRowNum, int dataBeginColumnNum); //数据开始的行号和列号(1.2.7) reader从HSSFWorkbook对象中读取数据,并把数据包装成业务类的对象,放置在List中: List domains = reader.read(HSSFWorkbook workbook, Class classT); //classT为业务类的Class对象(1.2.8) 生成ExcelStorer对象: ExcelStorer storer = ExcelStorer.getExcelStorer(Connection connection);(1.2.9) 把从reader中读出来的List用storer进行持久化操作,将会返回插入失败的业务对象的List: List failedList = storer.store(List entities, String[] fieldsNames, String sql); //sql语句必须带有通配符"?", fieldsNames为需要插入数据库的域名称的数组

2.需要注意的问题

业务实体对象类的设置问题:

(1) 类设计过程中,各个域名称的定义顺序应该与excel文件中表头数据定义的顺序一致

(2) 基本数据类型(int, long, short, double等),应该将其设置为包装类: 如private int a应该设置为private Integer a

(3) 类设计应该严格遵守JavaBean的设计原则: 每一个域都设置set和get方法, set和get方法的格式: set加上域名称,其中域名称的第一个字母大写, 如有一个username域, 它的set和get方法应为setUsername和getUsername

(4) 类中必须包含一个用于生成实例的方法,且该方法没有参数,该方法的命名规则为: get + 类名, 如User类中应该定义getUser()方法

(5) 若excel文件中不包含类似于id的数据,而数据库以及业务对象中要求此类id数据,客户端可以选择继承terencewu.excel.domain包中的两个抽象类之一

(6) 若选择继承domain包中的某个抽象类,那么在插入数据库之前,必须手动设置每个业务对象的id号

excel格式的问题:

(1) 上传的文件的格式需要统一,主要体现在数据开始的行号和列号上,否则可能出现异常

3.依赖的jar包(下载地址:依赖的jar)

(3.1) commons-fileupload-1.3.2.jar

(3.2) commons-io-2.5.jar

(3.3) j2ee.jar(web项目中必需)

(3.4) poi的各个jar包

(3.5) terencewu.fileupload-v1.2-beta.jar

(3.6) xmlbeans-2.6.0.jar(生成xlsx格式的excel文件对应的XSSFWorkbook对象时需要)

0 0
原创粉丝点击