如何使用通用csv-lib编写csv文件



我正在使用公共csv从请求体中写入csv文件,并且我在同一行中使用双引号获得所有记录:

Client Name,Value
"client 1,1.0","client 2,2.0","client 3,53.78","client 4,3.0","client 5555555,4.0","client 6,33.0","client 7,0.0","client 8,8.5"

我需要的是:

Client Name, Value
"client 1", 1.0
"client 2", 2.0
"client 3", 53.78 (and so on)

这是代码(部分(:

@PostMapping(value = "/v1/csv")
public ResponseEntity<InputStreamResource> exportCSVV2(@RequestBody ClientDataObjectRequest clientDataObjectRequest){
String[] csvHeader = {"Client Name","Value"};
List<List<CompanyChartData>> csvBody = new ArrayList<>();
csvBody.add(clientDataObjectRequest.getCompanyChartData());
ByteArrayInputStream byteArrayOutputStream;
try(
ByteArrayOutputStream out = new ByteArrayOutputStream();
CSVPrinter csvPrinter = new CSVPrinter(
new PrintWriter(out),
CSVFormat.EXCEL.withHeader(csvHeader)
);
) {
for (List<CompanyChartData> record: csvBody) {
csvPrinter.printRecord(record);
}
csvPrinter.flush();
byteArrayOutputStream = new ByteArrayInputStream(out.toByteArray());
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
}
InputStreamResource fileInputStream = new InputStreamResource(byteArrayOutputStream);
String dateFile = new SimpleDateFormat("MM-dd-yyyy").format(new java.util.Date());
String timeFile = new SimpleDateFormat("HH-mm").format(new java.util.Date());
String fileName = clientDataObjectRequest.getMetricName().replace(" ","_") + "_" + dateFile + "T" + timeFile;
HttpHeaders headers = new HttpHeaders();
headers.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName + ".csv");
headers.set(HttpHeaders.CONTENT_TYPE, "text/csv");
return new ResponseEntity<>(
fileInputStream,
headers,
HttpStatus.OK
);
}

上面的代码正在生成我不想要的响应。我尝试过其他的东西,比如将CSVFormat更改为另一个标准,也尝试过使用";printRecords";而不是";printRecord";。我在文档中做了一些研究,但我很难理解。

我发现了如何改变结果
不使用这种方式:

try(
ByteArrayOutputStream out = new ByteArrayOutputStream();
CSVPrinter csvPrinter = new CSVPrinter(
new PrintWriter(out),
CSVFormat.EXCEL.withHeader(csvHeader)
);
) {
for (List<CompanyChartData> record: csvBody) {
csvPrinter.printRecord(record);
}

我改用这种方法:

try(
ByteArrayOutputStream out = new ByteArrayOutputStream();
CSVPrinter csvPrinter = new CSVPrinter(
new PrintWriter(out),
CSVFormat.DEFAULT.withHeader(csvHeader).withQuoteMode(QuoteMode.NON_NUMERIC)
);
) {
for (CompanyChartData record: csvBody) {
csvPrinter.printRecord(record.getClientName(), record.getValue());
}

反应是

"Client Name","Value"
"client 1",1.0
"client 2",2.0
"client 3",53.78

查看您的代码和来自printRecord方法的结果,我的第一个猜测是您的请求映射不正确。

根据printRecord方法的文件,它将:

打印给定的值—由分隔符分隔的值组成的单个记录,后跟记录分隔符。

查看上面的代码,它只是执行for循环,直到集合中没有更多值,然后打印新行。

for (final Object value : values) {
print(value);
}
println();

根据上面给出的输出,这意味着for循环中的List<CompanyChartData> record是一个包含Object的列表,该Object包含来自请求的所有值,而不是包含键值对的对象列表。

我的假设是,如果在for循环中放入System.out.println语句或附加调试器,它应该只打印一次。

最新更新