excel导入

工作中导入excel每次都要重写会不会很麻烦?

答案是肯定的。今天写了一个稍微通用一点的excel导出工具类,如果大家看了觉得还蛮好用,或是有什么问题,记得给我留言。

 

package com.system.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateUtils;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
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.poifs.filesystem.OfficeXmlFileException;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.pkg.controller.form.Pojo;
/***
 * 
 * @作者 Dick
 * @创建时间 2015年9月6日 下午3:39:36
 * @TODO excel导入的工具类
 * @修改备注
 * 
 *
 */
/***
 * 
 * @作者 Dick
 * @创建时间 2015年9月6日 下午5:25:13
 * @TODO
 * excel导出工具类,
 * 需要poi支持
 * 
 * @修改备注
 * 
 *
 */
public class ImportExcelUtil {
	private static Logger log = Logger.getLogger(ImportExcelUtil.class);
	/***
	 * 日期格式化类型
	 * 
	 * */
	private static String[] dateFormats = new String[]{"yyyy-MM","yyyyMM","yyyy/MM",   
        "yyyyMMdd","yyyy-MM-dd","yyyy/MM/dd",   
        "yyyyMMddHHmmss",   
                    "yyyy-MM-dd HH:mm:ss",   
                    "yyyy/MM/dd HH:mm:ss"};  
	/***
	 * 
	 * @作者 Dick
	 * @创建时间 2015年9月6日 下午3:08:50
	 * @param @param file
	 * @param @param clazz
	 * @param @param field 格式: excel列名=实体属性名
	 * @param @return
	 * @TODO 读取excel文件的内容。读取失败时返回 null;
	 * 
	 * @修改备注
	 * 
	 *
	 */
	public static List getExcelContent(File file, Class clazz,
			Map<String, Object> fields) {
		FileInputStream io = null;//poi会在结束时自动关闭流
		try {
			io = new FileInputStream(file);
			return getExcelContent(io, clazz, fields);
		} catch (FileNotFoundException e) {
			log.info("导入excel失败,文件不存在");
			log.error(e.getMessage(),e);
		} catch(OfficeXmlFileException e){
			log.error("excel属于Office 2007+ XML,因此采用xlsx读取.");
			//如果是2007以上的excel,在catch中处理
			try {
				io = new FileInputStream(file);
				//xlsx结尾的excel。
				return getExcelContentXlsx(io, clazz, fields);
			} catch (FileNotFoundException e1) {
				log.error(e1.getMessage(),e1);
			}
		}
		return null;
	}

