`

java中Exel导入数据

 
阅读更多

TestImportExcel.java

 

 

[java] view plaincopy
 
  1. package com.test;  
  2.   
  3. import com.util.ExcelAnnotation;  
  4. import org.apache.poi.hssf.usermodel.HSSFSheet;  
  5. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  6. import org.apache.poi.ss.usermodel.Cell;  
  7. import org.apache.poi.ss.usermodel.Row;  
  8. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
  9. import java.io.File;  
  10. import java.io.FileInputStream;  
  11. import java.lang.reflect.Field;  
  12. import java.lang.reflect.Method;  
  13. import java.lang.reflect.Type;  
  14. import java.text.DecimalFormat;  
  15. import java.text.SimpleDateFormat;  
  16. import java.util.*;  
  17.   
  18. /** 
  19.  * Created by IntelliJ IDEA. 
  20.  * User: CYG 
  21.  * Date: 12-3-5 
  22.  * Time: 下午4:39 
  23.  * To change this template use File | Settings | File Templates. 
  24.  */  
  25. public class TestImportExcel extends HibernateDaoSupport {  
  26.   
  27.     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
  28.   
  29.     public Collection impExcel(String className, File file, String... pattern) throws Exception {  
  30.   
  31.         Collection classList = new ArrayList();//解析后每条PatrolGps数据  
  32.         Class clazz = Class.forName(className);//实例化类  
  33.         int exceptionNum = 0;  
  34.   
  35.         try {  
  36.             /** 
  37.              * 类反射得到调用方法 
  38.              */  
  39.             Field filed[] = clazz.getDeclaredFields();  
  40.             // 将所有标有Annotation的字段,也就是允许导入数据的字段,放入到一个map中  
  41.             Map fieldMap = new HashMap();  
  42.             // 循环读取所有字段  
  43.             for (int i = 0; i < filed.length; i++) {  
  44.                 Field f = filed[i];  
  45.                 // 得到单个字段上的Annotation  
  46.                 ExcelAnnotation exa = f.getAnnotation(ExcelAnnotation.class);  
  47.                 // 如果标识了Annotationd的话  
  48.                 if (exa != null) {  
  49.                     // 构造设置了Annotation的字段的Setter方法  
  50.                     String fieldName = f.getName();  
  51.                     String setMethodName = "set"  
  52.                             + fieldName.substring(01).toUpperCase()  
  53.                             + fieldName.substring(1);  
  54.                     // 构造调用的method,  
  55.                     Method setMethod = clazz.getMethod(setMethodName,  
  56.                             new Class[] { f.getType() });  
  57.                     // 将这个method以Annotaion的名字为key来存入。  
  58.                     fieldMap.put(exa.exportName(), setMethod);//注释的名称对应字段的set方法  
  59.                     fieldMap.put(exa.exportName()+"_exa", exa);//注释的名称拼接_exa对应字段的注释  
  60.                 }  
  61.             }  
  62.             /** 
  63.              * excel的解析开始 
  64.              */  
  65.             // 将传入的File构造为FileInputStream;  
  66.             FileInputStream in = new FileInputStream(file);  
  67.             // 得到工作表  
  68.             HSSFWorkbook book = new HSSFWorkbook(in);  
  69.             // 得到第一页  
  70.             HSSFSheet sheet = book.getSheetAt(0);  
  71.             // 得到第一面的所有行  
  72.             Iterator<Row> allRows = sheet.rowIterator();  
  73.             /** 
  74.              * 标题解析 
  75.              */  
  76.             // 得到第一行,也就是标题行  
  77.             Row title = allRows.next();  
  78.             // 得到第一行的所有列  
  79.             Iterator<Cell> cellTitle = title.cellIterator();  
  80.             // 将标题的文字内容放入到一个map中。  
  81.             Map titleMap = new HashMap();  
  82.             int i=0;  
  83.             while (cellTitle.hasNext()) {  
  84.                 Cell cell = cellTitle.next();  
  85.                 String value = cell.getStringCellValue();  
  86.                 titleMap.put(i, value);  
  87.                 i = i + 1;  
  88.             }  
  89.             // 判断标题栏是否为空  
  90.             if(fieldMap.get(titleMap.get(0))==null){  
  91.                 exceptionNum = 3;  
  92.                 throw new Exception();  
  93.             }  
  94.             /** 
  95.              * 解析内容行 
  96.              */  
  97.             // 用来格式化日期的DateFormat  
  98.             if(pattern.length>=1)  
  99.             {  
  100.                 sdf=new SimpleDateFormat(pattern[0]);  
  101.             }  
  102.             int j = 0;//行数  
  103.             int k = 0;//列数  
  104.             try{  
  105.                 while(allRows.hasNext()){  
  106.                     // 标题下的第一行  
  107.                     Row nextRow = allRows.next();  
  108.                     // 得到传入类的实例  
  109.                     Object objClass = clazz.newInstance();  
  110.                     // 遍历一行的列,每行开始初始化列数  
  111.                     for (k=0;k<titleMap.size();k++){  
  112.                         // 列取值  
  113.                         Cell cell = nextRow.getCell(k);  
  114.                         // 这里得到此列对应的标题  
  115.                         String titleString = titleMap.get(k).toString();  
  116.                         // 如果这一列的标题和类中的某一列的Annotation相同,那么就调用此类的set方法进行赋值  
  117.                         if(fieldMap.containsValue(titleString)){  
  118.                             Method setMethod = (Method)fieldMap.get(titleString);  
  119.                             ExcelAnnotation annotation = (ExcelAnnotation)fieldMap.get(titleString+"_exa");  
  120.                             // 得到setter方法的参数  
  121.                             Type[] setterTypes = setMethod.getGenericParameterTypes();  
  122.                             // setter方法只有一个参数  
  123.                             String parType = setterTypes[0].toString();  
  124.                             // 取得参数的类型保存到一个字符串里面  
  125.                             String typeString = "";  
  126.                             if(null != cell){//当前单元格不为空  
  127.                                  if(cell.getCellType() == cell.CELL_TYPE_NUMERIC){  
  128.                                      java.text.DecimalFormat formatter = new DecimalFormat("#");  
  129.                                      typeString = formatter.format(cell.getNumericCellValue());  
  130.                                  }else if(cell.getCellType() == cell.CELL_TYPE_STRING){  
  131.                                      typeString = String.valueOf(cell.getStringCellValue());  
  132.                                  }else if(cell.getCellType() == cell.CELL_TYPE_FORMULA){  
  133.                                      typeString = String.valueOf(cell.getDateCellValue());  
  134.                                  }else if(cell.getCellType() == cell.CELL_TYPE_BLANK){  
  135.                                      typeString = String.valueOf(cell.getStringCellValue());  
  136.                                  }else if(cell.getCellType() == cell.CELL_TYPE_ERROR){  
  137.                                      typeString = "";  
  138.                                  }  
  139.                             }  
  140.                             if(parType.equals("class java.lang.String")){  
  141.                                 setMethod.invoke(objClass,typeString);  
  142.                             }else if(parType.equals("class java.util.Date")){  
  143.                                 if(null!=typeString && !"".equals(typeString.trim()))  
  144.                                     setMethod.invoke(objClass,sdf.format(typeString.trim()));  
  145.                             }else if(parType.equals("class java.lang.Boolean")){  
  146.                                 Boolean b = false;  
  147.                                 if(typeString.trim().equals("是")){  
  148.                                     b = true;  
  149.                                 }  
  150.                                 setMethod.invoke(objClass,b);  
  151.                             }else if(parType.equals("class java.lang.Integer")){  
  152.                                 setMethod.invoke(objClass,new Integer(typeString.trim()));  
  153.                             }else if(parType.equals("class java.lang.Long")){  
  154.                                 if(null != typeString && !"".equals(typeString.trim()))  
  155.                                     setMethod.invoke(objClass,new Long(typeString));  
  156.                                 else  
  157.                                     setMethod.invoke(objClass,-1L);  
  158.                             }else if(parType.equals("class java.lang.Float")){  
  159.                                 if(typeString!=null&&!"".equals(typeString.trim()))  
  160.                                     setMethod.invoke(objClass,new Float(typeString));  
  161.                                 else {  
  162.                                     setMethod.invoke(objClass,new Float(-1));  
  163.                                 }  
  164.                             }else if(parType.equals("class java.lang.Double")){  
  165.                                 if(typeString!=null&&!"".equals(typeString.trim()))  
  166.                                     setMethod.invoke(objClass,new Double(typeString));  
  167.                                 else {  
  168.                                     setMethod.invoke(objClass,new Double(-1));  
  169.                                 }  
  170.                             }  
  171.                         }  
  172.                     }  
  173.                     classList.add(objClass);//将这个类保存到List里面  
  174.                 }  
  175.             }catch (Exception e){  
  176.                 e.printStackTrace();  
  177.                 if(exceptionNum == 0){  
  178.                     throw new Exception("第"+(j+1)+"行"+(k+1)+"列出错!请检查!") ;  
  179.                 }  
  180.             }  
  181.         }catch (Exception e){  
  182.             e.printStackTrace();  
  183.             if(exceptionNum == 3){  
  184.                 throw new Exception("第一行标题栏不正确!") ;  
  185.             }  
  186.             throw new Exception("导入出错,请检查Excel格式") ;  
  187.         }  
  188.         return classList;//返回解析成功后List内容  
  189.     }  
  190.   
  191.     public void save(String className, File File) throws Exception{  
  192.         try {  
  193.             Long before = System.currentTimeMillis();  
  194.             List obj = (ArrayList)impExcel(className,File);  
  195.             Long after = System.currentTimeMillis();  
  196.             System.out.println("此次操作共耗时:" + (after - before) + "毫秒");  
  197.             if(null != obj)  
  198.                 for(int i=0;i<obj.size();i++){  
  199.                     getHibernateTemplate().saveOrUpdate(obj.get(i));  
  200.                 }  
  201.         } catch (Exception e){  
  202.             e.printStackTrace();  
  203.             throw e;  
  204.         }  
  205.     }  
  206. }  


对于以上测试,自己随便编写一个实体类即可!要注解的。

 

    @Id
    @SequenceGenerator(name = "SEQ_PATROL_GPS", sequenceName = "SEQ_PATROL_GPS_ID", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_PATROL_GPS")
    @Basic(optional = false)
    @Column(name = "GPS_ID", nullable = false, precision = 32, scale = 0)

上面这些是注解ID的,不需要注解导入!

    @Column(name="Excel_NAME",length = 50)
    @ExcelAnnotation(exportName = "Excel名字")

上面注解需要导入的Excel字段!

 

ExcelAnnotation.java

 

 

 

[java] view plaincopy
 
  1. package com.util;  
  2.   
  3. import java.lang.annotation.*;  
  4.   
  5. public @interface ExcelAnnotation {     
  6.     // excel导出时标题显示的名字,如果没有设置Annotation属性,将不会被导出和导入     
  7.     public String exportName();  
  8.     public String FKEntity() default "";  
  9.     public String FKID() default "";  
  10.     public String name() default "";  
  11. }    
分享到:
评论

相关推荐

    java读取excel数据导入数据库源码

    java读取excel数据导入数据库源码 java读取excel数据导入数据库源码

    Java 使用poi导入excel 并使用xml做数据验证

    导入数据的过程中,首先需要创建一个`Workbook`对象来代表Excel文件,然后通过`Sheet`对象来操作单个工作表,接着是`Row`和`Cell`对象来处理每一行和每一列的数据。使用POI读取Excel数据的基本步骤如下: 1. 加载...

    java实现Excel数据导入到mysql数据库.zip

    本项目"java实现Excel数据导入到mysql数据库"旨在利用Java技术将Excel表格中的数据高效地导入到MySQL数据库,并且在数据库中存在相同数据时进行更新,同时也支持将数据库中的数据导出到Excel表中。这个过程涉及到多...

    java实现Excel数据导入到数据库

    在Java编程环境中,将Excel数据导入到数据库以及将数据库数据导出到Excel是常见的数据处理需求。本篇文章将深入探讨如何使用Java实现这两个功能,主要涉及的技术栈包括Apache POI库用于操作Excel,以及JDBC(Java ...

    JAVA中excel导入导出通用方法

    JAVA中excel导入导出通用方法 JAVA 中 excel 导入导出通用方法是指在 Java 项目中实现 excel 文件的导入和导出功能。这种方法可以应用于各种需要 excel 文件交互的业务场景中。 一、引入依赖 在 Java 项目中想要...

    java实现excel导入数据库

    在Java编程中,将Excel数据导入到MySQL数据库是一项常见的任务,尤其在数据处理和分析的场景下。要完成这个过程,我们需要使用特定的库来读取Excel文件,并使用JDBC(Java Database Connectivity)来与MySQL数据库...

    Java实现Excel导入导出操作详解.pptx.pptx

    Java实现Excel导入导出是Java开发中常见的任务,主要用于数据的批量处理和分析,尤其在数据分析、报表生成和数据备份等方面具有广泛应用。要熟练掌握这一技术,开发者需要了解Excel文件的结构,熟悉Java的文件操作,...

    java实现Excel导入(POI)

    **六、Excel导入的优化** 1. **内存管理**:大量数据可能导致内存溢出,可以考虑分批读取或使用SXSSF(一个内存效率更高的API)。 2. **错误处理**:在处理Excel数据时,可能遇到格式错误、空值等问题,需要设置...

    java实现excel导入导出.pdf

    在 Java 中,实现 Excel 导入导出可以使用多种方式,本文将介绍使用 JXL 和 POI 两个库实现 Excel 导入导出的方法。 使用 JXL 库实现 Excel 导入导出 JXL(Java Excel API)是一个开源的 Java 库,用于读写 Excel ...

    最新java实现Excel导入导出

    用Java实现的Excel的导入导出,简洁明了,高质量代码。

    java poi 导入大数据量Excel数据 防止内存溢出处理.zip

    Java中的Apache POI库是用于读取和...通过以上策略,可以有效地处理Java POI在导入大数据量Excel时的内存溢出问题,同时提高程序的运行效率。在实践中,应根据具体场景选择合适的优化方法,确保程序的稳定性和性能。

    java Excel工具类,导入导出Excel数据

    java Excel工具类,导入导出Excel数据,导入数据对合并表格有判断获取数据,导出数据到Excel,Excel文件不存在会创建。 博客:https://blog.csdn.net/qq_37902949/article/details/81230640

    Java实现excel文档数据导入数据库、导出excel

    在Java编程中,处理Excel文档是一项常见的任务,特别是在数据处理、数据分析和报表生成等领域。本文将详细介绍如何使用Java实现Excel文档数据的导入到数据库以及从数据库导出到Excel。 一、导入Excel数据到数据库 ...

    Java 实现从Excel批量导入数据到MySQL

    本文将详细介绍如何利用Java实现从Excel批量导入数据到MySQL数据库。 首先,我们需要了解两个关键的库:Apache POI 和 JDBC。Apache POI 是一个开源的Java库,用于读写Microsoft Office格式的文件,包括Excel。JDBC...

    java_poi实现excel导入导出

    在本文中,我们将详细介绍如何使用 Java POI 实现 Excel 导入导出功能。 1. 什么是 Java POI Java POI 是一个开源的 Java 库,由 Apache 软件基金会维护。它提供了一系列的 API,用于处理 Microsoft Office 文件...

    java解析excel并导入数据库的web工程

    回答csdn论坛:Java语言下excel导入到mysql数据库表...

    java实现Excel导入导出

    Java 实现 Excel 导入导出是指使用 Java 语言编写程序来实现将 Excel 文件中的数据导入到 Java 程序中,并将 Java 程序中的数据导出到 Excel 文件中。这种操作可以使用 Apache POI 库来实现。 POI 库简介 Apache ...

    excel导入到数据库中的java代码

    excel导入到数据库中的java代码 excel导入到数据库中的java代码 excel导入到数据库中的java代码 excel导入到数据库中的java代码 excel导入到数据库中的java代码 excel导入到数据库中的java代码

    Java实现把excel表中的数据导入到mysql数据库已有的表中

    - 批量导入数据可以显著提高性能,减少网络往返和事务开销。 - 使用`Statement.addBatch()`和`Statement.executeBatch()`方法进行批量操作。 - 对于大量数据,考虑使用`LOAD DATA INFILE`命令直接从文件导入,但...

    Java实现Excel导入导出功能

    综上所述,Java实现Excel导入导出功能主要依赖于Apache POI库,通过其提供的API可以方便地读取和写入Excel数据,同时注意性能优化和异常处理,确保功能的稳定性和效率。在实际开发中,还需要结合具体业务需求进行...

Global site tag (gtag.js) - Google Analytics