如何使用Java将Excel数据插入数据库

3
我想在UNIX服务器上使用Java将Excel文件中的数据插入本地数据库,而不进行任何数据操作。
1- 有人告诉我,我必须将Excel文件扩展名转换为.csv以符合Unix。我使用宏为每个工作表(共12个)创建了CSV文件。问题是它将日期格式从DD-MM-YYYY更改为MM-DD-YYYY。如何避免这种情况?
2- 我使用LOAD DATA命令将数据从CSV文件插入我的数据库。 Excel文件中指定了一个可选的日期列。因此,在CSV中,它变成了“,,”,因此加载数据无法正常工作(需要参数)。如何解决这个问题?感谢您的帮助。

@daria - 很简单,你需要将每个表格单独保存为CSV格式.. 就这样,兄弟.. - Venkat
我复制了CSV文件中的每个工作表。虽然它起作用了,但日期格式已经改变了(例如,09/07/2010 变成了 07/09/2010)。如何解决这个问题? - daria
为什么不把日期值处理成字符串呢?试一试吧。 - Venkat
4个回答

2

使用Apache POI从Excel中读取值应该非常容易。这样,您就可以省略将数据转换为其他格式并可能在数据包含逗号并且您将其转换为CSV时出现问题的额外步骤。


1

将EXCEL文件保存为CSV(逗号分隔值)格式。这样做可以使其易于使用StringTokenizer进行读取和解析。

使用MySQL(或根据您的需求选择SQLite)和JDBC将数据加载到数据库中。

这是我开发的CSVEnumeration类:

package com.aepryus.util;

import java.util.*;

public class CSVEnumeration implements Enumeration {
    private List<String> tokens = new Vector<String>();
    private int index=0;

    public CSVEnumeration (String line) {
        for (int i=0;i<line.length();i++) {
            StringBuffer sb = new StringBuffer();
            if (line.charAt(i) != '"') {
                while (i <  line.length() && line.charAt(i) != ',') {
                    sb.append(line.charAt(i));
                    i++;
                }
                tokens.add(sb.toString());
            } else {
                i++;
                while(line.charAt(i) != '"') {
                    sb.append(line.charAt(i));
                    i++;
                }
                i++;
                tokens.add(sb.toString());
            }
        }
    }

// Enumeration =================================================================
    public boolean hasMoreElements () {
        return index < tokens.size();
    }
    public Object nextElement () {
        return tokens.get(index++);
    }
}

如果您使用split将CSV文件的行分解并逐一将它们馈送到CSVEnumeration类中,那么您就可以逐个遍历字段。或者,这里有一些我手头上闲置的代码,它使用StringTokenizer来解析行。csv是一个包含整个文件内容的字符串。
StringTokenizer lines = new StringTokenizer(csv,"\n\r");
lines.nextToken();
while (lines.hasMoreElements()) {
    String line = lines.nextToken();
    Enumeration e = new CSVEnumeration(line);
    for (int i=0;e.hasMoreElements();i++) {
        String token = (String)e.nextElement();
        switch (i) {
            case 0:/* do stuff */;break;
        }
    }
}

我已经阅读过StringTokenizer已经被弃用,更好的方法是使用Split。你真的认为使用StringTokenizer更容易吗? - daria
StringTokenizer并未被弃用,但现在优先使用.split()方法。我需要进行一些研究,但我猜它们的使用方式应该是相同的。无论如何,我会发布一些代码。 - aepryus
谢谢,抱歉但我还需要问你最后一件事:我的文件(csv)由超过788行组成,解析它需要相当长的时间,而且我需要定期更新数据库(每30分钟到1小时)。这真的适合我的情况吗? - daria
好的,请试一试,但788行并不算多。它应该能够立即解析它。 - aepryus

1

我建议使用MySQL,因为它具有良好的性能和开源特性。

这里有两种情况:

  1. 如果你只是想将Excel单元格值存储到数据库中,你可以将Excel转换为CSV格式,这样你就可以在MySQL命令中简单地使用LOAD DATA命令。

  2. 如果你需要在将值放入表格之前进行一些操作,我建议使用Apache POI。我已经使用过,效果非常好,无论你的Excel格式如何,你只需要使用正确的实现即可。


程序员:我只需要插入数据而不进行任何操作。我的问题是,我的 Excel 文件有很多工作表。当我将文件转换为 CSV 时,它只复制一个工作表。 - daria

0

我们在Java应用程序中使用SQLite。它是无服务器的,非常简单易用且高效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接