	/****
	 * 
	 * @作者 Dick
	 * @创建时间 2015年9月6日 下午3:37:00
	 * @param @param io
	 * @param @param clazz
	 * @param @param fields 格式: excel列名=实体属性名
	 * @param
	 * @return
	 * @TODO 只能读取*.xls的excel文件流中的内容, 读取失败时返回 null;
	 * @修改备注
	 * 
	 *
	 */
	public static List getExcelContent(InputStream io, Class clazz,
			Map<String, Object> fields) {
		HSSFWorkbook workbook = null;
		HSSFSheet sheet = null;
		List<Object> results =null;
		try {
			 workbook = new HSSFWorkbook(io);
			for (Iterator iterator = fields.keySet().iterator(); iterator
					.hasNext();) {
				String key =  iterator.next().toString();
				String prop =  fields.get(key).toString();
				fields.put(key, clazz.getDeclaredField(prop));
			}
			results=new ArrayList<Object>();
			
			
			sheet = workbook.getSheetAt(0);
			// 标题总列数
			int maxRow = sheet.getLastRowNum();
			List<String> columns = new ArrayList<String>();
			for (int j = 0; j < sheet.getRow(0).getLastCellNum(); j++) {
				columns.add(sheet.getRow(0).getCell(j).getStringCellValue()
						.trim());
			}

			for (int j = 1; j < maxRow; j++) {
				HSSFRow row = sheet.getRow(j);
				if (null != row) {
					Object obj = Class.forName(clazz.getName()).newInstance();
					for (int k = 0; k < row.getLastCellNum(); k++) {
						HSSFCell cell = row.getCell(k);
						Object value = null;
						if (null != cell) {
							switch (cell.getCellType()) {
							case HSSFCell.CELL_TYPE_NUMERIC: // 数字
								// 日期格式处理
								if (HSSFDateUtil.isCellDateFormatted(cell)) {
									if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式
										SimpleDateFormat sdf = null;
										if (cell.getCellStyle().getDataFormat() == HSSFDataFormat
												.getBuiltinFormat("h:mm")) {
											sdf = new SimpleDateFormat("HH:mm");
										} else {// 日期
											sdf = new SimpleDateFormat(
													"yyyy-MM-dd");
										}
										Date date = cell.getDateCellValue();
										value = date;
									} else if (cell.getCellStyle()
											.getDataFormat() == 58) {
										// 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
										SimpleDateFormat sdf = new SimpleDateFormat(
												"yyyy-MM-dd");
										double v = cell.getNumericCellValue();
										Date date = org.apache.poi.ss.usermodel.DateUtil
												.getJavaDate(v);
										value = date;
									} else {
										double v = cell.getNumericCellValue();
										CellStyle style = cell.getCellStyle();
										DecimalFormat format = new DecimalFormat();
										String temp = style
												.getDataFormatString();
										// 单元格设置成常规
										if (temp.equals("General")) {
											format.applyPattern("#");
										}
										value = Double.valueOf(v);
									}
								}

								break;
							case HSSFCell.CELL_TYPE_STRING: // 字符串
								value = cell.getStringCellValue() != null ? cell
										.getStringCellValue().trim() : null;
								break;
							case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
								value = Boolean.valueOf(cell
										.getBooleanCellValue());
								break;
							case HSSFCell.CELL_TYPE_FORMULA: // 公式
								value = null;
												// + "   ");
								break;
							case HSSFCell.CELL_TYPE_BLANK: // 空值
								value = null;// System.out.println(" ");
								break;
							case HSSFCell.CELL_TYPE_ERROR: // 故障
								value = null;// System.out.println(" ");
								break;
							default:
								value = null;// System.out.print("未知类型   ");
								break;
							}

							Field field = (Field) fields.get(columns.get(k));
							if(field!=null){fieldValueSetting(clazz, field, obj, value);}
						} else {
							continue;
						}
					}

					results.add(obj);
				}

			}
			return results;
		} catch (FileNotFoundException e) {
			log.info("导入excel失败,文件不存在");
			log.error(e.getMessage(),e);
		} catch (IOException e) {
			log.info("导入excel失败,文件流异常");
			log.error(e.getMessage(),e);
		} catch (ClassNotFoundException e) {
			log.info("导入excel失败,无法根据class创建对象");
			log.error(e.getMessage(),e);
		} catch (NoSuchFieldException e) {
			log.info("导入excel失败,无法获取类的属性字段");
			log.error(e.getMessage(),e);
		} catch (SecurityException e) {
			log.info("导入excel失败,无法获取类的属性字段");
			log.error(e.getMessage(),e);
		} catch (InstantiationException e) {
			log.info("导入excel失败,创建对象失败,至少有一个无参的构造函数");
			log.error(e.getMessage(),e);
		} catch (IllegalAccessException e) {
			log.info("导入excel失败,创建行对象失败!");
			log.error(e.getMessage(),e);
		} finally {
			if (workbook != null) {
				workbook = null;
			}

		}

