利用反射实现通用的excel导入导出
1.ecxcel导入导出的实现
1.创建Book类,并编写set方法和get方法
package com.bean;
public class Book {
private int id;
private String name;
private String type;
// public int a;
public String getType() {
System.out.println("调用了类型方法");
return type;
}
public void setType(String type) {
this.type = type;
}
// public void test (String name,int a){
// System.out.println("调用了多参数的方法");
// }
public String getName() {
System.out.println("调用了名称方法");
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
System.out.println("调用了序号方法");
return id;
}
public void setId(int id) {
this.id = id;
}
}
2.创建ExcelBook类实现导入导出
package com.main;
import java.io.File;
import java.util.ArrayList; import com.bean.Book; import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook; public class ExcelBook {
public static void main(String[] args) {
ExcelBook excelBook = new ExcelBook();
//创建集合
// ArrayList<Book> arrayList = new ArrayList<Book>();
// Book book = new Book();
// book.setId(1);
// book.setName("Java语言");
// book.setType("面向对象");
// Book book1 = new Book();
// book1.setId(2);
// book1.setName("西游记");
// book1.setType("故事");
// Book book2 = new Book();
// book2.setId(3);
// book2.setName("高数");
// book2.setType("难");
// arrayList.add(book);
// arrayList.add(book1);
// arrayList.add(book2);
// excelBook.excelOut(arrayList);
ArrayList<Book> ar1 = excelBook.excelIn();
for(Book bo2 : ar1){
System.out.println(bo2.getId()+" "+bo2.getName()+" "+bo2.getType());
}
}
public void excelOut(ArrayList<Book>arrayList){
WritableWorkbook bookk = null;//Excle对象
try {
//创建excel对象
bookk = Workbook.createWorkbook(new File("D:/Sourcecode/Java/fanshe/book.xls"));
//通过excel对象创建一个选项卡
WritableSheet sheet = bookk.createSheet("sheet1", 0);
//创建一个单元格对象参数为 列 行 值
for(int i = 0; i < arrayList.size();i++){
Book bo = arrayList.get(i);
Label la1 = new Label(0, i,String.valueOf(bo.getId()));
Label la2 = new Label(1, i,bo.getName());
Label la3 = new Label(2, i, bo.getType());
sheet.addCell(la1);//放入选项卡中
sheet.addCell(la2);
sheet.addCell(la3);
} //写入目标路径
bookk.write();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
bookk.close();
} catch (Exception e) {
e.printStackTrace();
}
} }
public ArrayList<Book> excelIn(){
ArrayList<Book> ar = new ArrayList<Book>();//返回集合
Workbook book = null;
try {
//获取到excle对象
book = Workbook.getWorkbook(new File("D:/Sourcecode/Java/fanshe/book.xls"));//文件路径
Sheet sheet = book.getSheet(0);//获取第一个选项卡对象(第零列)
for(int i = 0; i < sheet.getRows();i++){//向文件中读入值,getRows()获取数据中有多少条数据
Book bo = new Book();
Cell cell = sheet.getCell(0,i);//cell对象为单元格对象,取出数据i行0列
bo.setId(Integer.valueOf(cell.getContents()));//getContents获取单元格对象的值
bo.setName(sheet.getCell(1,i).getContents());
bo.setType(sheet.getCell(2,0).getContents());
ar.add(bo);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
book.close();
}
return ar; } }
运行结果:导出时,在指定路径出现下图内容

