【问题标题】:How to convert xlsx file to csv?如何将 xlsx 文件转换为 csv?
【发布时间】:2021-10-26 23:22:31
【问题描述】:

目前我正在使用以下代码使用 Java 将 XLSX 文件转换为 CSV。我需要一个更快的解决方案,因为这太慢了。

public class Test1 {
    static void convert(File inputFile, File outputFile) {
        try {
            FileOutputStream fos = new FileOutputStream(outputFile);
            // Get the workbook object for XLSX file
            XSSFWorkbook wBook = new XSSFWorkbook(
                    new FileInputStream(inputFile));
            // Get first sheet from the workbook
            XSSFSheet sheet = wBook.getSheetAt(0);
            Row row;
            Cell cell;
            // Iterate through each rows from first sheet
            Iterator<Row> rowIterator = sheet.iterator();

            while (rowIterator.hasNext()) {
                row = rowIterator.next();

                // For each row, iterate through each columns
                Iterator<Cell> cellIterator = row.cellIterator();
                while (cellIterator.hasNext()) {

                    cell = cellIterator.next();

                    switch (cell.getCellType()) {
                    case Cell.CELL_TYPE_BOOLEAN:
                        data.append(cell.getBooleanCellValue() + ",");

                        break;
                    case Cell.CELL_TYPE_NUMERIC:
                        data.append(cell.getNumericCellValue() + ",");

                        break;
                    case Cell.CELL_TYPE_STRING:
                        data.append(cell.getStringCellValue() + ",");
                        break;

                    case Cell.CELL_TYPE_BLANK:
                        data.append("" + ",");
                        break;
                    default:
                        data.append(cell + ",");

                    }
                }
            }

            fos.write(data.toString().getBytes());
            fos.close();

        } catch (Exception ioe) {
            ioe.printStackTrace();
        }
    }

    // testing the application

    public static void main(String[] args) {
        // reading file from desktop
        File inputFile = new File("D:\\Test.xlsx");
        // writing excel data to csv
        File outputFile = new File("D:\\Test1.csv");
        convert(inputFile, outputFile);
    }
}

【问题讨论】:

  • 是的,先生。过程应该很快

标签: java csv apache-poi xlsx


【解决方案1】:

text extractors 将转储整个工作簿的 TSV。性能取决于所选的实现和您的内存可用性。

然后,您可以将其通过管道传输到 CSVPrinter 以获得正确的 CSV 输出。我不认为 Excel 单元格可以包含制表符,所以这应该是安全的。如果您的单元格中有换行符,我不确定 TSV 输出是否有效,但如果是,您可以使用 CSVParser 而不是 lines() 来读取它。

XSSFWorkbook input = new XSSFWorkbook(new File("input.xlsx"));
CSVPrinter output = new CSVPrinter(new FileWriter("output.csv"), CSVFormat.DEFAULT); 

String tsv = new XSSFExcelExtractor(input).getText();
BufferedReader reader = new BufferedReader(new StringReader(tsv));
reader.lines().map(line -> line.split("\t").forEach(output::printRecord);

如果将整个 this 缓冲为 String 效率太低,请复制其中一个基于事件的提取器的实现,然后直接写入 CSVPrinter

【讨论】:

    【解决方案2】:

    使用 apache POI 将 xls/xlsx 转换为 csv 的简单方法。

    public class XLSXToCSVConverter {
    
        public InputStream convertxlstoCSV(InputStream inputStream) throws IOException, InvalidFormatException {
    
            Workbook wb = WorkbookFactory.create(inputStream);
    
            return  csvConverter(wb.getSheetAt(0));
        }
    
        private InputStream csvConverter(Sheet sheet) {
            Row row = null;
            String str = new String();
            for (int i = 0; i < sheet.getLastRowNum()+1; i++) {
                row = sheet.getRow(i);
                String rowString = new String();
                for (int j = 0; j < 3; j++) {
                    if(row.getCell(j)==null) {
                        rowString = rowString + Utility.BLANK_SPACE + Utility.COMMA;
                    }
                    else {
                        rowString = rowString + row.getCell(j)+ Utility.COMMA;
                    }
                }
                str = str + rowString.substring(0,rowString.length()-1)+ Utility.NEXT_LINE_OPERATOR;
            }
            System.out.println(str);
            return new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8));
        }
    }
    

    希望对你有帮助,谢谢。

    【讨论】:

    • 这是什么for (int j = 0; j &lt; 3; j++) {
    • 如果任何单元格包含逗号或换行符,这将中断
    【解决方案3】:

    尝试使用 POI API。这是参考链接

    Java - Apache POI - Convert XLS/XLSX to CSV

    【讨论】:

    • 我的场景:我需要读取大量的 Xlsx 文件记录并存储到 oracle 数据库中。对于这个过程,我发现更好的解决方案是将 xlsx 转换为 csv,然后使用preparedstatement 从 csv 转换为 oracle 数据库。在您的解决方案中迭代可用。我可以使用 Apache Poi(XSSF)直接从 xlsx 读取并写入数据库,而不是从 xlsx 迭代到 csv。我需要使用 java sir 将 xlsx 转换为 csv 的任何其他直接方法。问候, Tharanya B
    • @Tharani 我不认为你可以使用 XSSF 阅读巨大的 xlsx 表格。你会得到一个内存异常。尝试使用 SXSSF(基于其他一些帖子)
    • 如果您查看 cmets,您提供的链接在代码中有错误。
    猜你喜欢
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 2013-05-19
    • 2020-07-28
    • 1970-01-01
    • 2020-05-06
    相关资源
    最近更新 更多