		return null;

	}
	
	/***
	 * 
	 * @作者 Dick
	 * @创建时间 2015年9月6日 下午4:03:50
	 * @param @param io
	 * @param @param clazz
	 * @param @param fields
	 * @param @return
	 * @TODO
	 *  只能读取*.xlsx文件中的内容,读取失败返回 null
	 * 
	 * @修改备注
	 * 
	 *
	 */
	public static List getExcelContentXlsx(InputStream io, Class clazz,
			Map<String, Object> fields) {
		XSSFWorkbook workbook = null;
		XSSFSheet sheet = null;
		List<Object> results = new ArrayList<Object>();
		try {
			workbook = new XSSFWorkbook(io);
			for (Iterator iterator = fields.keySet().iterator(); iterator
					.hasNext();) {
				String key =  iterator.next().toString();
				//System.out.println("100:key="+key);
				String prop =  fields.get(key).toString();
				fields.put(key, clazz.getDeclaredField(prop));
			}
			
			
			sheet = workbook.getSheetAt(0);
			// 标题总列数
			int maxRow = sheet.getLastRowNum();
			List<String> columns = new ArrayList<String>();
			for (int j = 0; j < sheet.getRow(0).getLastCellNum(); j++) {
				columns.add(sheet.getRow(0).getCell(j).getStringCellValue()
						.trim());
			}

			for (int j = 1; j <= maxRow; j++) {
				XSSFRow row = sheet.getRow(j);
				if (null != row) {
					Object obj = Class.forName(clazz.getName()).newInstance();
					for (int k = 0; k < row.getLastCellNum(); k++) {
						XSSFCell cell = row.getCell(k);
						Object value = null;
						if (null != cell) {
							Field field = (Field) fields.get(columns.get(k));
							if(field!=null){
							switch (cell.getCellType()) {
							case XSSFCell.CELL_TYPE_NUMERIC: // 数字
								// 日期格式处理
								if (HSSFDateUtil.isCellDateFormatted(cell)) {
									if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式
										SimpleDateFormat sdf = null;
										if (cell.getCellStyle().getDataFormat() == HSSFDataFormat
												.getBuiltinFormat("h:mm")) {
											sdf = new SimpleDateFormat("HH:mm");
										} else {// 日期
											sdf = new SimpleDateFormat(
													"yyyy-MM-dd");
										}
										Date date = cell.getDateCellValue();
										value = date;
									} else if (cell.getCellStyle()
											.getDataFormat() == 58) {
										// 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
										SimpleDateFormat sdf = new SimpleDateFormat(
												"yyyy-MM-dd");
										double v = cell.getNumericCellValue();
										Date date = org.apache.poi.ss.usermodel.DateUtil
												.getJavaDate(v);
										value = date;
									} else {
										double v = cell.getNumericCellValue();
										CellStyle style = cell.getCellStyle();
										DecimalFormat format = new DecimalFormat();
										String temp = style
												.getDataFormatString();
										// 单元格设置成常规
										if (temp.equals("General")) {
											format.applyPattern("#");
										}
										value = Double.valueOf(v);
									}
								}

								break;
							case XSSFCell.CELL_TYPE_STRING: // 字符串
								value = cell.getStringCellValue() != null ? cell
										.getStringCellValue().trim() : null;
								break;
							case XSSFCell.CELL_TYPE_BOOLEAN: // Boolean
								value = Boolean.valueOf(cell
										.getBooleanCellValue());
								break;
							case XSSFCell.CELL_TYPE_FORMULA: // 公式
								value = null;// System.out.print(cell.getCellFormula()
												// + "   ");
								break;
							case XSSFCell.CELL_TYPE_BLANK: // 空值
								value = null;// System.out.println(" ");
								break;
							case XSSFCell.CELL_TYPE_ERROR: // 故障
								value = null;// System.out.println(" ");
								break;
							default:
								value = null;// System.out.print("未知类型   ");
								break;
							}

							
								fieldValueSetting(clazz, field, obj, value);
								
							}
						} else {
							continue;
						}
					}

					results.add(obj);
				}

			}
			return results;
		} catch (FileNotFoundException e) {
			log.info("导入excel失败,文件不存在");
			log.error(e.getMessage(),e);
		} catch (IOException e) {
			log.info("导入excel失败,文件流异常");
			log.error(e.getMessage(),e);
		} catch (ClassNotFoundException e) {
			log.info("导入excel失败,无法根据class创建对象");
			log.error(e.getMessage(),e);
		} catch (NoSuchFieldException e) {
			log.info("导入excel失败,无法获取类的属性字段");
			log.error(e.getMessage(),e);
		} catch (SecurityException e) {
			log.info("导入excel失败,无法获取类的属性字段");
			log.error(e.getMessage(),e);
		} catch (InstantiationException e) {
			log.info("导入excel失败,创建对象失败,至少有一个无参的构造函数");
			log.error(e.getMessage(),e);
		} catch (IllegalAccessException e) {
			log.info("导入excel失败,创建行对象失败!");
			log.error(e.getMessage(),e);
		} finally {
			if (workbook != null) {
				workbook = null;
			}

		}

		return null;

	}
	 /**
	  * 
	  * @作者 Dick
	  * @创建时间 2015年9月6日 下午5:03:13
	  * @param @param clazz
	  * @param @param field
	  * @param @param target
	  * @param @param value
	  * @TODO
	  *  向clazz类的对象target的field属性设置值 value
	  * 
	  * @修改备注
	  * 
	  *
	  */
	public static  void fieldValueSetting(Class clazz,Field field,Object target,Object value)  {

			try {
				clazz.getMethod("set"+StringUtils.capitalize(field.getName()),field.getType()).invoke(target, cast(field.getType(),value));
			} catch (IllegalAccessException e) {
				log.error("私有成员,非法访问");
			} catch (IllegalArgumentException e) {
				log.error("非法参数:"+value.getClass().getName()+" to "+field.getType());
			} catch (InvocationTargetException e) {
				log.error("实例对象异常,target="+target.getClass().getName());
			} catch (NoSuchMethodException e) {
				log.error("对象方法异常,method=set"+StringUtils.capitalize(field.getName()));
			} catch (SecurityException e) {
				log.error(e.getMessage());
			}
		 
	
	}
	
	
	/***
	 * 
	 * @作者 Dick
	 * @创建时间 2015年9月6日 下午4:54:00
	 * @param @param type 目标类型
	 * @param @param value 参数类型
	 * @param @return
	 * @TODO
	 * 
	 * 
	 * @修改备注
	 * 
	 *
	 */
	public static Object cast(Class<?> type,Object value){
		if(value.getClass().getName().equals(type.getName())){
			return value;
		}
		if("java.lang.String".equals(type.getName())){
			return value.toString();
		}
		if("java.lang.Long".equals(type.getName())&&"java.lang.String".equals(value.getClass().getName())){
			
			return Long.valueOf(value.toString().trim());
		}
		if("java.lang.Double".equals(type.getName())&&"java.lang.String".equals(value.getClass().getName())){
			
			return Double.valueOf(value.toString().trim());
		}
		if("java.lang.Integer".equals(type.getName())&&"java.lang.String".equals(value.getClass().getName())){
			
			return Integer.valueOf(value.toString().trim());
		}
		if("java.util.Date".equals(type.getName())&&"java.lang.String".equals(value.getClass().getName())){
		
			try {
				return DateUtils.parseDate(value.toString().trim(),dateFormats);
			} catch (ParseException e) {
				log.error("日期格式转换失败:"+value.toString().trim());
				return null;
			}
		}
		if("java.util.Date".equals(type.getName())&&"java.lang.Long".equals(value.getClass().getName())){
			return new Date(Long.valueOf(value.toString()));
		}
		return null;
	}

	/***
	 * 
	 * @作者 Dick
	 * @创建时间 2015年9月6日 下午5:25:47
	 * @param @param args
	 * @TODO
	 * 测试
	 * 
	 * @修改备注
	 * 
	 *
	 */
	public static void main(String[] args) {
		Map<String, Object> fields = new HashMap<String, Object>();
		fields.put("包裹号", "packageId"); //key:excel字段名,value:实体的字段名
		fields.put("订单编号", "orderNumber");
		fields.put("公司", "deliveryCompany");
		fields.put("单号", "deliveryNo");
		fields.put("创建日期", "gmtCreated");
		
		
		List<Pojo> result = ImportExcelUtil.getExcelContent(
				new File("F:\\迅雷下载\\20150906125645.xlsx"), Pojo.class, fields);
		if (result != null) {
			for (int i = 0; i < result.size(); i++) {
				System.out.println(result.toString());
			}

		}
	}
}

 

