java实现excel动态表头导入
问题的提出
使用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动态表头导入相关推荐
- Java实现Excel多表头动态数据导出
好久没时间写帖子了,由于工作需要,写一个基于JAVA实现的Excel多表头动态导出功能,首先可能这个叫法比较啰嗦,大家多担待下,下面我们先看看什么是Excel多表头动态导出(效果图): 它包含两部分: ...
- java横向导出excel_利用Java进行Excel的数据导入导出
1. 引言 MS 的电子表格(Excel)是Office 的重要成员,是保存统计数据的一种常用格式.在一 个Java 应用中,将一部分数据生成Excel 格式,是与其他系统无缝连接的重要手段.在远程 ...
- Java EasyExcel 支持动态表头和单元格下拉导出
需求背景:对于有些表头需要根据配置动态生成,做以下记录. 动态导出模板 测试工具类 package com.alibaba.easyexcel.test.demo.write;import com.a ...
- Java实现Excel文件的导入功能
近期在工作上,遇到了实现Excel文件的导入功能,在此和小伙伴们分享一下过程. 实现Excel文件的导入呢,首先我们需要先上传文件,然后在后端进行解析文件中的内容.这里我们需要用到 poi 的这样一个 ...
- 用java将excel表单导入数据库表单----新手入门
构建项目思路 1.利用Excel第三方工具,将Excel文件读取到内存中.使用最简单,方便的工具是apache的poi工具包,自己网上下载 http://poi.apache.org/ ,使用方法网上 ...
- 如何用java完成Excel快速的导入导出
日常工作中,Excel是我们经常需要处理的文件,报表的生成,数据的导出,几乎每个项目都需要写对应的处理.作者也是编写这块代码大军的一员,能否有方法让我们不用重复编写代码呢,能否只要简单配置就可以完成我 ...
- JAVA实现Excel文件的导入导出
版权声明:请勿用于任何商业用途的文章转载,转载请说明出处! 1.导入POI的JAR包 <!-- excel POI --><dependency><groupId> ...
- java实现excel文件批量导入数据
具体实现: 以学生信息为例,将Excel模板信息配置在XML文件中,通过POI实现对excel文件读取操作,然后将读取的数据插入数据库中.具体思路是将模板信息配置在xml中,在项目启动时,通过spri ...
- java代码 EXCEL实战(一) 导入手机号
一.需求描述: 管理后台用户管理模块下某用户操作界面,需要一个批量导入手机号的功能. 二.前端代码: 2.1 html代码 <table><tr><td><i ...
- java做 excel文件的 导入导出 (SSM+layer)
做的项目使用时 Java ssm + 前端layer+ freemark. 因为是从项目中扣的代码.整理了下逻辑. 有问题的下方留言哈 导入的依赖 poi <!-- https://mvnrep ...
最新文章
- golang微信公众号请求获取信息
- 启明云端分享 | SSD201\SSD202D 核心板如何批量烧录,母片制作教程分享
- 三星手机续航测试软件,三星S21系列续航测试简报出炉
- mysql必知必会 create_mysql必知必会--检 索 数 据
- 即插即用,基于阿里云Ganos快速构建云上开源GIS方案
- java构造方法 this_Java中的构造方法this、super的用法详解
- java 货架高度摆放最优算法_商铺内部空间摆放竟暗藏玄机
- S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A)
- 解决 Python 连不上pip库的问题(使用国内镜像地址)
- 【题解】洛谷P2914[USACO08OCT]断电Power Failure
- (马世龙)Linux下CACTI完全搭建技术文档一
- echarts3 标线markLine
- Win系统 - 重装系统(微PE、MSDN镜像)【绝对纯净】
- 软件可维护性测试方法,软件可维护性
- Java生成csv文件设置文本格式
- i5 6500 HD530 台式机黑苹果记录
- 用lambda表达式写左联查询的示例
- autosar—com模块
- 中国工业大数据行业发展趋势分析与投资战略规划建议报告2022-2028年版
- 信息系统开发(JAVA)设计一个银行账户类