题外话: (最近项目不紧,就写写博客,就当是总结了!哈哈)
需求:通过上传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文件图片
相关推荐
总之,Apache POI 提供了强大的功能,使得我们可以轻松地将Excel数据转换为Java Bean,便于进一步的处理和利用。无论是简单的数据映射还是复杂的对象结构,都可以通过熟练运用POI库来实现。这个过程在数据导入、分析...
通过这个“java的poi生成excel图表demo”,我们可以学习如何利用POI创建动态的、数据驱动的Excel曲线图,进一步提升数据的可视性和理解性。这个压缩包中的“EexcelChart”可能是示例代码、测试数据或生成的Excel文件...
在Java开发中,Apache POI库是一个非常实用的工具,用于读取和写入Microsoft Office格式的文件,尤其是Excel(.xlsx和.xls)文件。...通过深入学习POI的API,可以实现更多功能,提高Excel文档的自动化处理能力。
POI读取并导出Excel(JSF Bean 页面的...通过使用POI库和JSF Bean,可以实现读取和导出Excel文件的功能,并且可以实现下载地址的可选性。同时,需要注意字符编码的处理和文件流的处理,以确保文件的正确传输和下载。
Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 Excel 文件。在本文中,我们将详细介绍如何使用 Java POI 实现 Excel 导入导出功能。 1. 什么是 Java ...
要实现"利用POI读取excel写入到word",我们需要以下步骤: 1. **准备环境**:首先,确保你的项目已经引入了Apache POI的依赖。在给定的压缩包中,"poi - 副本"可能是包含POI库的JAR文件,你需要将其添加到你的项目...
在这个"利用POI解析excel并存入数据库demo"中,我们将关注如何使用 POI 库来读取 Excel 文件,并将数据有效地存入 MySQL 数据库。 首先,要开始使用 POI,你需要在你的项目中引入相应的依赖。如果你使用的是 Maven...
本教程将深入探讨如何利用Apache POI来在Excel文件中完美地生成水印。水印通常用于标识文档的所有权或提供额外的安全层,而这里的水印是通过将文字转化为图片再添加到Excel工作表中实现的。 首先,我们需要了解...
Apache POI是一个强大的Java库,专门用于处理...通过lib.rar和Poi02.rar中的示例代码,你可以更深入地了解和学习POI操作Excel的具体实现。在实践中,结合这些资源,你将能够熟练地在Java Web项目中集成Excel处理功能。
3. **XML 文件与Word/Excel 文档**:描述中提到了从XML文件中读取数据来生成文档,这可能意味着XML被用作数据存储格式,然后通过POI转换为Word或Excel格式。XML可以更方便地进行数据操作和格式化,然后利用POI将其...
本篇将深入探讨如何利用Apache POI来操作Excel模板,以及如何读取数据并将其填充到新生成的文件中,最终提供下载。 首先,你需要在项目中引入Apache POI的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下...
标题 "POI 生成EXCEL2007【含例子】" 涉及到的知识点主要集中在Apache POI库的使用上,这是一个强大的Java ...通过实践这些示例,开发者能够掌握如何利用Apache POI高效地生成和操作Excel 2007文件,从而提升工作效率。
本实例源码着重讲解如何利用Apache POI来实现数据的Excel导出功能。 首先,我们需要了解Apache POI的基本概念。POI提供了HSSF(Horrible Spreadsheet Format)和XSSF(XML Spreadsheet Format)两个主要的API,分别...
Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,包括Excel。...通过这些示例,你可以理解如何在Java应用中利用POI进行Excel文件的创建、读取和修改,以及如何结合数据库操作实现数据的导入导出。
Java语言利用POI读取excel文档,利用Freemarker建立word模板(带图片),excel每一行数据生成单个word文档,再利用POI合并成一个word文档(源码); 博客地址:...
通过这种方式,你可以根据业务需求,利用Java和Apache POI库实现Excel数据的批处理,生成大量定制化的Word文档。这个过程对于报告生成、自动化数据导出或者大规模邮件合并等场景非常有用。 这个示例代码只是一个...
在这个场景中,"使用poi生成Excel所需要的jar包"指的是利用Apache POI库来生成Excel文件。POI-3.9.jar是Apache POI项目的一个版本,包含了所有必要的类和方法,让我们可以处理Excel的XLS和XLSX格式。 首先,Apache ...
通过以上步骤,我们成功地实现了使用Apache POI在Java中导出Excel文件,并实现了自动换行的功能。这种方式不仅可以提高工作效率,还能确保数据的准确性和完整性。 #### 六、注意事项与优化建议 - **兼容性问题**:...
前几天项目上需要加上导入导出,在网上找了一下,么有...于是自己写,源码里所需要的jar都有,从jsp界面进行Excel的导入导出,并可用于上传和下载。如有所用,喜不自禁,分享,开源的意义。 写的不是特别好,不喜勿喷!