导出时结果如下:
调用了序号方法
调用了名称方法
调用了类型方法
1 Java语言 面向对象
调用了序号方法
调用了名称方法
调用了类型方法
2 西游记 面向对象
调用了序号方法
调用了名称方法
调用了类型方法
3 高数 面向对象
此方法虽然可以实现excel的导入导出,但因导入导出的数据信息比较少,但如果数据信息比较多,此方法实现起来非常麻烦,所以应该利用java反射机制实现。
2.利用反射实现通用的excel导入导出
如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出
实例代码如下:
1.创建一个 Book类,并编写set和get方法
package com.bean;
public class Book {
private int id;
private String name;
private String type;
// public int a;
public String getType() {
System.out.println("调用了类型方法");
return type;
}
public void setType(String type) {
this.type = type;
}
// public void test (String name,int a){
// System.out.println("调用了多参数的方法");
// }
public String getName() {
System.out.println("调用了名称方法");
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
System.out.println("调用了序号方法");
return id;
}
public void setId(int id) {
this.id = id;
}
}
2.创建一个ExcelUtil类,实现导入导出
package com.util; import java.io.File;
import java.lang.reflect.Field;
import java.util.ArrayList; import com.bean.Book; import jxl.Sheet;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook; public class ExcelUtil {
//第一个参数为要导出的数据的实体类的对象,实例类不确定,第二个参数为导入路径
public static void excleOut(ArrayList ar,String str){
WritableWorkbook book = null;//编写WritableWorkbook对象,该对象代表了excel对象
try {
book = Workbook.createWorkbook(new File(str));//创建文件路径str
WritableSheet sheet = book.createSheet("sheet",0);//获取sheet对象
//对集合进行遍历
for(int i = 0; i < ar.size();i++){
Object ob = ar.get(i);//集合中的对象不确定,用Object代替
//利用反射机制
Class cl = ob.getClass();//运行时获得传递过来的对象
Field[] fi = cl.getDeclaredFields();//获取所有属性的对象,用来获取属性
for(int j = 0; j <fi.length;j++){//将获得的对象遍历出来
fi[j].setAccessible(true);//启用访问权限
//获取值 列(j),行(i),值fi[j]为字符串方式
Label la = new Label(j, i, String.valueOf(fi[j].get(ob)));
sheet.addCell(la);//将数据写入sheet对象中
}
}
book.write();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
book.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//第一个参数为要导入的数据的实体类的对象,第二个参数为导入路径
public static ArrayList excleIn(Class cl,String str){
ArrayList ar =new ArrayList();//创建空的集合用于存储数据
Workbook book = null;//声明一个workbook对象
try {
book =Workbook.getWorkbook(new File(str));//获取到类对象
Sheet sheet = book.getSheet(0);//获取sheet对象
Field []fi = cl.getDeclaredFields();//获取类属性信息
for(int i = 0;i < sheet.getRows();i++){//对读取进来的excle数据进行遍历
Object ob = cl.newInstance();//创建实例化对象,创建新的存储数据的对象,用Object对象代替
//将所有的属性封装到对象中
for(int j = 0;j <fi.length;j++){//将属性进行循环
fi[i].setAccessible(true);//启用属性访问权限
String con = sheet.getCell(j,i).getContents();//从excel中读取数据
//判断属性的类型
if(fi[j].getType().toString().equals("Class java.lang.String")){
//将读入的数据(在con中)封装到对象(ob)的属性(fi[i])中
fi[j].set(ob,con);//ob.id=con正常方法
}else if(fi[j].getType().toString().equals("int")){
fi[j].setInt(ob,Integer.valueOf(con));//将信息封装到对象中
}else if(fi[j].getType().toString().equals("Integer")){
fi[j].setInt(ob,Integer.valueOf(con));//将信息封装到对象中
} ar.add(ob);
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
book.close();
}
return ar; } public static void main(String[] args) {
// ArrayList<Book> arrayList = new ArrayList<Book>();
// Book book = new Book();
// book.setId(1);
// book.setName("Java语言");
// book.setType("面向对象");
// Book book1 = new Book();
// book1.setId(2);
// book1.setName("西游记");
// book1.setType("故事");
// Book book2 = new Book();
// book2.setId(3);
// book2.setName("高数");
// book2.setType("难");
// arrayList.add(book);
// arrayList.add(book1);
// arrayList.add(book2);
// ExcelUtil.excleOut(arrayList,"D:/Sourcecode/Java/fanshe/book1.xls");
//导入的数据位Book类型
ArrayList<Book> ar = ExcelUtil.excleIn(Book.class,"D:/Sourcecode/Java/fanshe/book1.xls");
for(Book bo:ar){
System.out.println(bo.getId()+" "+bo.getName()+" "+bo.getType());
}
} }
运行结果:导出时在指定路径出现excel表格,上面显示导出的数据,如下图所示:

导入时,在控制台输出表格中的信息
利用反射实现通用的excel导入导出的更多相关文章
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- 土制Excel导入导出及相关问题探讨
转载请注明出处https://www.cnblogs.com/funnyzpc/p/10392085.html 新的一年,又一个开始,不见收获,却见年龄,好一个猪年,待我先来一首里尔克的诗: < ...
- Mego(04) - NET简单实现EXCEL导入导出
前言 相信做过信息系统的朋友都会遇到EXCEL导入导出的相关开发,做过不少EXCEL导入导出后总结起来大致有如下几种方式实现: ADO.NET的OldDb或ODBC连接EXCEL使用DataTable ...
- 解析大型.NET ERP系统 设计通用Microsoft Excel导入功能
做企业管理软件很难避免与Microsoft Excel打交道,常常是软件做好了,客户要求说再做一个Excel导入功能.导入Excel数据的功能的难度不大,从Excel列数据栏位的取值,验证值,再导入到 ...
- Octopus——excel导入导出工具
Octopus Octopus是一个简易的Excel导入导出工具.目前主要就两个功能: 导入:将excel中一行数据转换为指定的java对象,并通过指定的正则表达式检查合法性. 导出:按照给定的xml ...
- poi excel导入导出
pom <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artif ...
- java jxl excel 导入导出的 总结(建立超链接,以及目录sheet的索引)
最近项目要一个批量导出功能,而且要生成一个单独的sheet页,最后后面所有sheet的索引,并且可以点击进入连接.网上搜索了一下,找到一个方法,同时把相关的excel导入导出操作记录一下!以便以后使用 ...
- 如何自动化你的Excel导入导出(Java)?
GitHub | 中文 | English | 博客 为什么使用AutoExcel? Excel导入导出在软件开发中非常常见,只要你接触过开发,就一定会遇到.相信很多人会跟我一样选择用Apache P ...
- 基于 POI 封装 ExcelUtil 精简的 Excel 导入导出
注 本文是使用 org.apache.poi 进行一次简单的封装,适用于大部分 excel 导入导出功能.过程中可能会用到反射,如若有对于性能有极致强迫症的同学,看看就好. 序 由于 poi 本身只是 ...
随机推荐
- Theano Graph Structure
Graph Structure Graph Definition theano's symbolic mathematical computation, which is composed of: A ...
- BZOJ1013: [JSOI2008]球形空间产生器sphere
传送门 高斯消元练习. 模板: void Guass(){ int waited; up(i,1,N){ waited=i; up(j,i+1,N)if(fabs(M[j][i])>fabs(M ...
- Java中堆的实现类PriorityQueue队列接口Queue
Application:这层的职责是对接收到的数据做一些非业务性验证,事务的控制,最重要的是协调多个聚合之间的操作.这里应该可以清晰的表达出整个操作所做的事情,并且与通用语言是一致的. 以上我们讲到可 ...
- dos 批处学习笔记
dos 批处理@ 只显示命令结果echo 回显pause 暂停del 删除set 查看系统变量>nul 正确命令输入空洞2>nul 错误命令输入空洞dir 显示目录和文件&& ...
- Js获取当前日期时间及其它操作
Js获取当前日期时间及其它操作var myDate = new Date();myDate.getYear(); //获取当前年份(2位)myDate.getFullYear(); //获取完整的年份 ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 我们是怎么管理QQ群的
文章背景:腾讯平台上的qq群数以千万百万计,但99%的在吹水扯蛋,从早上的问好开始,到晚上的晚安,无一不浪费青春之时间,看之痛心,无力改变,只好自己建了一个,希望能以此来改变群内交流的氛围或环境. 以 ...
- 最新 Eclipse IDE下的Spring框架配置及简单实例
前段时间开始着手学习Spring框架,又是买书又是看视频找教程的,可是鲜有介绍如何配置Spring+Eclipse的方法,现在将我的成功经验分享给大家. 本文的一些源代码来源于码农教程:http:// ...
- 11i和R12配置JAR包
R11:$IAS_ORACLE_HOME/Apache/Jserv/etc/jserv.properties R12: 方法1:直接解压JAR包放到$JAVA_TOP下: 方法2:编辑:$ORA_CO ...
- MySQL 从 5.5 升级到 5.6,启动时报错 [ERROR] Plugin 'InnoDB' init function returned error
MySQL 从 5.5 升级到 5.6,启动时报错: [ERROR] Plugin 'InnoDB' init function returned error. [ERROR] Plugin 'Inn ...