如何在安卓手机上创建一个 .csv 文件

23
我的目标是从一张表格创建一个 .csv 文件,以便打印报告。然后我可以将这个 .csv 文件存储到我的 sdCard 中。我查看了一些类似的问题,但它们都要求存在一个 jar 文件。除了集成 jar 文件外,还有其他方法吗?
我已经集成了 au.com.bytecode.opencsv.CSVWriter 组件中的一个 jar 文件...但我找不到写入新行的逻辑...能帮忙吗?

使用java.io类 - 特别是BufferedWriter / BufferedReader。 - KV Prajapati
AVD,那不是一项繁琐的工作吗? - Kunal Shah
Paresh,其中之一是此链接https://dev59.com/KWHVa4cB1Zd3GeqPkCpw。 - Kunal Shah
谢谢Paresh,我指的是你刚发的那个库... - Kunal Shah
Paresh,我觉得我现在有这个jar文件了.....正在寻找实现它的方法... - Kunal Shah
显示剩余4条评论
3个回答

25

在互联网上搜索了很多之后,我找到了一种在Android应用程序内部存储中创建Csv文件的解决方案(不需要SD卡),所以我决定与其他人分享如何在Android中创建Csv文件以及如何将其附加到电子邮件中。

首先,下载Opencsv.jar库并将其添加到您的Android项目中。 https://sourceforge.net/projects/opencsv/files/opencsv/

直接添加实现(不需要下载.jar文件)

implementation 'com.opencsv:opencsv:4.6' // Here is opencsv library 

或者在Android项目中添加jar文件:

  1. 将Android Studio文件结构从“Android”更改为“Project”(在项目名称“Android”下方左侧,更改为“Project”)
  2. 复制opencsv.jar文件并粘贴到libs文件夹中。
  3. 右键单击opencsv.jar文件,然后点击Add as library

向Menifest.xml添加权限(如果设备API是23或更高版本,请检查运行时权限)

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

打开build.gradle(模块:app)文件并检查添加了以下内容:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:26.+'
    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.android.support:recyclerview-v7:26.+'
    testCompile 'junit:junit:4.12'
    implementation files('libs/opencsv-4.1.jar') // Here is opencsv library added to project when using .jar
}

现在进入编码部分:创建 csv 文件并将数据插入其中。

 String csv = (Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyCsvFile.csv"); // Here csv file name is MyCsvFile.csv


 //by Hiting button csv will create inside phone storage.
 buttonAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            CSVWriter writer = null;
                try {
                    writer = new CSVWriter(new FileWriter(csv));

                    List<String[]> data = new ArrayList<String[]>();
                    data.add(new String[]{"Country", "Capital"});
                    data.add(new String[]{"India", "New Delhi"});
                    data.add(new String[]{"United States", "Washington D.C"});
                    data.add(new String[]{"Germany", "Berlin"});

                    writer.writeAll(data); // data is adding to csv 

                    writer.close();
                    callRead();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

如果您想在 Android 手机上查看您的 csv 文件,请按照以下步骤:

  1. 前往手机的文件管理器/我的文件。
  2. 进入内部存储/本地目录,只需滚动即可找到您的 csv 文件。
  3. 如果您的设备无法打开 csv 文件,请从 Play 商店安装Csv Viewer应用程序。

现在,如果您想将此 csv 文件与邮件附件一起发送,请使用以下代码:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent emailIntent = new Intent(Intent.ACTION_SEND);
                emailIntent.setType("text/plain");
                emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"email@example.com"});
                emailIntent.putExtra(Intent.EXTRA_SUBJECT, "subject here");
                emailIntent.putExtra(Intent.EXTRA_TEXT, "body text");

                File file = new File(csv);
                Uri uri = Uri.fromFile(file);
                emailIntent.putExtra(Intent.EXTRA_STREAM, uri);
                startActivity(Intent.createChooser(emailIntent, "Pick an Email provider"));
            }
        });

不要忘记从Android手机设置中打开应用程序的权限>>应用程序>>您的应用程序名称>>(标题=应用程序设置)权限>>打开存储>>完成!文件可以保存-三星Note 8在我身上工作,注释掉代码行“callRead();”我不知道为什么.. - Bay
它对我来说完美运行。我只是删除了“.getAbsolutePath()”,其余的都正常工作;)谢谢。 - tenTen
欢迎,愉快的编码 @tenTen - Abhishek kumar
1
太棒了的解释... 像魔法一样奏效。 - Smack Alpha

