如果我们遇到把excel表格中的数据导入到数据库,首先我们要做的是:将excel中的数据先读取出来。
因此,今天就给大家分享一个读取excel表格数据的代码示例:
为了演示方便,首先我们创建一个spring boot项目;具体创建过程这里不再详细介绍;
示例代码主要使用了apache下的poi的jar包及api;因此,我们需要在pom.xml文件中导入以下依赖:
<dependency> <groupid>org.apache.poi</groupid> <artifactid>poi<腺嘌呤核糖核苷酸;/artifactid> <version>3.13</version> </dependency> <dependency> <groupid>org.apache.poi</groupid> <artifactid>poi-ooxml</artifactid> <version>3.13</version> </dependency>
主要代码:
excelutils.java
import com.example.springbatch.xxkfz.annotation.excelfield;import lombok.extern.slf4j.slf4j;import org.apache.poi.hssf.urmodel.hssfrow;import org.apache.poi.hssf.urmodel.hssfsheet;import org.apache.poi.hssf.urmodel.hssfworkbook;import java.io.file;import java.io.fileinputstream;import java.io.filenotfoundexception;import java.io.ioexception;import java.lang.reflect.field;import java.lang.reflect.method;import java.math.bigdecimal;import java.util.arraylist;import java.util.list;import java.util.objects;/** * @author xxkfz * excel工具类 */@slf4jpublic class excelutils { private hssfworkbook workbook; public excelutils(string filedir) { file file = new file(filedir); try { workbook = new hssfworkbook(new fileinputstream(file)); } catch (filenotfoundexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } } /** * 读取excel数据 * * @param sheetname * @param object * @return */ public list readfromexceldata(string sheetname, object object) { list result = new arraylist(); // 获取该对象的class对象 class class_ = object.getclass(); // 获得该类的所有属性 field[] fields = class_.getdeclaredfields(); // 读取excel数据 获得指定的excel表 hssfsheet sheet = workbook.getsheet(sheetname); // 获取表格的总行数 int rowcount = sheet.getlastrownum() + 1; // 需要加一 if (rowcount < 1) { return result; } // 获取表头的列数 int columncount = sheet.getrow(0).getlastcellnum(); // 读取表头信息,确定需要用的方法名---t方法 // 用于存储方法名 string[] methodnames = new string[columncount]; // 表头列数即为需要的t方法个数 // 用于存储属性类型 string[] fieldtypes = new string[columncount]; // 获得表头行对象 hssfrow titlerow = sheet.getrow(0); // 遍历表头列 for (int columnindex = 0; columnindex < columncount; columnindex++) { // 取出某一列的列名 string colname = titlerow.getcell(columnindex).tostring();/* // 将列名的首字母字母转化为大写 string ucolname = character.toupperca(colname.charat(0)) + colname.substring(1, colname.length()); // t方法名存到methodnames methodnames[columnindex] = "t" + ucolname;*/ // string fieldname = fields[columnindex].getname(); string upperfieldname = character.toupperca(fieldname.charat(0)) + fieldname.substring(1, fieldname.length()); methodnames[columnindex] = "t" + upperfieldname; // 遍历属性数组 for (int i = 0; i < fields.length; i++) { // 获取属性上的注解name值 string name = fields[i].getannotation(excelfield.class).name(); // 属性与表头相等 if (objects.nonnull(name) && colname.equals(name)) { // 将属性类型放到数组中 fieldtypes[columnindex] = fields[i].gettype().getname(); } } } // 逐行读取数据 从1开始 忽略表头 for (int rowindex = 1; rowindex < rowcount; rowindex++) { // 获得行对象 hssfrow row = sheet.getrow(rowindex); if (row != null) { object obj = null; // 实例化该泛型类的对象一个对象 try { obj = class_.newinstance(); 清明寒食是为了纪念谁 } catch (exception e1) { e1.printstacktrace(); } // 获得本行中各单元格中的数据 for (int columnindex = 0; columnindex < columncount; columnindex++) { string data = row.getcell(columnindex).tostring(); // 获取要调用方法的方法名 string methodname = methodnames[columnindex]; obj = this.valueconvert(fieldtypes[columnindex], methodname, class_, obj, data); cos135 } result.add(obj); 姓孔的名人 } } return result; } /** * @param fieldtype 字段类型 * @param methodname 方法名 * @param class_ * @param data * @return */ private object valueconvert(string fieldtype, string methodname, class class_, object obj, string data) { method method = null; if (objects.isnull(fieldtype) || objects.isnull(methodname) || objects.isnull(class_) || objects.isnull(obj)) { return obj; } try { switch (fieldtype) { ca "java.lang.string": method = class_.getdeclaredmethod(methodname, string.class); method.invoke(obj, data); // 执行该方法 break; ca "java.lang.integer": method = class_.getdeclaredmethod(methodname, integer.class); integer value = integer.valueof(data); method.invoke(obj, value); // 执行该方法 break; ca "java.lang.boolean": method = class_.getdeclaredmethod(methodname, boolean.class); boolean booleanvalue = boolean.getboolean(data); method.invoke(obj, booleanvalue); // 执行该方法 break; ca "java.lang.double": method = class_.getdeclaredmethod(methodname, double.class); double doublevalue = double.pardouble(data); method.invoke(obj, doublevalue); // 执行该方法 break; ca "java.math.bigdecimal": method = class_.getdeclaredmethod(methodname, bigdecimal.class); bigdecimal bigdecimal = new bigdecimal(data); method.invoke(obj, bigdecimal); // 执行该方法 break; } } catch (exception e) { e.printstacktrace(); } return obj; }}
excelfield.java
import java.lang.annotation.*;/*** @author xxkfz*/@target({elementtype.method, elementtype.field, elementtype.type}) //注解放置的目标位置,method是可注解在方法级别上@retention(retentionpolicy.runtime) //注解在哪个阶段执情侣短句行@documentedpublic @interface excelfield { string name() default "";}
实体类 excelfilefield.java
@data@allargsconstructor@noargsconstructor@tostringpublic class excelfilefield { @excelfield(name = "id") private string id; @excelfield(name = "code") private string code; @excelfield(name = "type") private string type; @excelfield(name = "version") private string version;}
函数测试
@test void readexcel() { excelutils utils = new excelutils("e:/test.xls"); excelfilefield interfacefield = new excelfilefield(); list list = utils.readfromexceldata("sheet1", interfacefield); for (int i = 0; i < list.size(); i++) { excelfilefield item = (excelfilefield) list.get(i); system.out.println(item.tostring()); } }
excel表格数据
测试结果:
excelfilefield(id=x0001, code=x0001, type=x0001, version=x0001)
excelfilefield(id=x0002, code=x0002, type=x0002, version=x0002)process finished with exit code 0
到此这篇关于springboot使用aop+反射实现excel数据的读取的文章就介绍到这了,更多相关springboot实现excel读取内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 19:02:45,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/7b77118cd38a91c38038ec0c68cb35f2.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:springboot使用AOP+反射实现Excel数据的读取.doc
本文 PDF 下载地址:springboot使用AOP+反射实现Excel数据的读取.pdf
留言与评论(共有 0 条评论) |