我有以下名为 Vabc.csv 的 csv 文件
REC_STATUS,TRADE_ID, SETTLEMENT_DATE, TRADE_EFFECTIVE_DATE, PAYMENT_TYPE, VERSION, BREAK_DOWN_BUCKET, CAUSE, NUM_CASHFLOWS_AFFECTED, PROFILE
Found , 178942690, 01-Feb-16, 03-Dec-14, "Coupon", 5, NOISY_BREAK_BUCKET, REC_TOOL_I | REC_TOOL_H , 1, TRADE_ Offshore
Found , 197743320, Various, 21-Dec-15, "Brokerage Estimated,Upfront Fee", 1, ACTUAL DATA BREAK BUCKET,ACTUAL_DATA_BREAK, 2, AVS Offshore
正如您在上面的 csv 文件中看到的,将其转换为 .xls 文件时,需要特别注意 PAYMENT_TYPE 列,因为其值之间包含一个逗号,但不应将其视为分隔符,并且它的值以以下开头双引号并以双引号结尾,因此应将其视为单值。
现在 PAYMENT_TYPE 列的位置(索引)也已固定在 csv 文件中,它将始终位于第五位置,如您在上面的 csv 文件中看到的那样,现在我必须将上面的 .csv 文件转换为 .csv 文件。通过java .xls 2003格式,我使用jdk 1.5
现在 .xls 中的列应如下所示,但问题是付款值应被视为从双引号开始并以双引号结束的单数,其余分隔符以逗号分隔
REC_STATUS,TRADE_ID, SETTLEMENT_DATE, TRADE_EFFECTIVE_DATE, PAYMENT_TYPE, VERSION, BREAK_DOWN_BUCKET, CAUSE, NUM_CASHFLOWS_AFFECTED, PROFILE
Found , 178942690, 01-Feb-16, 03-Dec-14, "Coupon", 5, NOISY_BREAK_BUCKET, REC_TOOL_I | REC_TOOL_H , 1, TRADE_ Offshore
Found , 197743320, Various, 21-Dec-15, "Brokerage Estimated,Upfront Fee", 1, ACTUAL DATA BREAK BUCKET,ACTUAL_DATA_BREAK, 2, AVS Offshore
我设计了以下程序,该程序不会生成上述格式的 .xls,请告知我如何更正我的上述程序,以便它可以生成 .xls,并且列应按上面所示的顺序排列.xls 表,下面是我的程序,请告知如何纠正
public class CSVToExcelConverter {
public static void main(String args[]) throws IOException
{
ArrayList arList=null;
ArrayList al=null;
String fName = "C:\\Vabc.csv";
String thisLine;
int count=0;
FileInputStream fis = new FileInputStream(fName);
DataInputStream myInput = new DataInputStream(fis);
int i=0;
arList = new ArrayList();
while ((thisLine = myInput.readLine()) != null)
{
al = new ArrayList();
String strar[] = thisLine.split(",");
for(int j=0;j<strar.length;j++)
{
if(j == 4){
al.add(strar[j] + "," + strar[j+1]);
j++;
}
al.add(strar[j]);
}
arList.add(al);
System.out.println();
i++;
}
try
{
HSSFWorkbook hwb = new HSSFWorkbook();
HSSFSheet sheet = hwb.createSheet("new sheet");
for(int k=0;k<arList.size();k++)
{
ArrayList ardata = (ArrayList)arList.get(k);
HSSFRow row = sheet.createRow((short) 0+k);
for(int p=0;p<ardata.size();p++)
{
HSSFCell cell = row.createCell((short) p);
String data = ardata.get(p).toString();
if(data.startsWith("=")){
cell.setCellType(Cell.CELL_TYPE_STRING);
data=data.replaceAll("\"", "");
data=data.replaceAll("=", "");
cell.setCellValue(data);
}else if(data.startsWith("\"")){
data=data.replaceAll("\"", "");
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue(data);
}else{
data=data.replaceAll("\"", "");
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
cell.setCellValue(data);
}
//*/
// cell.setCellValue(ardata.get(p).toString());
}
System.out.println();
}
FileOutputStream fileOut = new FileOutputStream("C:\\test.xls");
hwb.write(fileOut);
fileOut.close();
System.out.println("Your excel file has been generated");
} catch ( Exception ex ) {
ex.printStackTrace();
} //main method ends
}
}
各位,请告知任何早期帮助,任何解决方案,我们将不胜感激
最佳答案
我强烈建议使用现有的库来编写Excel文档,例如Apache POI 。它有两个组件
- HSSF 用于处理 Excel '97(-2007) 文件格式
- 用于处理 Excel 2007 OOXML (.xlsx) 文件格式的 XSSF
两者都是纯 Java 实现,因此您不需要安装 MS-Excel。
顺便说一句:我建议使用现有的解析器,而不是编写自己的 CSV 解析器,例如:
- Apache Commons CSV ,或
- OpenCSV (来源Forge)
OpenCSV 的 Psydocode:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), ',', '"');
List<String[]> allLines = reader.readAll();
...
HSSFWorkbook hwb = new HSSFWorkbook();
HSSFSheet sheet = hwb.createSheet("new sheet");
...
for(String line: allLines) {
HSSFRow row = sheet.createRow((short)sheet.getLastRowNum());
for(int colIndex = 0; colIndex < line.lenght; colIndex ++) {
HSSFCell cell = row.createCell((short) colIndex);
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue(line[colIndex]);
}
}
关于java - 通过java将csv转换为.xls,其中分隔分隔未正确完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35380792/