如何将xlsx文件转换为csv?

7

我当前正在使用以下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);
    }
}

是的先生。处理应该很快。 - Tharani
3个回答

6
文本提取器将会转储整个工作簿的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);

如果将整个文本作为String缓冲效率太低,可以复制基于事件的提取器之一的实现,并直接写入CSVPrinter


1
使用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 < 3; j++) { - hdmiimdh
1
如果任何单元格包含逗号或换行符,这将会出错。 - OrangeDog

0

我的情况是:我需要读取大量的Xlsx文件记录并存储到Oracle数据库中。 为此,我找到了更好的解决方案,即将xlsx转换为csv,然后使用preparedstatement从csv转换为Oracle数据库。在您的解决方案中,迭代可用。我可以直接使用Apache Poi(XSSF)从xlsx中读取并写入数据库,而不是从xlsx迭代到csv。 我需要其他一种直接使用Java将xlsx转换为csv的方法。 谢谢, Tharanya B - Tharani
@Tharani 我认为你无法使用XSSF读取巨大的xlsx工作簿。你将会收到内存异常。尝试使用SXSSF(根据其他帖子的建议)。 - intruder
2
您提供的链接中的代码存在漏洞,如果查看评论就会发现。 - gene b.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接