Android - 从表值生成CSV文件

时间:2011-01-08 05:20:45

标签: java android

我有一个包含一个表的数据库,我想生成包含此表值的CSV文件。

实际上,我想将此CSV文件作为附件发送电子邮件。我知道将文件作为附件发送到电子邮件intent(ACTION_SEND),但我不知道创建的过程或我可以创建CSV格式文件的方法。

请给我建议或想法。

5 个答案:

答案 0 :(得分:32)

您可以将opencsv用于此

从这里下载图书馆:

http://sourceforge.net/projects/opencsv/

在这里你可以找到jar文件。

在您的活动中使用此:

CSVWriter writer = null;
try 
{
    writer = new CSVWriter(new FileWriter("/sdcard/myfile.csv"), ',');
    String[] entries = "first#second#third".split("#"); // array of your values
    writer.writeNext(entries);  
    writer.close();
} 
catch (IOException e)
{
    //error
}

答案 1 :(得分:12)

这可能会有所帮助。我需要';'作为feild值之间的分隔符。请相应地使用','生成CSV。

谢谢, 达显

private void exportTheDB() throws IOException
{
        File myFile;  
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
    String TimeStampDB = sdf.format(cal.getTime()); 

    try {

        myFile = new File(extStorageDirectory+"/Export_"+TimeStampDB+".csv");
        myFile.createNewFile();
        FileOutputStream fOut = new FileOutputStream(myFile);
        OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
        myOutWriter.append("Start time;End time;Elapse;Sports type");
        myOutWriter.append("\n");
        sampleDB = this.openOrCreateDatabase(DB_NAME,MODE_PRIVATE, null);

        Cursor c = sampleDB.rawQuery("SELECT * FROM  Sport_Records ", null);

        if (c != null) {
            if (c.moveToFirst()) {
                do {


                    String start_Time = c.getString(c.getColumnIndex("startTimeDate"));
                    String end_Time = c.getString(c.getColumnIndex("endTimeDate"));
                    String elapse_Time = calculateTimeDifferece(end_Time, start_Time);
                    String sport_Name = c.getString(c.getColumnIndex("label"));

                    myOutWriter.append(start_Time+";"+end_Time+";"+elapse_Time+";"+sport_Name);
                    myOutWriter.append("\n");
                }

                while (c.moveToNext());
            }

            c.close();
            myOutWriter.close();
            fOut.close();

        }
    } catch (SQLiteException se) 
    {
        Log.e(getClass().getSimpleName(),"Could not create or Open the database");
    }

    finally {

        sampleDB.close();

    }






}

答案 2 :(得分:3)

这看起来很有希望。它将占用任何Java对象并将其转换为CSV文件:

http://supercsv.sourceforge.net/

也可以用CSV格式从数据库中检索数据。

答案 3 :(得分:1)

添加到@ Cocos2dx回答:

从db查询时,您可能有空字段,在我的情况下,我使用Controller来获取对象列表中的数据,但是如果您不应该检查空值或空值并正确格式化它们(或者他们可以使你的表看起来很奇怪):

String[] details = { 
        replaceNull(someObject.getId()),
        replaceNull(someObject.getName())
};


public static String replaceNull(String input) {
    return ((input == null || input.isEmpty()) ? " " : input);
}

writer.writeNext(details);

答案 4 :(得分:0)

如果使用Kotlin,我建议使用kotlin-csv库。

仅获取数据库表对象的列表,遍历所有对象,然后将列值一个接一个地添加到CSV行中,就像这样:

csvWriter().open(csvFile) {
    // Header
    writeRow(listOf("[id]", "[name]", "[age]"))

    peopleList.forEachIndexed { index, person ->
        writeRow(listOf(index, person.fullName, person.age))
    }
}

我解释了创建csv文件here的整个过程。