java实现以下功能:扫描指定路径下的excel文件,若无则进行提示,若存在excel文件则循环读取所有的文件,利用实体类@Excel注解的方式读取excel的数据,将读取到的数据插入oracle数据库指定的表中

时间: 2023-12-06 09:44:12 浏览: 225
首先需要引入poi、poi-ooxml、commons-collections4、commons-lang3、commons-beanutils、oracle-jdbc驱动等相关依赖。 然后,可以编写一个ExcelUtil工具类,用于读取Excel文件并转换成对象列表: ```java import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.DateUtil; 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文件并转换成对象列表 * * @param file Excel文件 * @param clazz 对象类型 * @return 对象列表 */ public static <T> List<T> readExcel(File file, Class<T> clazz) throws IOException { List<T> list = new ArrayList<>(); try (InputStream is = new FileInputStream(file); Workbook workbook = new XSSFWorkbook(is)) { Sheet sheet = workbook.getSheetAt(0); if (sheet == null) { return list; } // 获取表头行 Row headerRow = sheet.getRow(0); if (headerRow == null) { return list; } // 获取表头字段名 List<String> headerFieldNames = new ArrayList<>(); for (int i = 0; i < headerRow.getLastCellNum(); i++) { Cell cell = headerRow.getCell(i); if (cell == null || cell.getCellType() == CellType.BLANK) { headerFieldNames.add(null); } else { headerFieldNames.add(cell.getStringCellValue().trim()); } } // 获取字段映射关系 List<FieldMapping> fieldMappings = getFieldMappings(clazz, headerFieldNames); // 遍历每一行数据 for (int i = 1; i <= sheet.getLastRowNum(); i++) { Row row = sheet.getRow(i); if (row == null) { continue; } T obj = clazz.newInstance(); // 遍历每一个单元格数据 for (FieldMapping fieldMapping : fieldMappings) { Cell cell = row.getCell(fieldMapping.getIndex()); if (cell == null || cell.getCellType() == CellType.BLANK) { continue; } setFieldValue(obj, fieldMapping.getField(), cell); } list.add(obj); } } catch (Exception e) { throw new RuntimeException("Read Excel error", e); } return list; } /** * 获取字段映射关系 * * @param clazz 对象类型 * @param headerFieldNames 表头字段名列表 * @return 字段映射关系列表 */ private static List<FieldMapping> getFieldMappings(Class<?> clazz, List<String> headerFieldNames) { List<FieldMapping> fieldMappings = new ArrayList<>(); for (Field field : clazz.getDeclaredFields()) { Excel excel = field.getAnnotation(Excel.class); if (excel == null) { continue; } String fieldName = StringUtils.isBlank(excel.fieldName()) ? field.getName() : excel.fieldName(); int index = headerFieldNames.indexOf(fieldName); if (index < 0) { throw new RuntimeException("Excel header does not contain field: " + fieldName); } fieldMappings.add(new FieldMapping(field, index)); } return fieldMappings; } /** * 设置对象字段值 */ private static void setFieldValue(Object obj, Field field, Cell cell) throws Exception { String cellValue = getCellValue(cell); Class<?> fieldType = field.getType(); if (StringUtils.isBlank(cellValue)) { BeanUtils.setProperty(obj, field.getName(), null); return; } if (fieldType == String.class) { BeanUtils.setProperty(obj, field.getName(), cellValue); } else if (fieldType == Integer.TYPE || fieldType == Integer.class) { BeanUtils.setProperty(obj, field.getName(), Integer.parseInt(cellValue)); } else if (fieldType == Long.TYPE || fieldType == Long.class) { BeanUtils.setProperty(obj, field.getName(), Long.parseLong(cellValue)); } else if (fieldType == Float.TYPE || fieldType == Float.class) { BeanUtils.setProperty(obj, field.getName(), Float.parseFloat(cellValue)); } else if (fieldType == Double.TYPE || fieldType == Double.class) { BeanUtils.setProperty(obj, field.getName(), Double.parseDouble(cellValue)); } else if (fieldType == Date.class) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); BeanUtils.setProperty(obj, field.getName(), sdf.parse(cellValue)); } else { throw new RuntimeException("Unsupported field type: " + fieldType.getName()); } } /** * 获取单元格值 */ private static String getCellValue(Cell cell) { if (cell == null) { return null; } DecimalFormat df = new DecimalFormat("#"); switch (cell.getCellType()) { case STRING: return cell.getStringCellValue().trim(); case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return sdf.format(date); } else { return df.format(cell.getNumericCellValue()); } case BOOLEAN: return String.valueOf(cell.getBooleanCellValue()); case FORMULA: return getCellValue(cell.getCachedFormulaResultType() == CellType.NUMERIC ? cell : cell.getSheet().getRow(cell.getRowIndex() + 1).getCell(cell.getColumnIndex())); default: return null; } } /** * 字段映射关系 */ private static class FieldMapping { private Field field; private int index; public FieldMapping(Field field, int index) { this.field = field; this.index = index; } public Field getField() { return field; } public int getIndex() { return index; } } } ``` 接着,可以定义一个Excel注解用于标记实体类的属性,以及一个扫描指定路径下Excel文件并插入数据库的方法: ```java import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.List; public class ExcelDemo { @Excel(fieldName = "姓名") private String name; @Excel(fieldName = "年龄") private int age; @Excel(fieldName = "性别") private String gender; @Excel(fieldName = "职业") private String occupation; public static void main(String[] args) throws IOException { String excelDir = "path/to/excel/dir"; String jdbcUrl = "jdbc:oracle:thin:@localhost:1521:orcl"; String username = "username"; String password = "password"; File dir = new File(excelDir); if (!dir.exists() || !dir.isDirectory()) { System.out.println("Excel directory does not exist"); return; } File[] files = dir.listFiles((dir1, name) -> name.toLowerCase().endsWith(".xlsx")); if (files == null || files.length == 0) { System.out.println("No Excel file found in directory"); return; } try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password)) { for (File file : files) { List<ExcelDemo> dataList = ExcelUtil.readExcel(file, ExcelDemo.class); if (CollectionUtils.isEmpty(dataList)) { continue; } String sql = "INSERT INTO T_EXCEL_DEMO (NAME, AGE, GENDER, OCCUPATION) VALUES (?, ?, ?, ?)"; try (PreparedStatement pstmt = conn.prepareStatement(sql)) { for (ExcelDemo data : dataList) { pstmt.setString(1, data.name); pstmt.setInt(2, data.age); pstmt.setString(3, data.gender); pstmt.setString(4, data.occupation); pstmt.executeUpdate(); } } } } catch (Exception e) { throw new RuntimeException("Insert data error", e); } } } ``` 其中,@Excel注解可以用于标记实体类的属性,指定其对应的Excel表头字段名: ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Excel { String fieldName(); } ```
阅读全文

相关推荐

最新推荐

recommend-type

java读取excel文件并复制(copy)文件到指定目录示例

List&lt;String&gt; files = deploy.getDatasInSheet(0, new File("C:/temp/excel")); deploy.copy("C:/temp/source", "C:/temp/destination", files); } catch (Exception e) { e.printStackTrace(); } }}
recommend-type

基于C++实现读取指定路径文件

以下是一个简单的示例代码,展示了如何读取指定路径(例如"e:/picture")下的所有非目录文件: ```cpp #include #include using namespace std; using namespace boost::filesystem; int main() { // 指定图片...
recommend-type