excel的内容如下:

 

编号包裹号公司单号金额手机号码创建日期
50000461222222222222221.001

2015-05-05 00:00:00

 

 

 

package com.pkg.controller.form;

import java.util.Date;

public class Pojo {

	private Long packageId;
	private String orderNumber;
	private String deliveryCompany;
	private String deliveryNo;
	private Date gmtCreated;
	/**
	 * Long
	 * @return the packageId
	 */
	public Long getPackageId() {
		return packageId;
	}
	/**
	 * @param packageId the packageId to set
	 */
	public void setPackageId(Long packageId) {
		this.packageId = packageId;
	}
	/**
	 * String
	 * @return the orderNumber
	 */
	public String getOrderNumber() {
		return orderNumber;
	}
	/**
	 * @param orderNumber the orderNumber to set
	 */
	public void setOrderNumber(String orderNumber) {
		this.orderNumber = orderNumber;
	}
	/**
	 * String
	 * @return the deliveryCompany
	 */
	public String getDeliveryCompany() {
		return deliveryCompany;
	}
	/**
	 * @param deliveryCompany the deliveryCompany to set
	 */
	public void setDeliveryCompany(String deliveryCompany) {
		this.deliveryCompany = deliveryCompany;
	}
	/**
	 * String
	 * @return the deliveryNo
	 */
	public String getDeliveryNo() {
		return deliveryNo;
	}
	/**
	 * @param deliveryNo the deliveryNo to set
	 */
	public void setDeliveryNo(String deliveryNo) {
		this.deliveryNo = deliveryNo;
	}
	/**
	 * Date
	 * @return the gmtCreated
	 */
	public Date getGmtCreated() {
		return gmtCreated;
	}
	/**
	 * @param gmtCreated the gmtCreated to set
	 */
	public void setGmtCreated(Date gmtCreated) {
		this.gmtCreated = gmtCreated;
	}
	
}

 

 放到项目中可能会有编辑异常,调整后即可调用 main函数测试下了。

 

 

