`
wangzemin
  • 浏览: 13728 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

POI导入导出excel公用方法

阅读更多
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFFont;
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.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelUtil {
	/** Excel 文件要存放的位置,假定在D盘下 */
	public static String outputFile = "D:\\test1.xls";
	public static String fileToBeRead="D:\\test.xls";
	/**
	 * 
	 * 描述:导出excel文件
	 * @param list:实体类的集合
	 * @param name:导出excel文件的文件名
	 * @param columnName:要导出的列名(开头第一个字母大写)
	 * @param columnTitle 列名对应的标题
	 * @param ClassName 列中包含的引用对象的类名(前后需加逗号分隔,要求是需要取的值必须是该引用对象的Name属性且名字应与该对象属性名字一致,如要取Department dept对象的deptName属性,则该参数为',Department,')
	 */
	public static void Export(HttpServletResponse response,List<?> list, String name, String[] columnName, String[] columnTitle,String ClassName){
		OutputStream os = null;
		//输出到输出流,让用户下载
		try {
			response.setHeader("Content-disposition", "attachment; filename="
			           + new String(name.getBytes("GB2312"), "ISO8859-1")
			           + ".xls");
			response.setContentType("application/msexcel");
			os = response.getOutputStream();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		//输出到指定文件
		/*OutputStream os = null;
		try {
			os = new FileOutputStream(new File("d:/"+name+".xls"));
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		}*/
		Class<?> bean = list.get(0).getClass();
		//新建excel
		HSSFWorkbook workbook = new HSSFWorkbook();
		//得到实体类的名字,作为工作表的名字
		String bean_name = bean.getName();
		bean_name = bean_name.substring(bean_name.lastIndexOf(".")+1);
		//第一张工作表
		HSSFSheet sheet = workbook.createSheet(bean_name);
		//设置字体样式
		HSSFFont font = workbook.createFont();
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		HSSFCellStyle cellStyle= workbook.createCellStyle();
		cellStyle.setFont(font);
		//设置Excel表头,如果标题为null则用列名代替标题  
		if(columnTitle==null){
			columnTitle = columnName;
		}
		HSSFRow firstrow = sheet.createRow(0); // 下标为0的行开始 
		for (int i = 0; i < columnTitle.length; i++) {
			HSSFCell title = firstrow.createCell(i);
			title.setCellStyle(cellStyle);
			title.setCellValue(columnTitle[i]);
		}
		String value;
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		try{
			for(int t = 0;t < list.size();t++){
				Object b = list.get(t);
				HSSFRow cotent = sheet.createRow(t + 1);
				for(int i=0;i<columnName.length;i++){
					Method method = bean.getMethod("get"+columnName[i]);
					//判断是否是日期属性
					Object o = method.invoke(b);
					if(o!=null){
						if(o instanceof Date){
							value = format.format(format.parse(o.toString()));
						}else{
							if(ClassName !=null && !"".equals(ClassName) && ClassName.indexOf(","+o.getClass().getSimpleName()+",") != -1){
								value = o.getClass().getMethod("get"+columnName[i]+"Name").invoke(o).toString();
							}else{
								value = o.toString();
							}
						}
					}else{
						value="";
					}
					HSSFCell contentDetail = cotent.createCell(i);
					contentDetail.setCellValue(value);
				}
			}
			workbook.write(os);
			os.flush();
			os.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	/**
	 * 
	 * 描述:导入excel文件
	 * @param i_class:导入的文件中存放实体类的class
	 * @param file:需要导入的文件
	 * @param map:导入的模板(excel里的表头和实体类里的列对应)
	 * @param isExcel2003:判断excel文件是否为2003版本
	 * @return 返回值若为String则表示有错误,若为集合则为将excel中数据填充后的实体类集合
	 */
	public static Object Import(Class<?> i_class,Map<String,String> map, File file,boolean isExcel2003){
		//存储实体的集合
		List<Object> list = new ArrayList<Object>();
		//错误数
		int wrong=0;
		//标题数组
		String[] attrs = null;
		String[] attrsChildren = null;
		//错误消息
		StringBuffer message = new StringBuffer();
		SimpleDateFormat format = new SimpleDateFormat("yyyy-M-d");
		SimpleDateFormat format2 = new SimpleDateFormat("yyyy/M/d");
		DecimalFormat df = new DecimalFormat("0");  
		try {
			//根据文件得到workbook对象
			Workbook workbook = null;
			if(isExcel2003){
				//2003
				workbook = new HSSFWorkbook(new FileInputStream(file));	
			}else{
				//2007
				workbook = new XSSFWorkbook(new FileInputStream(file));
			}
			 
			//得到sheet工作表的数量
			int sheetNumber = workbook.getNumberOfSheets();
			//存储各个工作表标题的集合
			List<String[]> ColNames=new ArrayList<String[]>();
			//验证列名
			StringBuffer wrongCols = new StringBuffer("出错列名为:");
			int size = 0;
			Sheet sheet = workbook.getSheetAt(size);
			String content;
			while(sheet != null){
				Row row = sheet.getRow(0);
				if(row != null){
					int rowNum = (int)row.getLastCellNum();
					attrs = new String[rowNum];
					int isNull = 0;
					for(int i = 0;i < rowNum;i++){
						Cell cell = row.getCell(i);
						content = cell.getStringCellValue();
						if(content != null && !"".equals(content)){
							isNull++;
							if(!map.containsKey(content)){
								wrongCols.append(content+",");
							}else{
								attrs[i]=map.get(content);
							}
						}
					}
					attrsChildren = new String[isNull];
					for(int t = 0;t < isNull;t++){
						attrsChildren[t] = attrs[t];
					}
					attrs = attrsChildren;
					ColNames.add(attrs);
				}
				size++;
				if(size >= (sheetNumber - 1)){
					break;
				}
				sheet = workbook.getSheetAt(size);
			}
			if(!wrongCols.toString().equals("出错列名为:")){
				return wrongCols.subSequence(0, wrongCols.length() - 1);
			}
			//验证数据类型
			String MethodName;
			Method method;
			size = 0;
			sheet = workbook.getSheetAt(size);
			String oldContent;
			Date dateValue;
			while(sheet != null){
				oldContent = message.toString();
				int rowNum = 1;
				Row row = sheet.getRow(rowNum++);
				if(row == null){
					size++;
					if(size >= (sheetNumber - 1)){
						break;
					}
					sheet = workbook.getSheetAt(size);
					continue;
				}
				attrs = ColNames.get(size);
				Cell cell = null;
				while(row != null && row.getLastCellNum() > 0){
					for(int i=0;i<attrs.length;i++){
						dateValue = null;
						cell = row.getCell(i);
						String contentDetail = "";
						if (null != cell){
							// 以下是判断数据的类型  
							switch (cell.getCellType()){
								case HSSFCell.CELL_TYPE_NUMERIC: // 数字 
									//判断是否是日期类型
									if(HSSFDateUtil.isCellDateFormatted(cell)){
										dateValue = cell.getDateCellValue();
									}else{
										contentDetail = cell.getNumericCellValue() + "";
									}
			                        break;
			                    case HSSFCell.CELL_TYPE_STRING: // 字符串 
			                    	contentDetail = cell.getStringCellValue();
			                        break;
			                    case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
			                    	contentDetail = cell.getBooleanCellValue() + "";
			                        break;
			                    case HSSFCell.CELL_TYPE_FORMULA: // 公式 
			                    	contentDetail = cell.getCellFormula() + "";
			                        break;
			                    case HSSFCell.CELL_TYPE_BLANK: // 空值 
			                    	contentDetail = "";
			                        break;
			                    case HSSFCell.CELL_TYPE_ERROR: // 故障 
			                    	contentDetail = "";
			                        break;
			                    default:
			                    	contentDetail = "";
			                        break;
							}
						} 
						if(i > (row.getLastCellNum() - 1) || contentDetail == null || "".equals(contentDetail)){
							size++;
							if(size >= (sheetNumber - 1)){
								break;
							}
							sheet = workbook.getSheetAt(size);
							continue;
						}
						MethodName = "set"+attrs[i];
						//Integer类型
						try{
							method = i_class.getMethod(MethodName,Integer.class);
							Integer.parseInt(contentDetail);
							continue;
						}catch(NoSuchMethodException e){
							
						}catch(Exception e){
							wrong++;
							if(message.indexOf("第" + row.getRowNum() + "张工作表:") == -1){
								message.append("第" + row.getRowNum() + "张工作表:");
							}
							message.append(attrs[i] + "列,"+ rowNum + "行;");
							continue;
						}
						//Double类型
						try{
							method = i_class.getMethod(MethodName, Double.class);
							Double.parseDouble(contentDetail);
							continue;
						}catch(NoSuchMethodException e){
							
						}catch(Exception e1){
							wrong++;
							if(message.indexOf("第" + row.getRowNum() + "张工作表:") == -1){
								message.append("第" + row.getRowNum() + "张工作表:");
							}
							message.append(attrs[i] + "列," + rowNum + "行;");
							continue;
						}
						//Date类型
						try{
							method = i_class.getMethod(MethodName, Date.class);
							if(dateValue == null){
								try{
									format.parse(contentDetail);
								}catch(ParseException e){
									format2.parse(contentDetail);
								}
							}
							continue;
						}catch(NoSuchMethodException e){
							
						}catch(Exception e2){
							wrong++;
							if(message.indexOf("第" + row.getRowNum() + "张工作表:") == -1){
								message.append("第" + row.getRowNum() + "张工作表:");
							}
							message.append(attrs[i] + "列," + rowNum + "行;");
							continue;
						}
						//String类型
						try{
							method = i_class.getMethod(MethodName, String.class);
						}catch(NoSuchMethodException e){
							wrong++;
							if(message.indexOf("第" + row.getRowNum() + "张工作表:") == -1){
								message.append("第" + row.getRowNum() + "张工作表:");
							}
							message.append(attrs[i] + "列," + rowNum + "行;");
						}
					}
					row = sheet.getRow(rowNum++);
				}
				if(!message.toString().equals(oldContent)){
					message.append("<br />");
				}
				size++;
				if(size >= (sheetNumber - 1)){
					break;
				}
				sheet = workbook.getSheetAt(size);
			}
			if(wrong>0){
				return "数据出错总数为:" + wrong + "<br />分别为:" + message.toString();
			}
			size = 0;
			sheet = workbook.getSheetAt(size);
			Cell cell = null;
			while(sheet != null){
				if(size >= ColNames.size()){
					break;
				}
				attrs = ColNames.get(size);
				int rowNum = 1;
				Row row = sheet.getRow(rowNum++);
				while(row != null && row.getLastCellNum() > 0){
					//此处可增加判断行为空行是跳过的代码
					Object o = i_class.newInstance();
					for(int i=0;i<attrs.length;i++){
						dateValue = null;
						cell = row.getCell(i);
						String contentDetail = "";
						if (null != cell){
							// 以下是判断数据的类型  
							switch (cell.getCellType()){
								case HSSFCell.CELL_TYPE_NUMERIC: // 数字 
									//判断是否是日期类型,若是则转为字符串,因为有可能数据类型为String
									if(HSSFDateUtil.isCellDateFormatted(cell)){
										dateValue = cell.getDateCellValue();
										contentDetail = format.format(dateValue);
									}else{
										contentDetail = df.format(cell.getNumericCellValue());  
									}
			                        break;
			                    case HSSFCell.CELL_TYPE_STRING: // 字符串 
			                    	contentDetail = cell.getStringCellValue();
			                        break;
			                    case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
			                    	contentDetail = cell.getBooleanCellValue() + "";
			                        break;
			                    case HSSFCell.CELL_TYPE_FORMULA: // 公式 
			                    	contentDetail = cell.getCellFormula() + "";
			                        break;
			                    case HSSFCell.CELL_TYPE_BLANK: // 空值 
			                    	contentDetail = "";
			                        break;
			                    case HSSFCell.CELL_TYPE_ERROR: // 故障 
			                    	contentDetail = "";
			                        break;
			                    default:
			                    	contentDetail = "";
			                        break;
							}
						}
						if(i > (row.getLastCellNum() - 1) || contentDetail == null || "".equals(contentDetail)){
							continue;
						}
						MethodName = "set"+attrs[i];
						//得到该属性对应的set方法,参数有可能是Integer、Double、Date、String
						try{
							method = i_class.getMethod(MethodName,Integer.class);
							method.invoke(o, Integer.parseInt(contentDetail));
						}catch(Exception e){
							try{
								method = i_class.getMethod(MethodName, Double.class);
								method.invoke(o, Double.parseDouble(contentDetail));
							}catch(Exception e1){
								try{
									method = i_class.getMethod(MethodName, Date.class);
									if(dateValue != null){
										method.invoke(o, dateValue);
									}else{
										try{
											method.invoke(o, format.parse(contentDetail));
										}catch(ParseException pe){
											method.invoke(o, format2.parse(contentDetail));
										}
									}
									
								}catch(Exception e2){
									method = i_class.getMethod(MethodName, String.class);
									method.invoke(o, contentDetail);
								}
							}
						}
					}
					list.add(o);
					row = sheet.getRow(rowNum++);
				}
				size++;
				if(size >= (sheetNumber - 1)){
					break;
				}
				sheet = workbook.getSheetAt(size);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}
	public static void main(String argv[]) {
		/*List<Level> l_list = new ArrayList<Level>();
		for(int i=1;i<=10;i++){
			Level level = new Level(i,"LevelName" + i,"LevelDesc" + i,i);
			l_list.add(level);
		}
		String[] columnName = {"LevelId","LevelName","LevelDesc","LevelOrder"};
		String[] columnTitle = {"级别ID","级别名称","级别描述","级别重要顺序"};
		Export(null,l_list,"POI",columnName,columnTitle,null);
		Map<String,String> map = new HashMap<String,String>();
		map.put("级别ID", "LevelId");
		map.put("级别名称", "LevelName");
		map.put("级别描述", "LevelDesc");
		map.put("级别重要顺序", "LevelOrder");
		Object o = Import(Level.class,map,new File("d:/POI.xls"),true);
		if(o instanceof String){
			System.out.println(o.toString());
		}else{
			List<Level> test = (List<Level>)o;
			for(Level l : test){
				System.out.println(l.getLevelName());
			}
		}*/
	}
}

 用POI实现的导入导出excel的公用类,根据反射实现,导入的方法由于判断有效性略麻烦。。。

分享到:
评论

相关推荐

    SSM框架利用poi导入导出Excel文件 demo

    在本示例"SSM框架利用poi导入导出Excel文件 demo"中,我们将探讨如何在SSM项目中使用Apache POI库来实现Excel文件的导入与导出功能。 Apache POI是一个流行的开源库,它允许开发者在Java应用程序中创建、修改和显示...

    Java poi导入导出EXCEL工具类(兼容各版本)

    概述:Java poi导入导出EXCEL工具类(兼容各版本) 一、功能说明 允许同时导入或导出多个sheet,同一sheet可同时存在多个数据块,按数据块划分处理数据。 二、配置文件示例及详细说明 1、导入xml配置示例如下(见...

    java_poi实现excel导入导出

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

    poi 导入导出Excel相关jar包

    总结一下,Apache POI是Java处理Excel文件的标准库,它提供了全面的API来实现Excel的导入和导出。通过理解并熟练使用POI,开发者可以轻松地在应用程序中实现Excel数据的读取、写入和编辑功能。结合dim4j库,还能进行...

    poi导入导出Excel表格的所以jar包

    标题提到的"poi导入导出Excel表格的所以jar包"指的是使用Apache POI库进行Excel操作所需的依赖库。 1. **poi-3.8-20120326.jar**: 这是Apache POI的主要核心库,包含了处理Excel文件的核心类和方法。例如,你可以...

    POI 导入导出Excel表

    在这个实例中,我们将探讨如何使用Apache POI库在Java中实现Excel文件的导入与导出功能。 一、Apache POI简介 Apache POI 提供了Java API,使得开发者能够创建、修改和显示Microsoft Office格式的文件。对于Excel,...

    poi导入导出excel功能

    在Java开发中,Apache POI库是一个非常重要的工具,它允许...通过导入导出功能,可以实现数据的交换、分析和展示。这个基于Maven的案例为初学者提供了一个良好的起点,通过实践可以进一步理解和掌握POI的使用方法。

    Java基于POI的导入导出excel功能,附带测试功能,项目基于Maven,导入即可用,带测试Main方法提供例子

    Java基于POI的导入导出excel功能,附带测试功能,项目基于Maven,导入即可用,带测试Main方法提供例子。 用于导入导出Excel的Util包,基于Java的POI。可将List导出成Excel,或读取Excel成List、Map,Object&gt;,很方便...

    poi导入导出Excel源码

    标题“poi导入导出Excel源码”和描述涉及到的核心知识点是利用Apache POI进行Excel文件的导入与导出操作。 首先,让我们详细了解Apache POI库。Apache POI是Apache软件基金会的一个开源项目,其主要目标是创建Java ...

    POI 导入导出Excel表格模板

    综上所述,Apache POI 提供了强大的功能,使 Java 开发者能够轻松地进行 Excel 文件的导入导出以及模板处理。通过合理的工具类设计和最佳实践,我们可以高效地利用 POI 处理日常工作中与 Excel 相关的任务。

    Springboot+Poi实现Excel的导入导出

    本项目结合了Spring Boot、MyBatis、Apache POI和MySQL,实现了Excel数据的导入导出功能,这对于数据处理和分析尤其有用。下面我们将深入探讨这些技术及其在项目中的应用。 首先,Spring Boot以其“约定优于配置”...

    poi导入导出Excel通用工具类 兼容xls,xlsx

    总结,"poi导入导出Excel通用工具类 兼容xls,xlsx"这个工具实现了利用Apache POI库处理Excel文件的功能,涵盖了从旧版的.xls到新版的.xlsx格式,提供了方便的导入和导出接口,使得在Java开发中处理Excel数据变得...

    POI实现Excel导入导出并附带加载进度条

    总之,这个项目是一个完整的Java解决方案,用于处理Excel文件的导入导出,同时具备用户友好的进度条显示。它利用了Apache POI的强大功能,结合maven的依赖管理,以及可能的GUI组件,提供了高效且直观的数据操作体验...

    java 利用POI 导入导出Excel

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

    poi导入导出Excel

    标题中的“poi导入导出Excel”指的是Apache POI库在Java中用于处理Microsoft Office文档,特别是Excel文件的导入和导出功能。Apache POI是一个开源项目,它允许开发者使用Java来创建、修改和显示Microsoft Office...

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

    对于导入导出,主要关注HSSFWorkbook(老版本的Excel)和XSSFWorkbook(新版本的Excel)对象。 3. **Excel文件导入** - 创建一个Controller,接收文件上传请求,通常使用MultipartFile类型的参数。 - 使用POI读取...

    Java POI 导入导出Excel简单实例源代码

    Java POI 导入导出Excel简单实例源代码 该源代码的jar包,参见以下博文附录截图 Java POI导出EXCEL经典实现 Java导出Excel弹出下载框 http://blog.csdn.net/evangel_z/article/details/7332535 web页面导出Excel...

    Java POI EXCEL导入导出

    Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出Java POI EXCEL导入导出...

    java poi导入导出excel公共模块工具类-2018-09-05最新更新

    本人工作中自己写的一个excel工具类,可以单独打包成jar,作为公共模块使用。 使用它可以直接不用关心poi的api。导入导出,轻轻松松。 使用方法请关注一下,cn.com.flaginfo.biz.excel.test 包下面的Test类。

    SpringMvc 使用poi导入导出Excel

    本篇文章将详细介绍如何在Spring MVC项目中使用Apache POI库来实现Excel的导入和导出。 Apache POI是Apache软件基金会的一个开源项目,专门用于读写Microsoft Office格式的文件,包括Excel。在Java中,POI提供了API...

Global site tag (gtag.js) - Google Analytics