首页 > 解决方案 > 通过 Java 中的 Android 应用程序以编程方式移动到 .csv 文件中的单元格内的新行

问题描述

我正在从我的 Android 应用程序创建一个 .csv 文件并以 .csv 格式存储数据。但是,当特定单元格的值的长度超过一定数量的字符时,它会离开该单元格并移动到朝向第一列的全新行。如何在同一个单元格中显示?

这是我用来从我的 android 应用程序中以 .csv 格式创建和保存数据的代码。


public class ReportListingActivity extends AppCompatActivity {


    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK)
            return;

        switch (requestCode) {
            case CREATE_FILE:
                if (data != null) {
                    Uri uri = data.getData();
                    if (uri != null) {
                        new ExportCSV(this).execute(uri);
                    }
                }
                break;
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_report_listing);



    private void createFile() {
        Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("text/csv");
        intent.putExtra(Intent.EXTRA_TITLE, "stored_data.csv");


        startActivityForResult(intent, CREATE_FILE);
    }

    private class ExportCSV extends AsyncTask<Uri, Void, Boolean> {
        private final WeakReference<Context> context;

        ExportCSV(Context c) {
            context = new WeakReference<>(c);
        }

        @Override
        protected Boolean doInBackground(Uri... uris) {
            Uri uri = uris[0];
            Context c = context.get();


            if( c == null ) {
                return false;
            }

//updated code
StringBuilder data = new StringBuilder();
data.append("Flight Number, Departure Date, Comments");

String first_comment = "hello this is an example of the comments that I am talking about in this case. If I keep typing it will move to the next row which i do not want at all. lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum";

String second_comment = "It is long and it moves" + "\n" + "to the first column and subsequent rows";

pre_comments1 = "1) " + first_comment  + "\n";
pre_comments2 = "2) " + second_comment + "\n";

pre_comments_consolidated = pre_comments1 + pre_comments2;

data.append("\n" + flightNumber + "," + departureDate + ","+ pre_comments_consolidated);

//until here
            try {
                OutputStream os = c.getContentResolver().openOutputStream(uri);
                if(os!=null) {
                    os.write(data.toString().getBytes());
   
                    os.close();
                }
            }
            catch(Exception e) {
                e.printStackTrace();
            }
            return true;
        }
    }

}

下面是我在 Excel 中打开 csv 文件时得到的输出截图

当文本太长或有换行符 (\n) 时,来自 Column3 的文本将移动到 Column1 和后续行。如何修复它并在同一个单元格(即 Column3)中显示它?

excel输出

第二张图片显示了当我在变量上使用双引号将数据附加到我的 csv 文件时的新输出。

当我在变量上使用双引号将数据附加到我的 csv 文件时的新输出

标签: androidandroid-intentandroid-fileandroid-external-storageandroid-storage

解决方案


您需要了解两者之间的区别

"\n" + "\"" +  flightnumber  + "\""

"\n" + "\"" + "flightnumber" + "\""
"\n" + "\"flightnumber\""
"\n\"flightnumber\""

为了更好的可读性,并且由于StringBuilder已经用于连接字符串,这里的所有内容都在单独的行中:

data.append("Flight Number");
data.append(',');
data.append("Departure Date");
data.append(',');
data.append("Comments");
data.append('\n');
// ...
data.append(flightNumber);
data.append(',');
data.append(departureDate);
data.append(',');
data.append('"' + pre_comments_consolidated + '"');

笔记:

  • 将单个字符放在单引号中 : '\n', 'a', 'b','c'
  • 您不必在单引号内转义双引号,反之亦然:"'",'"'
  • 您可以连接字符和字符串:"example" + '\n'
  • 您正在将文字双引号与variable pre_comments_consolidated连接起来。

如果 CSV值包含引号,这将无法正常工作。您需要对它们进行CSV 转义。您应该考虑将所有这些逻辑放在一个单独的函数中。

private String escapeCsv(String in) {
    // Double double quotes that are already part of the value.
    String out = in.replace("\"", "\"\"");
    // Wrap the whole thing in double quotes.
    return '"' + out '"'
}

像这样使用:

data.append(escapeCsv(pre_comments_consolidated));

注意

  • 您需要哪些引号来表示 Java 字符串,
  • 您需要逐字打印哪些报价,
  • 哪些引号需要转义(在 Java 中或在一行下面的格式中,如 CSV)。

推荐阅读