使用apache poi将.xls转换为csv文件

时间:2014-05-21 11:25:16

标签: java excel csv apache-poi

我将.xls转换为csv文件。我的代码很好。但是有一个问题,我正面临着。像一些单元格值有(xxx,Md)这些单元格值应该考虑一个值但是需要两个column.how在这里纠正问题,我附上了我的代码。

try
{
    FileOutputStream fos = new FileOutputStream(outputFile);
    HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(inputFile));
    workbook.setMissingCellPolicy(Row.CREATE_NULL_AS_BLANK);
    HSSFSheet sheet = workbook.getSheetAt(0);

    for(int rowIndex = sheet.getFirstRowNum(); rowIndex <= sheet.getLastRowNum(); rowIndex++)
    {
        Cell cell=null;
        Row row = null;

        int previousCell = -1;
        int currentCell = 0;
        row = sheet.getRow(rowIndex);

        for(int colIndex=row.getFirstCellNum(); colIndex < row.getLastCellNum(); colIndex++)
        {
            cell = row.getCell(colIndex);
            currentCell = cell.getColumnIndex();

            /* Cell processing starts here*/
            System.out.println("coll"+colIndex);

            switch (cell.getCellType())
            {
                case Cell.CELL_TYPE_BOOLEAN:
                    cellDData.append(cell.getBooleanCellValue() + ",");
                    System.out.println("boo"+ cell.getBooleanCellValue());
                    break;

                case Cell.CELL_TYPE_NUMERIC:
                    if (DateUtil.isCellDateFormatted(cell))
                    {
                        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
                        String  strCellValue = dateFormat.format(cell.getDateCellValue());
                        cellDData.append(strCellValue +",");
                    }
                    else 
                    {
                        System.out.println(cell.getNumericCellValue());
                        Double value = cell.getNumericCellValue();
                        Long longValue = value.longValue();
                        String strCellValue1 = new String(longValue.toString());
                        cellDData.append(strCellValue1 +",");
                    }
                    break;

                case Cell.CELL_TYPE_STRING:
                    String out=cell.getRichStringCellValue().getString();
                    cellDData.append(cell.getRichStringCellValue().getString() + ",");
                    System.out.println("string"+cell.getStringCellValue());
                    break;

                case Cell.CELL_TYPE_BLANK:
                    cellDData.append("" +",");
                    System.out.print("THIS IS BLANK");
                    break;

                default:
                    break;
            }
        }
    }
}

3 个答案:

答案 0 :(得分:1)

您可以编写自己的代码,但我建议您使用SuperCSVOpenCSV

这样的库

对于CSV本身,有RFC-4180。这个RFC定义了什么&#39;适当的&#39; CSV应该看起来像;它会告诉你如何以及如何引用和逃避

答案 1 :(得分:0)

我可以想到以下两个选项:

  1. 将分隔符从COMMA更改为其他内容(可能是PIPE?)
  2. 将您的字符串换成引号(“”)
  3. 示例代码......

    case Cell.CELL_TYPE_STRING:
                    String out=cell.getRichStringCellValue().getString();
                    if(out.contains(",")) {
                        out = "\""+out+"\"";
                    }
                    cellDData.append(out + ",");
                    System.out.println("string"+out);
                    break;
    

    P.S:您可以使用Strnigbuilder而不是字符串连接

答案 2 :(得分:0)

根据RFC-4180,每个字段可能会或可能不会用双引号引起来。因此,如果用双引号将每个单元格值括起来,则逗号之间的逗号将不被视为定界符。如果您采用这种方法,请确保在字段中出现的任何双引号之前都加上了另一个双引号。