java - 通过java将csv转换为.xls,其中分隔分隔未正确完成

标签 java csv opencsv

我有以下名为 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 解析器,例如:

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/

相关文章:

java - 断言失败时触发函数

r - 使用 download.file() 从 HTTPS 下载文件

python - pd.read_csv - 忽略前 N 行

java - JSON 返回上的 opencsv.parseLine 缺少“

java - PrintStream 不打印

java - Java 应用程序中是否完全不存在内存泄漏?

java - 代理对象方法

Python CSV 写入列

java - OpenCSV 和 Java : Method Skips A Line Every Time It Is Run?

android - CSV 缺失值