我需要生成csv文件,我偶然发现了我们项目本身的一个模块,该模块使用Apache POI来生成excel表。所以我想我可以用同样的方法生成csv。所以我问谷歌兄弟,但他无法找到任何可以肯定的说Apache POI可以用于生成CSV文件。我也检查了下面的api,它只讨论xls表而不是csv。有什么想法吗?
http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Workbook.html
答案 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格式化输出。
答案 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();