转载请注明出处,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字乡村和智慧农业的数字化转型是当前农业发展的新趋势,旨在通过应用数字技术,实现农业全流程的再造和全生命周期的管理服务。中国政府高度重视这一领域的发展,提出“数字中国”和“乡村振兴”战略,以提升国家治理能力,推动城乡融合发展。 数字乡村的建设面临乡村治理、基础设施、产业链条和公共服务等方面的问题,需要分阶段实施《数字乡村发展战略纲要》来解决。农业数字化转型的需求包括满足市民对优质农产品的需求、解决产销对接问题、形成优质优价机制、提高农业劳动力素质、打破信息孤岛、提高农业政策服务的精准度和有效性,以及解决农业融资难的问题。 数字乡村建设的关键在于构建“1+3+4+1”工程,即以新技术、新要素、新商业、新农民、新文化、新农村为核心,推进数据融合,强化农业大数据的汇集功能。数字农业大数据解决方案以农业数字底图和数据资源为基础,通过可视化监管,实现区域农业的全面数字化管理。 数字农业大数据架构基于大数据、区块链、GIS和物联网技术,构建农业大数据中心、农业物联网平台和农村综合服务指挥决策平台三大基础平台。农业大数据中心汇聚各类涉农信息资源和业务数据,支持大数据应用。信息采集系统覆盖市、县、乡、村多级,形成高效的农业大数据信息采集体系。 农业物联网平台包括环境监测系统、视频监控系统、预警预报系统和智能控制系统,通过收集和监测数据,实现对农业环境和生产过程的智能化管理。综合服务指挥决策平台利用数据分析和GIS技术,为农业决策提供支持。 数字乡村建设包括三大服务平台:治理服务平台、民生服务平台和产业服务平台。治理服务平台通过大数据和AI技术,实现乡村治理的数字化;民生服务平台利用互联网技术,提供各类民生服务;产业服务平台融合政企关系,支持农业产业发展。 数字乡村的应用场景广泛,包括农业生产过程、农产品流通、农业管理和农村社会服务。农业生产管理系统利用AIoT技术,实现农业生产的标准化和智能化。农产品智慧流通管理系统和溯源管理系统提高流通效率和产品追溯能力。智慧农业管理通过互联网+农业,提升农业管理的科学性和效率。农村社会服务则通过数字化手段,提高农村地区的公共服务水平。 总体而言,数字乡村和智慧农业的建设,不仅能够提升农业生产效率和管理水平,还能够促进农村地区的社会经济发展,实现城乡融合发展,是推动中国农业现代化的重要途径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值