Java实现从jar包中读取指定文件的方法

本篇文章将详细讲解如何在Java中实现从JAR包中读取指定文件的方法。 首先,Java提供了`java.util.jar`包,其中包含处理JAR文件所需的类。`JarFile`类是核心类,它允许我们打开并操作JAR文件。在给定的代码示例中,`...
recommend-type

Java 读取指定路径的文本文件并返回String的方法

在Java编程中,读取指定路径的文本文件并将其内容转换为String对象是常见的操作,这对于处理配置文件、日志文件或任何其他基于文本的数据至关重要。以下是一个详细讲解这个过程的方法: 首先,我们需要导入必要的...
recommend-type

纯JS实现的读取excel文件内容功能示例【支持所有浏览器】

总结起来,纯JavaScript实现的读取Excel文件内容功能主要依赖于`XLSX`库,它通过`FileReader API`读取用户上传的文件,并将Excel数据转换为JavaScript可操作的格式。这个功能对于前端开发人员来说非常实用,特别是...
recommend-type

Spring Websocket快速实现与SSMTest实战应用

标题“websocket包”指代的是一个在计算机网络技术中应用广泛的组件或技术包。WebSocket是一种网络通信协议,它提供了浏览器与服务器之间进行全双工通信的能力。具体而言,WebSocket允许服务器主动向客户端推送信息,是实现即时通讯功能的绝佳选择。 描述中提到的“springwebsocket实现代码”,表明该包中的核心内容是基于Spring框架对WebSocket协议的实现。Spring是Java平台上一个非常流行的开源应用框架,提供了全面的编程和配置模型。在Spring中实现WebSocket功能,开发者通常会使用Spring提供的注解和配置类,简化WebSocket服务端的编程工作。使用Spring的WebSocket实现意味着开发者可以利用Spring提供的依赖注入、声明式事务管理、安全性控制等高级功能。此外,Spring WebSocket还支持与Spring MVC的集成,使得在Web应用中使用WebSocket变得更加灵活和方便。 直接在Eclipse上面引用,说明这个websocket包是易于集成的库或模块。Eclipse是一个流行的集成开发环境(IDE),支持Java、C++、PHP等多种编程语言和多种框架的开发。在Eclipse中引用一个库或模块通常意味着需要将相关的jar包、源代码或者配置文件添加到项目中,然后就可以在Eclipse项目中使用该技术了。具体操作可能包括在项目中添加依赖、配置web.xml文件、使用注解标注等方式。 标签为“websocket”,这表明这个文件或项目与WebSocket技术直接相关。标签是用于分类和快速检索的关键字,在给定的文件信息中,“websocket”是核心关键词,它表明该项目或文件的主要功能是与WebSocket通信协议相关的。 文件名称列表中的“SSMTest-master”暗示着这是一个版本控制仓库的名称,例如在GitHub等代码托管平台上。SSM是Spring、SpringMVC和MyBatis三个框架的缩写,它们通常一起使用以构建企业级的Java Web应用。这三个框架分别负责不同的功能:Spring提供核心功能;SpringMVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架;MyBatis是一个支持定制化SQL、存储过程以及高级映射的持久层框架。Master在这里表示这是项目的主分支。这表明websocket包可能是一个SSM项目中的模块,用于提供WebSocket通讯支持,允许开发者在一个集成了SSM框架的Java Web应用中使用WebSocket技术。 综上所述,这个websocket包可以提供给开发者一种简洁有效的方式,在遵循Spring框架原则的同时,实现WebSocket通信功能。开发者可以利用此包在Eclipse等IDE中快速开发出支持实时通信的Web应用,极大地提升开发效率和应用性能。
recommend-type

电力电子技术的智能化:数据中心的智能电源管理

# 摘要 本文探讨了智能电源管理在数据中心的重要性,从电力电子技术基础到智能化电源管理系统的实施,再到技术的实践案例分析和未来展望。首先,文章介绍了电力电子技术及数据中心供电架构,并分析了其在能效提升中的应用。随后,深入讨论了智能化电源管理系统的组成、功能、监控技术以及能
recommend-type

通过spark sql读取关系型数据库mysql中的数据

Spark SQL是Apache Spark的一个模块,它允许用户在Scala、Python或SQL上下文中查询结构化数据。如果你想从MySQL关系型数据库中读取数据并处理,你可以按照以下步骤操作: 1. 首先,你需要安装`PyMySQL`库(如果使用的是Python),它是Python与MySQL交互的一个Python驱动程序。在命令行输入 `pip install PyMySQL` 来安装。 2. 在Spark环境中,导入`pyspark.sql`库,并创建一个`SparkSession`,这是Spark SQL的入口点。 ```python from pyspark.sql imp
recommend-type

