`

利用POI读入excel通过反射生成Bean源码实现

阅读更多

 题外话: (最近项目不紧,就写写博客,就当是总结了!哈哈)

 

需求:通过上传Excel文件,解析其中的数据,并生成对应的javabean对象,其中Excel里面可能含有一些无用的列数据 (maven项目)

 

 

思路:

        1.创建一个XX.properties文件(key-value),其中key为Excel中列数如1,2,3等,value为Excel中该列数据对应的javabean属性

        2.通过读Excel文件,借助上面的属性文件采用POI遍历数据,生成List<Map<String,Object>>结构的数据

        3.将第二步中的List<Map<String,Object>>结构,通过反射生成对应的Javabean对象。

 

 

             

 

下面是代码的实现:

 

javabean类

 

public class OrderForm{
	
	private Long globalOrderId;
	private String globalOrderNo;
	private String merchantCode;
	private String merchantName;
	private String cityCode;
	private String orderSource;
	private String orderSourceName;
	private String orderNum;
	private String buyerAccount;
	private String phone;
	private String email;
	private String mftNo;
	private String logisticsNo;
	private String logisticsName;
	private String senderName;
	private String senderTel;
	private String senderCompanyName;
	private String senderAddr;
	private String senderZip;
	private String senderCity;
	private String consignee;
	private String consigneeTel;
	private String consigneeProvince;
	private String consigneeCity;
	private String consigneeDistrict;
	private String consigneeAddr;
	private String mailNo;
	private String goodsDesc;
        //省略上面的setter/getter方法

}

 

相应的实现类

 

package com.poi;


import java.io.FileInputStream;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.ResourceBundle;
import java.util.Set;


import org.apache.commons.beanutils.BeanUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Workbook;

import com.alibaba.fastjson.JSONObject;

public class ExcelToBean 
{
	private static ResourceBundle modelPropertiesBundle ;
	
	static {
		//首次加载该类时加载model.properites文件资源
		modelPropertiesBundle = ResourceBundle.getBundle("model");
	}
    
	/**
	 * 将workbook中的值放入List<Map<String,Object>>结构中
	 * */
    public static List<Map<String, Object>> parseExcel(Workbook workbook){
    	List<Map<String, Object>> result = new LinkedList<Map<String,Object>>();
    	int excleRowLength = workbook.getSheetAt(0).getRow(0).getPhysicalNumberOfCells();
    	String [] columnName = new String [excleRowLength]; //相应的javabean类的属性名称数组
    	for(int i=0;i<columnName.length;i++){	//从资源文件中获取
    		if(modelPropertiesBundle.containsKey((String.valueOf(i)))){
    			columnName[i] = modelPropertiesBundle.getString(String.valueOf(i));
    		}
    	}
    	for(int sheetIndex=0;sheetIndex < workbook.getNumberOfSheets();sheetIndex++){	//sheet
    		HSSFSheet sheet = (HSSFSheet) workbook.getSheetAt(sheetIndex);
    		for(int rowIndex=1;rowIndex < sheet.getPhysicalNumberOfRows();rowIndex++){	//row
    			HSSFRow row = sheet.getRow(rowIndex);
    			Map<String, Object> map = new HashMap<String, Object>();
    			for(int cellIndex=0;cellIndex < row.getPhysicalNumberOfCells();cellIndex++){ //cell
    				HSSFCell cell = row.getCell(cellIndex);
    				if(columnName[cellIndex]!=null && columnName[cellIndex].trim().length()>0){ //该列值在对应的java对象中有值
    					//取出当前cell的值和对应Javabean类的属性放入到map中
    					map.put(columnName[cellIndex].trim(), getCellValue(cell));  
    				}
    			}
    			result.add(map);
    		}
    	}
    	System.out.println(JSONObject.toJSONString("list<>=" + result));
    	return result;
    }
    

    /**
     * 利用反射将	List<Map<String,Object>>结构 生成相应的List<T>数据
     * 
     * */
    public static <T>  List<T> toObjectList(List<Map<String, Object>> list,Class<T> clazz) throws Exception{
    	List<T> returnList = new LinkedList<T>();
    	for(int i=0;i<list.size();i++){
    		Set<Map.Entry<String, Object>> set =  list.get(i).entrySet();
    		Iterator<Entry<String, Object>> it = set.iterator();
			T obj= clazz.newInstance();
			Method[] methods = clazz.getDeclaredMethods();
    		while (it.hasNext()) {		//生成一个obj
				Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it.next();
				for(Method m:methods){
					if(m.getName().startsWith("set")){		//为obj赋值
						String methodName = entry.getKey().toString();
						StringBuffer sb = new StringBuffer(methodName);  
		                sb.replace(0, 1, (methodName.charAt(0)+"").toUpperCase());  
		                methodName = "set" +  sb.toString();
						if(methodName.equals(m.getName())){
							m.invoke(obj, entry.getValue());
							break;
						}
					}
				}
			}
			returnList.add(obj);
    	}
    	System.out.println("size=" + returnList.size());
    	return returnList;
    }
    
    
    /**
     * 获取当前单元格内容
     * */
    private static String getCellValue(Cell cell){
    	String value = "";
    	if(cell!=null){
	    	switch (cell.getCellType()) {
			case Cell.CELL_TYPE_NUMERIC:
				if(HSSFDateUtil.isCellDateFormatted(cell)){ //日期类型
					SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
					Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
					value = sdf.format(date);
				}else{
					Double data = cell.getNumericCellValue();
					value = data.toString();
				}
				break;
			case Cell.CELL_TYPE_STRING:
				value = cell.getStringCellValue();
				break;
			case Cell.CELL_TYPE_BOOLEAN:
				Boolean data = cell.getBooleanCellValue();
				value = data.toString(); 
				break;
			case Cell.CELL_TYPE_ERROR:
				System.out.println("单元格内容出现错误");
				break;
			case Cell.CELL_TYPE_FORMULA:
	            value = String.valueOf(cell.getNumericCellValue());  
	            if (value.equals("NaN")) {// 如果获取的数据值非法,就将其装换为对应的字符串
	                value = cell.getStringCellValue().toString();  
	            }  			
				break;			
			case Cell.CELL_TYPE_BLANK:
				System.out.println("单元格内容 为空值 ");
				break;			
			default :
				value = cell.getStringCellValue().toString();
				break;
			}
    	}
    	return value;
    }
    
    public static void main(String args[]) throws Exception{
    	FileInputStream input = new FileInputStream("C:\\Users\\lenovo\\Desktop\\积分商城订单.xls");
    	HSSFWorkbook workbook = new HSSFWorkbook(input);
    	
    	List<Map<String, Object>> list =  parseExcel(workbook);
    	
    	List<OrderForm> lists =  toObjectList(list, OrderForm.class);
    	
    	System.out.println(JSONObject.toJSONString(lists)); //利用fastjson将其序列化打印出来
    	
    }
    
    
}

 

下面是相应的properties文件

 

#0=order,
1=orderNum
2=goodsSku
3=goodsName
4=quantity
#5=ji fen shuliang *
#jie suan jia *
6=price
#7=status *
#8=ke hu hao *
9=orderTime
10=payTime
11=consignee
12=consigneeTel
#13= Message Tel
14=consigneeAddr
15=buyerAccount
16=buyerTel
#17=numberLocatorProvince
#18=numberLocatorCity
#19=orderStatu
#20=cash
#21=typeId
#22=receiveTime

 

 

maven依赖

 

     <dependency>
  		<groupId>org.apache.poi</groupId>
		<artifactId>poi</artifactId>
		<version>3.12</version>  
    </dependency>
    <dependency>
    	<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>
		<version>1.2.6</version>
    </dependency> 

 

相应的excel文件图片

 

 

 

 

  • 大小: 17.5 KB
1
2
分享到:
评论
1 楼 T丨amo 2017-02-13  
哈喽,博主, 在网上查东西的时候看到了你的文章,很好的解决了我的问题,我也做了总结,参考了你的思路的代码,这里征求你同意一下、   这是我的 地址: http://blog.csdn.net/tiamo_1314/article/details/55005608  

相关推荐

    poi excel转换成bean

    总之,Apache POI 提供了强大的功能,使得我们可以轻松地将Excel数据转换为Java Bean,便于进一步的处理和利用。无论是简单的数据映射还是复杂的对象结构,都可以通过熟练运用POI库来实现。这个过程在数据导入、分析...

    java的poi生成excel图表demo

    通过这个“java的poi生成excel图表demo”,我们可以学习如何利用POI创建动态的、数据驱动的Excel曲线图,进一步提升数据的可视性和理解性。这个压缩包中的“EexcelChart”可能是示例代码、测试数据或生成的Excel文件...

    使用POI在Excel中动态生成图表工具类(支持柱状、组合、环状图、折线图、等常用图)

    在Java开发中,Apache POI库是一个非常实用的工具,用于读取和写入Microsoft Office格式的文件,尤其是Excel(.xlsx和.xls)文件。...通过深入学习POI的API,可以实现更多功能,提高Excel文档的自动化处理能力。

    poi读取并导出excel(jsf bean 页面的实现)

    POI读取并导出Excel(JSF Bean 页面的...通过使用POI库和JSF Bean,可以实现读取和导出Excel文件的功能,并且可以实现下载地址的可选性。同时,需要注意字符编码的处理和文件流的处理,以确保文件的正确传输和下载。

    POI操作Excel完美生成水印

    本教程将深入探讨如何利用Apache POI来在Excel文件中完美地生成水印。水印通常用于标识文档的所有权或提供额外的安全层,而这里的水印是通过将文字转化为图片再添加到Excel工作表中实现的。 首先,我们需要了解...

    java_poi实现excel导入导出

    Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 Excel 文件。在本文中,我们将详细介绍如何使用 Java POI 实现 Excel 导入导出功能。 1. 什么是 Java ...

    利用POI解析excel并存入数据库demo

    在这个"利用POI解析excel并存入数据库demo"中,我们将关注如何使用 POI 库来读取 Excel 文件,并将数据有效地存入 MySQL 数据库。 首先,要开始使用 POI,你需要在你的项目中引入相应的依赖。如果你使用的是 Maven...

    利用POI读取excel写入到word

    要实现"利用POI读取excel写入到word",我们需要以下步骤: 1. **准备环境**:首先,确保你的项目已经引入了Apache POI的依赖。在给定的压缩包中,"poi - 副本"可能是包含POI库的JAR文件,你需要将其添加到你的项目...

    POI生成Excel POI操作Excel POI读取Excel POI类库

    Apache POI是一个强大的Java库,专门用于处理...通过lib.rar和Poi02.rar中的示例代码,你可以更深入地了解和学习POI操作Excel的具体实现。在实践中,结合这些资源,你将能够熟练地在Java Web项目中集成Excel处理功能。

    poi 操作excel模板

    本篇将深入探讨如何利用Apache POI来操作Excel模板,以及如何读取数据并将其填充到新生成的文件中,最终提供下载。 首先,你需要在项目中引入Apache POI的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下...

    POI 生成EXCEL2007【含例子】

    标题 "POI 生成EXCEL2007【含例子】" 涉及到的知识点主要集中在Apache POI库的使用上,这是一个强大的Java ...通过实践这些示例,开发者能够掌握如何利用Apache POI高效地生成和操作Excel 2007文件,从而提升工作效率。

    android中poi生成word文档和excel文档

    3. **XML 文件与Word/Excel 文档**:描述中提到了从XML文件中读取数据来生成文档,这可能意味着XML被用作数据存储格式,然后通过POI转换为Word或Excel格式。XML可以更方便地进行数据操作和格式化,然后利用POI将其...

    POI的EXCEL导出,自动换行

    通过以上步骤,我们成功地实现了使用Apache POI在Java中导出Excel文件,并实现了自动换行的功能。这种方式不仅可以提高工作效率,还能确保数据的准确性和完整性。 #### 六、注意事项与优化建议 - **兼容性问题**:...

    Java利用POI实现数据Excel导出实例源码

    本实例源码着重讲解如何利用Apache POI来实现数据的Excel导出功能。 首先,我们需要了解Apache POI的基本概念。POI提供了HSSF(Horrible Spreadsheet Format)和XSSF(XML Spreadsheet Format)两个主要的API,分别...

    poi生成excel表格

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,包括Excel。...通过这些示例,你可以理解如何在Java应用中利用POI进行Excel文件的创建、读取和修改,以及如何结合数据库操作实现数据的导入导出。

    POI读取excel,利用Freemarker建立word模板(带图片),生成word文档,再合并成一个word文档(源码)

    Java语言利用POI读取excel文档,利用Freemarker建立word模板(带图片),excel每一行数据生成单个word文档,再利用POI合并成一个word文档(源码); 博客地址:...

    使用poi生成Excel所需要的jar包

    在这个场景中,"使用poi生成Excel所需要的jar包"指的是利用Apache POI库来生成Excel文件。POI-3.9.jar是Apache POI项目的一个版本,包含了所有必要的类和方法,让我们可以处理Excel的XLS和XLSX格式。 首先,Apache ...

    Java通过POI读取Excel遍历数据,批量生成word文档

    通过这种方式,你可以根据业务需求,利用Java和Apache POI库实现Excel数据的批处理,生成大量定制化的Word文档。这个过程对于报告生成、自动化数据导出或者大规模邮件合并等场景非常有用。 这个示例代码只是一个...

    java 利用POI 导入导出Excel

    前几天项目上需要加上导入导出,在网上找了一下,么有...于是自己写,源码里所需要的jar都有,从jsp界面进行Excel的导入导出,并可用于上传和下载。如有所用,喜不自禁,分享,开源的意义。 写的不是特别好,不喜勿喷!

Global site tag (gtag.js) - Google Analytics