Apache POI可以生成CSV吗?

时间:2012-02-22 19:39:44

标签: apache-poi

我需要生成csv文件,我偶然发现了我们项目本身的一个模块,该模块使用Apache POI来生成excel表。所以我想我可以用同样的方法生成csv。所以我问谷歌兄弟,但他无法找到任何可以肯定的说Apache POI可以用于生成CSV文件。我也检查了下面的api,它只讨论xls表而不是csv。有什么想法吗?

http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Workbook.html

3 个答案:

答案 0 :(得分:9)

Apache Poi不会为您输出CSV。但是,您有几个不错的选择,具体取决于您写入csv的数据类型。

如果您知道没有任何单元格将包含逗号,引号,行结尾等csv标记,那么您可以遍历数据行并将文本复制到StringBuffer并将其发送到常规Java IO。 以下是沿着这些行向csv写入sql查询的示例:Poi Mailing List: writing CSV

否则,您应该查看opencsv project

,而不是弄清楚如何逃避特殊字符。

答案 1 :(得分:7)

如果您查看官方网站Apache POI,可以在那里找到很多示例。还有一个示例显示如何使用apache POI获得csv格式化输出。

ToCSV example

答案 2 :(得分:0)

基本策略:

1)Apache Commons CSV是用于写入CSV值的标准库。

2)但是我们需要自己遍历工作簿,然后在每个单元格值上调用Commons CSV的Printer,并在每行末尾添加换行符。不幸的是,这是自定义代码,在XSSF中不会自动提供。但这很简单:

        // In this example we construct CSVPrinter on a File, can also do an OutputStream
        Reader reader = Files.newBufferedReader(Paths.get(SAMPLE_CSV_FILE_PATH));
        CSVPrinter csvPrinter = new CSVPrinter(reader, CSVFormat.DEFAULT);              

        if (workbook != null) {
            XSSFSheet sheet = workbook.getSheetAt(0); // Sheet #0
            Iterator<Row> rowIterator = sheet.rowIterator();
            while (rowIterator.hasNext()) {               
                Row row = rowIterator.next();
                Iterator<Cell> cellIterator = row.cellIterator();
                while (cellIterator.hasNext()) {
                    Cell cell = cellIterator.next();
                    csvPrinter.print(cell.getStringCellValue()); // Call Commons CSV here to print
                }
                // Newline after each row
                csvPrinter.println();
            }

        }
        // at the end, close and flush CSVPrinter
        csvPrinter.flush();
        csvPrinter.close();