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

Programmatically move to a new line within a cell in .csv file through an Android application in Java

我正在从我的 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?

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

你需要明白两者的区别

"\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'
  • 您正在加入 文字 双引号和 变量 pre_comments_consolidated.

如果 CSV 包含引号,这将无法正常工作。你需要 CSV-escape 他们。您应该考虑将所有这些逻辑放在一个单独的函数中。

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 等格式)。