新版微软inspect工具下载:32位与64位版本

根据给定文件信息,我们可以生成以下知识点: 首先,从标题和描述中,我们可以了解到新版微软inspect.exe与inspect32.exe是两个工具,它们分别对应32位和64位的系统架构。这些工具是微软官方提供的,可以用来下载获取。它们源自Windows 8的开发者工具箱,这是一个集合了多种工具以帮助开发者进行应用程序开发与调试的资源包。由于这两个工具被归类到开发者工具箱,我们可以推断,inspect.exe与inspect32.exe是用于应用程序性能检测、问题诊断和用户界面分析的工具。它们对于开发者而言非常实用,可以在开发和测试阶段对程序进行深入的分析。 接下来,从标签“inspect inspect32 spy++”中,我们可以得知inspect.exe与inspect32.exe很有可能是微软Spy++工具的更新版或者是有类似功能的工具。Spy++是Visual Studio集成开发环境(IDE)的一个组件,专门用于Windows应用程序。它允许开发者观察并调试与Windows图形用户界面(GUI)相关的各种细节,包括窗口、控件以及它们之间的消息传递。使用Spy++,开发者可以查看窗口的句柄和类信息、消息流以及子窗口结构。新版inspect工具可能继承了Spy++的所有功能,并可能增加了新功能或改进,以适应新的开发需求和技术。 最后,由于文件名称列表仅提供了“ed5fa992d2624d94ac0eb42ee46db327”,没有提供具体的文件名或扩展名,我们无法从这个文件名直接推断出具体的文件内容或功能。这串看似随机的字符可能代表了文件的哈希值或是文件存储路径的一部分,但这需要更多的上下文信息来确定。 综上所述,新版的inspect.exe与inspect32.exe是微软提供的开发者工具,与Spy++有类似功能,可以用于程序界面分析、问题诊断等。它们是专门为32位和64位系统架构设计的,方便开发者在开发过程中对应用程序进行深入的调试和优化。同时,使用这些工具可以提高开发效率,确保软件质量。由于这些工具来自Windows 8的开发者工具箱,它们可能在兼容性、效率和用户体验上都经过了优化,能够为Windows应用的开发和调试提供更加专业和便捷的解决方案。
recommend-type

如何运用电力电子技术实现IT设备的能耗监控

# 摘要 随着信息技术的快速发展,IT设备能耗监控已成为提升能效和减少环境影响的关键环节。本文首先概述了电力电子技术与IT设备能耗监控的重要性,随后深入探讨了电力电子技术的基础原理及其在能耗监控中的应用。文章详细分析了IT设备能耗监控的理论框架、实践操作以及创新技术的应用,并通过节能改造案例展示了监控系统构建和实施的成效。最后,本文展望了未来能耗监控技术的发展趋势,同时