繁体   English   中英

使用Apache POI将.xls转换为CSV文件

[英]Convert .xls to csv file using apache poi

我已经将.xls转换为csv文件。我的代码工作得很好。但是我遇到了一个问题。就像某些单元格值具有(xxx,Md)一样,这些单元格值应考虑一个值但要占用两列。如何纠正此问题在这里,我已附上我的代码。

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;
            }
        }
    }
}

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

对于CSV本身,有RFC-4180 该RFC定义了“适当的” CSV的外观; 它告诉您如何以及如何引用和转义

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

  1. 将分隔符从COMMA更改为其他名称(可能是PIPE吗?)
  2. 将您的字符串换成逗号(“”)

样例代码...

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

PS:您可以使用Strnigbuilder而不是字符串连接

根据RFC-4180 ,每个字段可以或不可以用双引号引起来。 因此,如果用双引号将每个单元格值括起来,则逗号之间的逗号将不被视为定界符。 如果您采用这种方法,请确保对字段中出现的所有双引号进行转义,方法是在其前面加上另一个双引号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM