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项目中使用Apache POI库来实现Excel文件的导入与导出功能。 Apache POI是一个流行的开源库,它允许开发者在Java应用程序中创建、修改和显示...
概述:Java poi导入导出EXCEL工具类(兼容各版本) 一、功能说明 允许同时导入或导出多个sheet,同一sheet可同时存在多个数据块,按数据块划分处理数据。 二、配置文件示例及详细说明 1、导入xml配置示例如下(见...
Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 Excel 文件。在本文中,我们将详细介绍如何使用 Java POI 实现 Excel 导入导出功能。 1. 什么是 Java ...
总结一下,Apache POI是Java处理Excel文件的标准库,它提供了全面的API来实现Excel的导入和导出。通过理解并熟练使用POI,开发者可以轻松地在应用程序中实现Excel数据的读取、写入和编辑功能。结合dim4j库,还能进行...
标题提到的"poi导入导出Excel表格的所以jar包"指的是使用Apache POI库进行Excel操作所需的依赖库。 1. **poi-3.8-20120326.jar**: 这是Apache POI的主要核心库,包含了处理Excel文件的核心类和方法。例如,你可以...
在这个实例中,我们将探讨如何使用Apache POI库在Java中实现Excel文件的导入与导出功能。 一、Apache POI简介 Apache POI 提供了Java API,使得开发者能够创建、修改和显示Microsoft Office格式的文件。对于Excel,...
在Java开发中,Apache POI库是一个非常重要的工具,它允许...通过导入导出功能,可以实现数据的交换、分析和展示。这个基于Maven的案例为初学者提供了一个良好的起点,通过实践可以进一步理解和掌握POI的使用方法。
Java基于POI的导入导出excel功能,附带测试功能,项目基于Maven,导入即可用,带测试Main方法提供例子。 用于导入导出Excel的Util包,基于Java的POI。可将List导出成Excel,或读取Excel成List、Map,Object>,很方便...
标题“poi导入导出Excel源码”和描述涉及到的核心知识点是利用Apache POI进行Excel文件的导入与导出操作。 首先,让我们详细了解Apache POI库。Apache POI是Apache软件基金会的一个开源项目,其主要目标是创建Java ...
综上所述,Apache POI 提供了强大的功能,使 Java 开发者能够轻松地进行 Excel 文件的导入导出以及模板处理。通过合理的工具类设计和最佳实践,我们可以高效地利用 POI 处理日常工作中与 Excel 相关的任务。
本项目结合了Spring Boot、MyBatis、Apache POI和MySQL,实现了Excel数据的导入导出功能,这对于数据处理和分析尤其有用。下面我们将深入探讨这些技术及其在项目中的应用。 首先,Spring Boot以其“约定优于配置”...
总结,"poi导入导出Excel通用工具类 兼容xls,xlsx"这个工具实现了利用Apache POI库处理Excel文件的功能,涵盖了从旧版的.xls到新版的.xlsx格式,提供了方便的导入和导出接口,使得在Java开发中处理Excel数据变得...
总之,这个项目是一个完整的Java解决方案,用于处理Excel文件的导入导出,同时具备用户友好的进度条显示。它利用了Apache POI的强大功能,结合maven的依赖管理,以及可能的GUI组件,提供了高效且直观的数据操作体验...
前几天项目上需要加上导入导出,在网上找了一下,么有...于是自己写,源码里所需要的jar都有,从jsp界面进行Excel的导入导出,并可用于上传和下载。如有所用,喜不自禁,分享,开源的意义。 写的不是特别好,不喜勿喷!
标题中的“poi导入导出Excel”指的是Apache POI库在Java中用于处理Microsoft Office文档,特别是Excel文件的导入和导出功能。Apache POI是一个开源项目,它允许开发者使用Java来创建、修改和显示Microsoft Office...
对于导入导出,主要关注HSSFWorkbook(老版本的Excel)和XSSFWorkbook(新版本的Excel)对象。 3. **Excel文件导入** - 创建一个Controller,接收文件上传请求,通常使用MultipartFile类型的参数。 - 使用POI读取...
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导入导出...
本人工作中自己写的一个excel工具类,可以单独打包成jar,作为公共模块使用。 使用它可以直接不用关心poi的api。导入导出,轻轻松松。 使用方法请关注一下,cn.com.flaginfo.biz.excel.test 包下面的Test类。
本篇文章将详细介绍如何在Spring MVC项目中使用Apache POI库来实现Excel的导入和导出。 Apache POI是Apache软件基金会的一个开源项目,专门用于读写Microsoft Office格式的文件,包括Excel。在Java中,POI提供了API...