使用java将数据从excel文件上传到数据库

时间:2012-02-05 08:54:44

标签: database excel file-upload

我需要使用java将Excel工作表中的数据上传到数据库。

数据库将是oracle。

excel表将由用户使用Web应用程序(Spring MVC前端)在一个月内上传一次。

excel表将有数千条记录/行,例如约15000或更多。

  1. 在数据库中上传这些庞大数据的最快方法是什么?我们是 使用简单的JDBC(Spring的JDBC模板)。
  2. 我们如何处理交易沙错误,因为在上传数据时可能会出现错误,在这种情况下,部分上传的数据将毫无用处?
  3. 我们需要能够通知用户错误,以便他可以 更正excel表并重试?
  4. 请帮助/

8 个答案:

答案 0 :(得分:1)

你使用的是哪个oracle版本?如果您只需要一个用于该用例的Web应用程序,也许APEX可以使它成为您的朋友。从Oracle 11g开始,它将与数据库一起预装,从9i开始,您可以自行安装。它带来了非常好的excel集成,因此即使是初学者也可以在几天内轻松创建应用程序。

答案 1 :(得分:1)

您可以使用Apache POI - the Java API for Microsoft Documents处理文件,然后使用纯JDBC将数据插入数据库。

它会相当快,您可以捕获所有异常以提醒用户有关错误。

答案 2 :(得分:0)

关于第一个问题,我认为最好的解决方案是将.csv格式的excel文件(逗号分隔值)转换为非常简单的解析。我不确定这可以提供帮助,但我发现了link

对于异常处理,请查看可能对您有帮助的@ExceptionHandler注释。

答案 3 :(得分:0)

写入磁盘并从oracle进行批量导入。解析错误并将其返回给用户。

答案 4 :(得分:0)

您可以使用免费的jExcelAPIApache POI,或者您可以为Aspose cells付费,如果您在公司工作,这并不贵。

其中每一项都非常有用。例如,您可以使用库查找错误,然后转换为CSV,最后使用JDBC插入数据库。

如果您的Excel工作表很大,请注意不要同时将所有内容加载到内存中,否则可能会耗尽堆空间。在整个过程中收集垃圾。

答案 5 :(得分:0)

数据表中每条记录的列数以及每个单元格中的数据有多大?在使用Apache POI转换为Java对象之后,您可以计算内存消耗以查看它是否适合您的堆。

然后,您可以尝试插入数据来启动数据库事务。如果出现任何错误,交易将被回滚,您可以在工作表中提交错误的数据供用户更正。

答案 6 :(得分:0)

您应该做的就是,

1)使用Apache POI将Microsoft Excel文档转换为XML。它让你办公室openXML格式。一旦你得到它。将其存储在文件系统中。 2)其次提供用户导入的链接 3)一旦他点击导入,你就开始一个石英工作。因为你正在使用弹簧 http://static.springsource.org/spring/docs/1.2.x/reference/scheduling.html

4)在你的工作类中开始你的XML提取,然后开始一个transcation(Hibernate)。每次

之后

在春季开始新交易。

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setName("ImportFileTransaction");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

TransactionStatus status = txManager.getTransaction(def);
每次提交后

txManager.commit(status);
status = txManager.getTransaction(def);

获取交易状态和cntinue插入

5)用于通知用户维护错误xml,以便在该xml中插入有错误的行。

享受!!!!

答案 7 :(得分:0)

我也做了同样的事情。 我做了以下步骤

  1. 已保存的文件@ server。
  2. 使用POI jar,因为它支持最大xls功能
  3. 根据表结构创建了一个java类
  4. 在setter方法中应用验证,该方法将在将数据设置为类型集合(类创建的集合)期间检查值,使用相关代码检索异常以跟踪处理异常和自定义消息(显示用户结束)
  5. 一旦验证了所有记录,然后点击数据库以验证第二级,例如获取任何给定名称的id。使用错误代码再次处理异常。
  6. 制作一个插入查询模板,将数据插入数据库,尝试使用预处理的Statement,因为它对SQL注入来说有点安全。
  7. 好的方法是使用hibernate或任何其他持久性服务,因为它安全和事务管理,或者JDBC使用批处理查询最终提交,如果一切正常,只需简单地回滚事务
  8. 如果记录非常大(15000不是那么大),那么将你的工作划分为不同的批次并通过线程控制它。