【问题标题】:Convert .xls to csv file using apache poi使用 apache poi 将 .xls 转换为 csv 文件
【发布时间】:2014-07-10 00:22:00
【问题描述】:

我已将 .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;
            }
        }
    }
}

【问题讨论】:

标签: java excel csv apache-poi


【解决方案1】:

根据RFC-4180,每个字段可以用双引号括起来也可以不括起来。因此,如果您将每个单元格值括在双引号中,中间的逗号将不会被视为分隔符。如果您采用这种方法,请确保通过在字段中添加另一个双引号来转义出现在字段内的任何双引号。

【讨论】:

    【解决方案2】:

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

    对于 CSV 本身,有 RFC-4180。这个 RFC 定义了“正确”的 CSV 应该是什么样子;它告诉你如何以及如何引用和转义

    【讨论】:

      【解决方案3】:

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

      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;
      

      P.S: 你可以使用 Strnigbuilder 代替字符串连接

      【讨论】:

      • 如何做到这一点,请您详细说明
      • 您不确定哪个选项?
      • 字符串类型只面临问题
      猜你喜欢
      • 2013-01-10
      • 2021-05-21
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 2015-11-11
      • 2013-07-10
      相关资源
      最近更新 更多