`

利用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文件的功能,并且可以实现下载地址的可选性。同时,需要注意字符编码的处理和文件流的处理,以确保文件的正确传输和下载。

    java_poi实现excel导入导出

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

    利用POI读取excel写入到word

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

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

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

    POI操作Excel完美生成水印

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

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

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

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

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

    poi 操作excel模板

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

    POI 生成EXCEL2007【含例子】

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

    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文档(源码); 博客地址:...

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

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

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

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

    POI的EXCEL导出,自动换行

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

    java 利用POI 导入导出Excel

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

Global site tag (gtag.js) - Google Analytics