问题的提出

使用java在导入excel表格时,一般采用hssfworkbook(excel2003)和xssfworkbook(excel2007)
首先获取workbook:

/*** 描述:根据文件后缀,自适应上传文件的版本* * @param inStr    将file.getInputStream()获取的输入流* @param fileName file.getOriginalFilename()获取的原文件名*/public static Workbook getWorkbook(InputStream inStr, String fileName) throws Exception {Workbook wb = null;String fileType = fileName.substring(fileName.lastIndexOf("."));if (excel2003L.equals(fileType)) {wb = new HSSFWorkbook(inStr); // 2003-} else if (excel2007U.equals(fileType)) {wb = new XSSFWorkbook(inStr); // 2007+} else {throw new Exception("解析的文件格式有误!");}return wb;}

使用List<List>类型存储读取到的数据

/*** * 读取指定sheet 页指定行数据* * @param sheetIx  指定 sheet 页,从 0 开始* @param startRow 指定开始行,从 0 开始* @param endRow   指定结束行,从 0 开始 start=end=0 就是第一行* @param startCol 指定开始列* @param startCol 指定结束列* @return* @throws Exception*/
public List<List<String>> read(int sheetIx, int startRow, int endRow, int startCol, int endCols) throws Exception {Sheet sheet = workbook.getSheetAt(sheetIx);List<List<String>> list = new ArrayList<List<String>>();if (endRow > getRowCount(sheetIx)) {endRow = getRowCount(sheetIx);}for (int i = startRow; i <= endRow; i++) {List<String> rowList = new ArrayList<String>();Row row = sheet.getRow(i);for (int j = startCol; j < endCols; j++) {if (row == null) {rowList.add(null);continue;}//rowList.add(getCellValue(row.getCell(j)));//取excel表中公式数据 ,表格中row.getCell(j).getCellTypeEnum() 可能会发生空指针错误,用try...catch处理try {if (row.getCell(j).getCellTypeEnum() == CellType.FORMULA) {row.getCell(j).setCellType(CellType.STRING);rowList.add(row.getCell(j).getStringCellValue());}else {rowList.add(getCellValueToString(row.getCell(j)));}}catch(Exception e) {rowList.add(getCellValueToString(row.getCell(j)));}}list.add(rowList);}return list;
}

这样是一般的处理过程,这样处理有个不好的地方就是拓展性不强,在后续调用List<List>数据时需知道在第几列,最致命的是表格添加字段或删除字段后,所有序号都得修改,所以需要解决这一问题。

问题的解决

本文新建工具类,采用反射技术动态的提取类方法

public class ArUtils<T> {private String[] ldcode = {"Id","Name", "A","B","C","D","E","F","AtpDeviceNo2","AtpDeviceNo16","Tpproperty1","Tpproperty2","Tpproperty3","Tpproperty4","Tpproperty5","Tpproperty6","Tpproperty7","Remarks"};private String id;private String name;private String a;private String b;

配置各私有属性的get,set方法。

/*** * 读取指定sheet 页指定行<T>数据* * @param sheetIx 指定 sheet 页,从 0 开始* @param start   指定开始行,从 0 开始* @param end     指定结束行,从 0 开始* @return* @throws Exception*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public List<List<T>> readGeneric(int sheetIx, int start, int end, T t) throws Exception {Sheet sheet = workbook.getSheetAt(sheetIx);List<List<T>> list = new ArrayList<List<T>>();if (end > getRowCount(sheetIx)) {end = getRowCount(sheetIx);}for (int i = start; i <= end; i++) {List<T> rowList = new ArrayList<T>();Row row = sheet.getRow(i);List rowdata = getRowdata(row);Class clazz = t.getClass();Object fa= clazz.newInstance();Method method = t.getClass().getMethod("getLdcode", new Class[]{});Object[] ldcode = (String[])method.invoke(fa, new Object[]{});for(int j = 0; j < rowdata.size(); j++) {method = t.getClass().getMethod("set"+ldcode[j], String.class);method.invoke(fa, rowdata.get(j));}rowList.add((T) fa);list.add(rowList);}return list;
}

首先反射获取string[]数组,数组中存储着各个私有属性,再调用个各属性的set方法,将一行数据存储进工具类的实例,这样就完成了键值对存储,之后调用时直接使用工具类的get方法就好了。

java实现excel动态表头导入相关推荐

  1. Java实现Excel多表头动态数据导出

    好久没时间写帖子了,由于工作需要,写一个基于JAVA实现的Excel多表头动态导出功能,首先可能这个叫法比较啰嗦,大家多担待下,下面我们先看看什么是Excel多表头动态导出(效果图): 它包含两部分: ...

  2. java横向导出excel_利用Java进行Excel的数据导入导出

    1. 引言 MS 的电子表格(Excel)是Office 的重要成员,是保存统计数据的一种常用格式.在一 个Java 应用中,将一部分数据生成Excel 格式,是与其他系统无缝连接的重要手段.在远程 ...

  3. Java EasyExcel 支持动态表头和单元格下拉导出

    需求背景:对于有些表头需要根据配置动态生成,做以下记录. 动态导出模板 测试工具类 package com.alibaba.easyexcel.test.demo.write;import com.a ...

  4. Java实现Excel文件的导入功能

    近期在工作上,遇到了实现Excel文件的导入功能,在此和小伙伴们分享一下过程. 实现Excel文件的导入呢,首先我们需要先上传文件,然后在后端进行解析文件中的内容.这里我们需要用到 poi 的这样一个 ...

  5. 用java将excel表单导入数据库表单----新手入门

    构建项目思路 1.利用Excel第三方工具,将Excel文件读取到内存中.使用最简单,方便的工具是apache的poi工具包,自己网上下载 http://poi.apache.org/ ,使用方法网上 ...

  6. 如何用java完成Excel快速的导入导出

    日常工作中,Excel是我们经常需要处理的文件,报表的生成,数据的导出,几乎每个项目都需要写对应的处理.作者也是编写这块代码大军的一员,能否有方法让我们不用重复编写代码呢,能否只要简单配置就可以完成我 ...

  7. JAVA实现Excel文件的导入导出

    版权声明:请勿用于任何商业用途的文章转载,转载请说明出处! 1.导入POI的JAR包 <!-- excel POI --><dependency><groupId> ...

  8. java实现excel文件批量导入数据

    具体实现: 以学生信息为例,将Excel模板信息配置在XML文件中,通过POI实现对excel文件读取操作,然后将读取的数据插入数据库中.具体思路是将模板信息配置在xml中,在项目启动时,通过spri ...

  9. java代码 EXCEL实战(一) 导入手机号

    一.需求描述: 管理后台用户管理模块下某用户操作界面,需要一个批量导入手机号的功能. 二.前端代码: 2.1 html代码 <table><tr><td><i ...

  10. java做 excel文件的 导入导出 (SSM+layer)

    做的项目使用时 Java ssm + 前端layer+ freemark. 因为是从项目中扣的代码.整理了下逻辑. 有问题的下方留言哈 导入的依赖 poi <!-- https://mvnrep ...

最新文章

  1. golang微信公众号请求获取信息
  2. 启明云端分享 | SSD201\SSD202D 核心板如何批量烧录,母片制作教程分享
  3. 三星手机续航测试软件,三星S21系列续航测试简报出炉
  4. mysql必知必会 create_mysql必知必会--检 索 数 据
  5. 即插即用,基于阿里云Ganos快速构建云上开源GIS方案
  6. java构造方法 this_Java中的构造方法this、super的用法详解
  7. java 货架高度摆放最优算法_商铺内部空间摆放竟暗藏玄机
  8. S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A)
  9. 解决 Python 连不上pip库的问题(使用国内镜像地址)
  10. 【题解】洛谷P2914[USACO08OCT]断电Power Failure
  11. (马世龙)Linux下CACTI完全搭建技术文档一
  12. echarts3 标线markLine
  13. Win系统 - 重装系统(微PE、MSDN镜像)【绝对纯净】
  14. 软件可维护性测试方法,软件可维护性
  15. Java生成csv文件设置文本格式
  16. i5 6500 HD530 台式机黑苹果记录
  17. 用lambda表达式写左联查询的示例
  18. autosar—com模块
  19. 中国工业大数据行业发展趋势分析与投资战略规划建议报告2022-2028年版
  20. 信息系统开发(JAVA)设计一个银行账户类

热门文章

  1. 【java web学习小结】JSP的response对象的动态响应实例
  2. html中pt与px的转换,关于网页中pt和px的单位换算!
  3. Halcon视觉实战例程之汉字识别
  4. Python Scrapy爬虫简单教程
  5. 土方回填施工方案范本_土方回填施工方案范例(模板)
  6. 生态参数反演(植被覆盖度FVC)手把手教会
  7. 二月二龙抬头【集锦】
  8. 2022 DSCTF首届数字空间安全攻防大赛
  9. 小学计算机无生试讲教案,小学英语无生试讲
  10. 腾讯云mysql最大数据量_被低估的腾讯云数据库