`
whoosh
  • 浏览: 233806 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

“Java+POI+模板”三:从Excel读入一个对象列表

 
阅读更多

请先阅读 “Java+POI+模板”一:打造复杂Excel 报表  

“Java+POI+模板”二:基于对象列表输出到excel(利用反射)

我们会处理如下图所示的两个Excel,将之转化为我们的对象。



 


 

第一张图对应的对象类如下:

public class User {

	private int id;
	private String username;
	private String nickname;
	private int age;
	
	@ExcelResources(title="用户标识",order=1)
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
	@ExcelResources(title="用户名",order=2)
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	@ExcelResources(title="用户昵称",order=3)
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
	@ExcelResources(title="用户年龄",order=4)
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public User(int id, String username, String nickname, int age) {
		super();
		this.id = id;
		this.username = username;
		this.nickname = nickname;
		this.age = age;
	}
	public User() {
		super();
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", nickname="
				+ nickname + ", age=" + age + "]";
	}
}

 第二张图对应的对象类如下:

public class Student {
	private int id;
	private String name;
	private String no;
	private String sex;
	
	@ExcelResources(title="学生标识",order=1)
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
	@ExcelResources(title="学生姓名")
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@ExcelResources(title="学生学号", order=2)
	public String getNo() {
		return no;
	}
	public void setNo(String no) {
		this.no = no;
	}
	@ExcelResources(title="学生性别")
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public Student(int id, String name, String no, String sex) {
		super();
		this.id = id;
		this.name = name;
		this.no = no;
		this.sex = sex;
	}
	
	
	public Student() {
		super();
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", no=" + no + ", sex="
				+ sex + "]";
	}
}

处理上述的Excel我们需要知道其文件路径,读取Excel的开始行和结束行,所以我们的代码如下。具体的操作我们交给handleExcel2Objs方法来处理。

/**
	 * 从文件路径读取相应的Excel文件到对象列表
	 * @param path 文件路径下的path
	 * @param clz 对象类型
	 * @param readLine 开始行,注意是标题所在行
	 * @param tailLine 底部有多少行,在读入对象时,会减去这些行
	 * @return
	 */
	public List<Object> readExcel2ObjsByPath(String path,Class clz,int readLine,int tailLine) {
		Workbook wb = null;
		try {
			wb = WorkbookFactory.create(new File(path));
			return handleExcel2Objs(wb, clz, readLine,tailLine);
		} catch (InvalidFormatException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

 handleExcel2Objs方法首先会调用getHeaderMap方法,将Model类ExcelResources注解的Title与单元格的Title做匹配。然后将单元格的列号作为key,Model的get方法名改为set方法名,作为字符串设为value。返回一个Map。

/**
	 * 将Model类ExcelResources注解的Title与单元格的Title做匹配
	 * 将单元格的列号作为key,Model的get方法名改为set方法名,作为字符串设为value
	 */
	private Map<Integer,String> getHeaderMap(Row titleRow, Class clz){
		List<ExcelHeader> headers=getHeaderList(clz);
		Map<Integer,String> maps=new HashMap<Integer,String>();
		for (Cell c : titleRow) {
			String title=c.getStringCellValue();
			for (ExcelHeader eh : headers) {
				if(eh.getTitle().equals(title)){
					maps.put(c.getColumnIndex(), eh.getMethodName().replace("get", "set"));
					break;
				}
			}
		}
		return maps;
	}

 

getHeaderMap方法又会调用getHeaderList方法来返回返回Model类里面所有带有ExcelResources注解的get方法的注解信息。

/**
	 * 将Model类ExcelResources注解的Title与单元格的Title做匹配
	 * 将单元格的列号作为key,Model的get方法名改为set方法名,作为字符串设为value
	 */
	private Map<Integer,String> getHeaderMap(Row titleRow, Class clz){
		List<ExcelHeader> headers=getHeaderList(clz);
		Map<Integer,String> maps=new HashMap<Integer,String>();
		for (Cell c : titleRow) {
			String title=c.getStringCellValue();
			for (ExcelHeader eh : headers) {
				if(eh.getTitle().equals(title)){
					maps.put(c.getColumnIndex(), eh.getMethodName().replace("get", "set"));
					break;
				}
			}
		}
		return maps;
	}

 有了上述方法,handleExcel2Objs方法便可轻松将Excel转换为参数中的clz对象

/**
	 * 将Excel转换为参数中的clz对象
	 * @param wb 我们所要处理的Workbook
	 * @param clz 对象类型
	 * @param readLine 开始行,注意是标题所在行
	 * @param tailLine 底部有多少行,在读入对象时,会减去这些行
	 * @return
	 */
	private List<Object> handleExcel2Objs(Workbook wb,Class clz,int readLine,int tailLine) {
		Sheet sheet=wb.getSheetAt(0);
		List<Object> objs=null;
		try {
			Row row=sheet.getRow(readLine);
			objs = new ArrayList<Object>();
			Map<Integer,String> maps =getHeaderMap(row, clz);
			if(maps==null||maps.size()<=0) throw new RuntimeException("要读取的Excel的格式不正确,检查是否设定了合适的行");
			Object obj=null;
			for(int i=readLine+1;i<=sheet.getLastRowNum()-tailLine;i++){
				row=sheet.getRow(i);
				obj=clz.newInstance();
				for (Cell c : row) {
					int ci = c.getColumnIndex();
					String mn=maps.get(ci).substring(3);
					mn=mn.substring(0, 1).toLowerCase()+mn.substring(1);
					BeanUtils.copyProperty(obj, mn,this.getCellValue(c));
				}
				objs.add(obj);
			}
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		return objs;
	}

 这样我们的代码就写好了,下面是测试代码。

针对于第一张图,我们第0行和最后两行是不需要的,所以传入的readLine是1,tailLine是2

针对第二张图,我们就是从0行开始读,底部也没有多余的行,所以readLine和tailLine都是0

@Test
	public void testRead01(){
		List<Object> us=ExcelUtil.getInstance().readExcel2ObjsByPath("d:/test/poi/tus.xls", User.class,1,2);
		for(Object obj:us){
			User user=(User)obj;
			System.out.println(user);
		}
	}
	@Test
	public void testRead02(){
		List<Object> stus=ExcelUtil.getInstance().readExcel2ObjsByPath("d:/test/poi/ss1.xls", Student.class,0,0);
		for(Object obj:stus){
			Student stu=(Student)obj;
			System.out.println(stu);
		}
	}

 输出的值如下:

testRead01:
User [id=1, username=aaa, nickname=水水水, age=11]
User [id=2, username=sdf, nickname=水水水, age=11]
User [id=3, username=sdfde, nickname=水水水, age=11]
User [id=4, username=aaa, nickname=水水水, age=11]
User [id=54, username=aaa, nickname=水水水, age=11]
User [id=16, username=aaa, nickname=水水水, age=11]

testRead02
Student [id=1, name=张三, no=1123123, sex=男]
Student [id=2, name=张三, no=1123123, sex=男]
Student [id=3, name=张三, no=1123123, sex=男]
Student [id=4, name=张三, no=1123123, sex=男]

 

 

  • 大小: 39 KB
  • 大小: 106 KB
分享到:
评论

相关推荐

    \"java+poi+Excel模板\"制作简单的报表

    标题中的“`java+poi+Excel模板`”指的是使用Java编程语言,结合Apache POI库来处理Microsoft Excel模板,以生成或编辑Excel报表的过程。Apache POI是一个流行的开源项目,它允许开发者使用Java读写Microsoft Office...

    “java+poi+模板”打造复杂excel报表.pdf

    (3) 实现业务处理类:创建一个业务处理类(例如:ExcelPoi),在这个类中,实现将查询结果写入模板的方法。通过`getExcelSheeet`方法,使用SQL查询结果更新模板文件中的数据。最后,将更新后的模板文件导出为新的...

    “java+poi+模板”打造复杂excel报表.docx

    《使用Java+POI+模板技术生成复杂Excel报表》 在信息技术领域,数据的展示和分析是至关重要的,Excel作为一款强大的电子表格工具,被广泛应用于数据的整理和报表制作。然而,当需要自动化生成复杂的Excel报表时,...

    springboot+poi导出指定格式Excel模板

    springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式...

    java+poi+excel读取写入等操作所有jar(最新支持excel2013)Java实用源码整理learns

    Java POI库是Apache软件基金会开发的一个开源项目,专门用于处理Microsoft Office格式的文件,包括Excel。本资源包集合了使用Java进行Excel读取、写入等操作所需的全部jar文件,且这些jar文件已更新至最新版本,支持...

    FreeMarker+poi 模板生成word+导入图片

    Apache POI是Apache软件基金会的一个开源项目,提供了一组API用于读写Microsoft Office格式的文件,包括Word(.doc, .docx)、Excel(.xls, .xlsx)和PowerPoint(.ppt, .pptx)等。POI使用Java实现,使得开发者可以...

    SpringBoot +Mybatis +POI导入、导出Excel文件

    本项目通过集成这三个组件,实现了Excel文件的导入与导出功能,为业务流程提供了便捷的数据交互手段。 首先,我们来了解一下SpringBoot。SpringBoot是Spring框架的简化版,它简化了配置和项目初始化过程,通过内置...

    Java使用POI实现excel模板

    在Java开发中,处理Excel数据是一项常见的任务,Apache POI是一个强大的库,它允许开发者读取、创建和修改Microsoft Office格式的文件,包括Excel。本篇文章将深入探讨如何使用Java和Apache POI来实现Excel模板的...

    java基于poi通过excel模板导出

    在Java编程领域,Apache POI库是一个非常流行的API,它允许开发者读取、写入以及修改Microsoft Office格式的文件,包括Excel。本篇文章将详细探讨如何利用POI库基于模板来导出Excel文档。 首先,我们需要理解Apache...

    poi 操作excel模板

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,包括Excel。在Java开发中,POI库被广泛用于生成、修改和读取Excel文档。本篇将深入探讨如何利用Apache POI来操作Excel模板,以及如何读取数据...

    Java POI根据模板生成Excel(xlsx)文件

    Java POI库是一个广泛使用的开源项目,专门用于处理Microsoft Office格式的文件,包括Excel的.xls和.xlsx文件。在本示例中,我们关注的是如何利用Java POI来根据模板生成.xlsx格式的Excel文件。这个过程涉及到对...

    POI使用Excel模板文件循环输出行并导出Excel

    Apache POI是一个强大的Java库,专门用于处理Microsoft Office格式的文件,尤其是Excel。在这个特定的例子中,我们将讨论如何使用POI库基于一个Excel模板文件循环输出数据行,并将结果导出为新的Excel文件。 首先,...

    java poi 根据excel模板生成excel文件

    Java POI库是Apache软件基金会开发的一个开源项目,专门用于读写Microsoft Office格式的文件,包括Excel。在本文中,我们将深入探讨如何使用Java POI库根据已有的Excel模板生成新的Excel文件。 首先,理解“模板”...

    java基于poi使用excel模板导出

    在Java开发中,Apache POI库是一个非常流行的用于读写Microsoft Office格式文件的库,包括Excel。本篇文章将深入探讨如何使用Apache POI基于模板来导出Excel文件,以满足数据展示和报告生成的需求。 首先,我们需要...

    poi基于模板导出excel

    Apache POI 是一个用于读写 Microsoft Office 格式文件的 Java 库,其中包括对 Excel 文件的支持。在实际开发过程中,经常会遇到需要根据现有的 Excel 模板来填充数据并生成新的 Excel 文件的需求。这种场景下,我们...

    poi 基于excel模板导出功能

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,包括Excel。在Java开发中,POI库被广泛用于读取、写入和修改Excel文档。本篇将深入探讨如何利用Apache POI实现基于Excel模板的导出功能。 一...

    java使用 POI Excel模板导出数据

    在Java编程中,Apache POI库是一个非常流行的工具,它允许开发者读取、写入和修改Microsoft Office格式的文件,包括Excel。这篇博客"java使用POI Excel模板导出数据"探讨了如何利用POI库在Java中创建Excel模板并填充...

    Springboot+Poi实现Excel的导入导出

    在本项目中,Spring Boot结合MyBatis和POI,实现了一个完整的数据流转流程:从MySQL数据库中查询数据,使用POI将查询结果集转换为Excel文件保存到本地;反之,也可以读取本地Excel文件,将其中的数据导入到MySQL...

    java_poi实现excel导入导出

    要使用 Java POI 实现 Excel 导出,需要首先创建一个 HSSFWorkbook 或 XSSFWorkbook 对象,然后使用该对象创建一个工作表。下面是一个简单的示例: ```java import org.apache.poi.hssf.usermodel.HSSFWorkbook; ...

Global site tag (gtag.js) - Google Analytics