我正在使用OpenCSV 4.6读取和写入csv文件。我有一个类似的Java bean
public class CMMProjectInfo implements Serializable {
private static final long serialVersionUID = 1L;
@CsvBindByName(column = "ProjectName",required = true)
private String projectName;
@CsvBindByName(column = "ProjectCode",required = true)
private String projectCode;
@CsvBindByName(column = "Visibility",required = true)
private String visibility;
}
如果用户上传有效的csv文件,如下所示
ProjectCode;ProjectName;Visibility
T1;Test, 1;1
T2;Test2;0
TST;Test3;1
我们能够使用HeaderColumnNameMappingStrategy将标题映射到对象。如果用户使用excel编辑器编辑csv文件,则文件将发生如下变化(它会附加其他字符(,和“))
ProjectCode;ProjectName;Visibility,
T1;Test,1;1
T2;Test2;0,
TST;Test3;1,
现在,如果用户上传由excel文件编辑的文件,则无法映射标头并出现错误捕获CSV标头错误!,因为当我们尝试映射标头时,它将基于delimiter(;)拆分,然后取值将为1. ProjectCode 2. ProjectName和3。Visibility,最后的标头值包含其他字符,这就是为什么无法将标头名称从Visibility映射到Visibility,
的原因注:输入文件中的逗号(,)出现问题。我不能限制用户上传带有逗号值的文件。
映射标题时,有什么方法可以解决此问题?
当前找到了解决该问题的快速解决方案,但不是完整的解决方案。当我们写入csv文件时,我在(\ n)结束行之前的行末添加了额外的delimiter(;)。
StatefulBeanToCsv beanWriter = builder
.withApplyQuotesToAll(false)
.withSeparator(';')
.withMappingStrategy(new AnnotationStrategy(this.inputData.iterator().next().getClass()))
.withLineEnd(";\n")
.build();
从withLineEnd(“ \ n”)更改为withLineEnd(“; \ n”)。这将在行尾添加其他定界符。该文件下载后,如下所示
ProjectCode;ProjectName;Visibility;
T1;Test, 1;1;
T2;Test2;0;
TST;Test3;1;
如果我们使用excel编辑器编辑文件,则会在该行的末尾附加其他字符,而不是在现有标头上。例如,编辑文件后,其显示如下所示
ProjectCode;ProjectName;Visibility;,
T1;Test,1;1;
T2;Test2;0;,
TST;Test3;1;,
当我们映射到标题时,它像下面那样分割标题行
我知道这不是完整的解决方案。如果您有其他想法,请分享