安卓 - 从表格值生成CSV文件

10

我有一个包含一个表格的数据库,想要生成CSV文件并将表格中的值导入其中。

实际上,我希望将这个CSV文件作为附件发送邮件。我知道通过intent(ACTION_SEND)在邮件中以附件形式发送文件,但我不知道如何创建CSV格式的文件或者可以使用哪种方法创建。

请给我一些建议或想法。

5个回答

33
你可以使用opencsv实现此功能。
从这里下载库: http://sourceforge.net/projects/opencsv/ 在其中可以找到jar文件。
在你的activity中使用这个:
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
}

我已经访问了您提供的链接,但我不知道如何将其包含在我的Android应用程序中。请告诉我,谢谢您的快速回复。 - Paresh Mayani
我想你的意思是我应该包含这个CSVWriter类,然后我应该使用这个CSVWriter类,是这样吗? - Paresh Mayani
谢谢Vikas,我已经实现了并得到了与您提到的相同的解决方案。顺便说一句,感谢您及时的支持。 - Paresh Mayani
@VikasPatidar 我怎样才能持续保存数据呢?我的数据是不断生成的,而且显然在我不调用 close() 的情况下它不会被保存。 - Tina J
当我添加com.opencsv:opencsv:4.0时,CSVWriter的commons-logging依赖项出现Gradle警告。 - LordParsley
我无法使我的应用程序成功地使用Proguard与OpenCSV。 - Carson Holzheimer

14

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

谢谢, Darshan

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();

    }






}

3
这看起来非常有前途。它可以将任何Java对象转换为CSV文件:http://supercsv.sourceforge.net/。也可能从数据库中以CSV格式检索数据。

1
补充 @Cocos2dx 的回答:
当从数据库查询时,你可能会遇到空字段,在我的情况下,我使用控制器将数据提取到对象列表中,但是如果你不这样做,你应该检查 null 或空值,并正确格式化它们(否则它们可能会使你的表格看起来很奇怪):
String[] details = { 
        replaceNull(someObject.getId()),
        replaceNull(someObject.getName())
};


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

writer.writeNext(details);

0
如果使用Kotlin,我推荐使用kotlin-csv库。
只需获取DB表对象列表,遍历它们并将列值逐个添加到CSV行中,就像这样:
csvWriter().open(csvFile) {
    // Header
    writeRow(listOf("[id]", "[name]", "[age]"))

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

我在这里解释了创建CSV文件的整个过程。


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