题外话: (最近项目不紧,就写写博客,就当是总结了!哈哈)
需求:通过上传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文件图片
相关推荐
利用POI读取excel写入到word 利用POI读取excel写入到word 利用POI读取excel写入到word,压缩包里包含了jar包
1.java使用poi生成excel插入图表曲线 2.demo包含完成jar包 3.主要用途是过滤数据自动生成曲线图
使用poi在excel中生成各种常见的图像,比如饼状图(普通饼状图、三D图,环状体、折线图、柱状图、等~~)
POI生成Excel POI读取Excel java操作Excel Servlet生成Excel web项目,包含含读取Excel与生成Excel方法
将excel数据转换成javabean对象,支持二级javabean转换! 内包含测试代码和测试文件以及所需要的jar包!
POI操作Excel生成水印,该水印其实就是一个图片,该代码是将文字生成图片,再将图片变成水印的。
POI和JFreeChart框架实现生成Excel文件(生成 统计图)
apache软件基金 poi组件 轻松实现,生成excel报表
poi excel poi excel poi excel poi excel poi excel poi excel poi excel poi excel
利用 Apache POI 对 excel 操作并存入MySQL数据库的一个小demo。
struts2中利用poi导出excel的简单例子
Java利用POI实现数据Excel导出实例源码,简单实用,易于理解,易上手,非常可靠。
poi 操作excel模板,读取数据后,讲数据填充到新生成的文件中且提供下载
java_poi实现excel导入导出功能,有详细的注解
Java语言利用POI读取excel文档,利用Freemarker建立word模板(带图片),excel每一行数据生成单个word文档,再利用POI合并成一个word文档(源码); 博客地址:...
利用poi技术生成excel报表和读取word文档内容
jsp利用POI生成Excel并在页面中导出的示例.docx
前几天项目上需要加上导入导出,在网上找了一下,么有...于是自己写,源码里所需要的jar都有,从jsp界面进行Excel的导入导出,并可用于上传和下载。如有所用,喜不自禁,分享,开源的意义。 写的不是特别好,不喜勿喷!
使用poi生成Excel所需要的jar包,poi-3.9.jar
poi实现excel解析数据Java源码.