将结果集导出为Excel文件

5

有一个用于将结果集写入CSV文件的CSVWriter类。

是否有类似的类可以将结果集输出到EXCEL文件中?

编辑:我的结果集数据将是动态的,所以我只想将结果集数据转储到Excel文件中。

编辑2:请参考http://www.codereye.com/2009/09/converting-resultset-to-excel-table-in.html。它将数据导出到Excel工作表,但我需要传递每个列的数据类型。我想消除这种依赖关系,使得无论结果集中的内容如何,都能够将其盲目导出到Excel工作表中。


如果您想在Excel中打开CSV数据,只需将文件保存为“.xls”扩展名即可。然后它就可以在Excel中打开了。但是,如果您要查看真正的工作簿,我认为这不是正确的方法。 - itsols
我想将结果集输出到Excel文件中。 - happy
@MohamedEnnahdiElIdrissi 哇,这是一个很棒的项目。是否有生成PDF的方法? - Stanley Mungai
不,XLSGenerator中的PDF超出范围。 - Mohamed Ennahdi El Idrissi
2
@ErrorNotFoundException,我将在今天晚些时候发布XLSEngine 1.4版本,其中包括转换为PDF的功能。 - Mohamed Ennahdi El Idrissi
3个回答

2

我最近使用了OpenCSV,它对我非常有用。下面是一个示例,展示如何将ResultSet写入CSV文件:

java.sql.ResultSet myResultSet = ...

writer.writeAll(myResultSet, includeHeaders);

OpenCSV有CSVWriter类,用于写入CSV文件。我想将其写入Excel文件,以便可以对其加密。 - happy
抱歉,我误解了你的问题。正如Stauz所说,Apache POI可能是唯一的解决方案。 - Maxx

2

我无法使用链接中的示例,因此我根据OpenCSV中的方法制作了自己的方法来解析SQL表。

public class ResultSetToExcel {

public static final int CLOBBUFFERSIZE = 2048;

public void toXLS(ResultSet rs, WritableSheet sheet) throws SQLException, IOException, RowsExceededException, WriteException{

    List<String> header = getColumnNames(rs);

    Integer i=0;

    for(String headCell : header){
        sheet.addCell(new Label(i,0,headCell));
        i++;
    }

    int index = 1;

    while(rs.next()){

        List<String> rowValues = getColumnValues(rs);

        int j=0;

        for(String value: rowValues){
            sheet.addCell(new Label(j,index,value));
            j++;
        }

        index++;
    }
}

public List<String> getColumnNames(ResultSet rs) throws SQLException {
    List<String> names = new ArrayList<String>();
    ResultSetMetaData metadata = rs.getMetaData();

    for (int i = 0; i < metadata.getColumnCount(); i++) {
        names.add(metadata.getColumnName(i+1));
    }

    return names;
}

public List<String> getColumnValues(ResultSet rs) throws SQLException, IOException{

    List<String> values = new ArrayList<String>();
    ResultSetMetaData metadata = rs.getMetaData();

    for (int i = 0; i < metadata.getColumnCount(); i++) {
        values.add(getColumnValue(rs, metadata.getColumnType(i + 1), i + 1));
    }

    return values;
}

private String handleObject(Object obj){
    return obj == null ? "" : String.valueOf(obj);
}

private String handleBigDecimal(BigDecimal decimal) {
    return decimal == null ? "" : decimal.toString();
}

private String handleLong(ResultSet rs, int columnIndex) throws SQLException {
    long lv = rs.getLong(columnIndex);
    return rs.wasNull() ? "" : Long.toString(lv);
}

private String handleInteger(ResultSet rs, int columnIndex) throws SQLException {
    int i = rs.getInt(columnIndex);
    return rs.wasNull() ? "" : Integer.toString(i);
}

private String handleDate(ResultSet rs, int columnIndex) throws SQLException {
    try {

        if(rs.getString(columnIndex) != null){
            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
            Date fecha = new Date( formatter.parse(rs.getString(columnIndex)).getTime());
            return formatter.format(fecha);
        }
        else
            return "";
    } catch (ParseException e) {
        throw new SQLException("Fecha erronea o faltante");
    }
}

private String handleTime(Time time) {
    return time == null ? null : time.toString();
}

private String handleTimestamp(Timestamp timestamp) {
    SimpleDateFormat timeFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss");
    return timestamp == null ? null : timeFormat.format(timestamp);
}

private String getColumnValue(ResultSet rs, int colType, int colIndex)
        throws SQLException, IOException {

    String value = "";

    switch (colType){

        case Types.BIT:
        case Types.JAVA_OBJECT:
            value = handleObject(rs.getObject(colIndex));
            break;
        case Types.BOOLEAN:
            boolean b = rs.getBoolean(colIndex);
            value = Boolean.valueOf(b).toString();
            break;
        case Types.NCLOB: // todo : use rs.getNClob
        case Types.CLOB:
            Clob c = rs.getClob(colIndex);
            if (c != null) {
                value = read(c);
            }
            break;
        case Types.BIGINT:
            value = handleLong(rs, colIndex);
            break;
        case Types.DECIMAL:
        case Types.DOUBLE:
        case Types.FLOAT:
        case Types.REAL:
        case Types.NUMERIC:
            value = handleBigDecimal(rs.getBigDecimal(colIndex));
            break;
        case Types.INTEGER:
        case Types.TINYINT:
        case Types.SMALLINT:
            value = handleInteger(rs, colIndex);
            break;
        case Types.DATE:
            value = handleDate(rs, colIndex);
            break;
        case Types.TIME:
            value = handleTime(rs.getTime(colIndex));
            break;
        case Types.TIMESTAMP:
            value = handleTimestamp(rs.getTimestamp(colIndex));
            break;
        case Types.NVARCHAR: // todo : use rs.getNString
        case Types.NCHAR: // todo : use rs.getNString
        case Types.LONGNVARCHAR: // todo : use rs.getNString
        case Types.LONGVARCHAR:
        case Types.VARCHAR:
        case Types.CHAR:
            value = rs.getString(colIndex);
            break;
        default:
            value = "";
    }


    if (value == null){
        value = "";
    }

    return value;

}

private static String read(Clob c) throws SQLException, IOException
{
    StringBuilder sb = new StringBuilder( (int) c.length());
    Reader r = c.getCharacterStream();
    char[] cbuf = new char[CLOBBUFFERSIZE];
    int n;
    while ((n = r.read(cbuf, 0, cbuf.length)) != -1) {
            sb.append(cbuf, 0, n);
    }
    return sb.toString();
}

}


好的。你使用了哪些依赖项?Apache POI吗? - eventhorizon

1

您可以使用Apache POI Jars从结果中获取数据并写入Excel文件。


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