android - 通过 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)中显示它?
第二张图片显示了当我在变量上使用双引号将数据附加到我的 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'
- 您正在将文字双引号与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)。
推荐阅读
- javascript - 如何在 LokiJS 中删除集合
- java - Android:需要在 AR 中放置一个 3D 对象在周围空间中,无需表面检测
- html - 避免使用 html-xsl 解析抓取 html 部分
- javascript - 如何更改步骤颜色(Ant-design)
- php - 连接到不同服务器上的多个数据库
- spring - 在 Swagger UI/Spring boot 中支持多路径映射
- wpf - 如何使用数据触发器更改按钮的图标?wpf
- python - tkinter,使用按钮和延迟创建帧
- traefik - 如何从 Traefik 中的其他标头值创建标头
- python - Python 数据框到 JSON(多级)