15

请查看以下代码以生成CSV文件。无需使用jar文件。

您需要将一个CSV文件保存到SD卡中。

样例CSV文件

public void exportEmailInCSV() throws IOException {
        {

            File folder = new File(Environment.getExternalStorageDirectory()
                    + "/Folder");

            boolean var = false;
            if (!folder.exists())
                var = folder.mkdir();

            System.out.println("" + var);


            final String filename = folder.toString() + "/" + "Test.csv";

            // show waiting screen
            CharSequence contentTitle = getString(R.string.app_name);
            final ProgressDialog progDailog = ProgressDialog.show(
                    MailConfiguration.this, contentTitle, "even geduld aub...",
                    true);//please wait
            final Handler handler = new Handler() {
                @Override
                public void handleMessage(Message msg) {




                }
            };

            new Thread() {
                public void run() {
                    try {

                        FileWriter fw = new FileWriter(filename);

                        Cursor cursor = db.selectAll();

                        fw.append("No");
                        fw.append(',');

                        fw.append("code");
                        fw.append(',');

                        fw.append("nr");
                        fw.append(',');

                        fw.append("Orde");
                        fw.append(',');

                        fw.append("Da");
                        fw.append(',');

                        fw.append("Date");
                        fw.append(',');

                        fw.append("Leverancier");
                        fw.append(',');

                        fw.append("Baaln");
                        fw.append(',');

                        fw.append("asd");
                        fw.append(',');

                        fw.append("Kwaliteit");
                        fw.append(',');

                        fw.append("asd");
                        fw.append(',');

                        fw.append('\n');

                        if (cursor.moveToFirst()) {
                            do {
                                fw.append(cursor.getString(0));
                                fw.append(',');

                                fw.append(cursor.getString(1));
                                fw.append(',');

                                fw.append(cursor.getString(2));
                                fw.append(',');

                                fw.append(cursor.getString(3));
                                fw.append(',');

                                fw.append(cursor.getString(4));
                                fw.append(',');

                                fw.append(cursor.getString(5));
                                fw.append(',');

                                fw.append(cursor.getString(6));
                                fw.append(',');

                                fw.append(cursor.getString(7));
                                fw.append(',');

                                fw.append(cursor.getString(8));
                                fw.append(',');

                                fw.append(cursor.getString(9));
                                fw.append(',');

                                fw.append(cursor.getString(10));
                                fw.append(',');

                                fw.append('\n');

                            } while (cursor.moveToNext());
                        }
                        if (cursor != null && !cursor.isClosed()) {
                            cursor.close();
                        }

                        // fw.flush();
                        fw.close();

                    } catch (Exception e) {
                    }
                    handler.sendEmptyMessage(0);
                    progDailog.dismiss();
                }
            }.start();

        }

    }

将此权限添加到清单中

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

当字符串包含空格时,它无法正常工作。 - PankajAndroid
不使用jar包就是重复造轮子... - Zhar

3
这将会成功 :)
    try {
    String TestString="";

    FileOutputStream fOut = openFileOutput(filename, MODE_WORLD_READABLE);

    OutputStreamWriter osw = new OutputStreamWriter(fOut); 

       // Write the string to the file
     for( i=1; i<total_row; i++)
        {

            for( j=1; j<total_col; j++)
            {
                TestString+=table[i][j].getText().toString();        // to pass in every widget a context of activity (necessary) 
                TestString += " ,";
            }
             TestString+="\n";
        }
     Log.v("the string is",TestString);
     osw.write(TestString);
     osw.flush();
     osw.close();
    }
    catch (IOException ioe) 
      {ioe.printStackTrace();}

在清单文件中,您需要编写以下内容:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

应用程序标签之前


Khurram,抱歉伙计...我是个新手......我不理解你的评论..//在每个小部件中传递活动上下文(必要的) TestString + =“,”;这里没有小部件吗??? - Kunal Shah
嘿,table[][]是一个Edit text的二维数组。这行代码从该二维数组的每个单元格获取数据,并将其以字符串形式存储 :) - Khurram W. Malik
在每个字符串后面追加逗号,就像 CSV 文件一样。 - Khurram W. Malik
谢谢你的时间,Khurram,但我已经采取了不同的方法。 - Kunal Shah
你可能不知道,但是在CSV字段中的逗号必须进行转义。如果其中一个值包含逗号,它会破坏下一个读取CSV的人的数据。 - dubmojo

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