有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用Apache POI API将xlsx转换为csv

我正在尝试转换。xlsx文件到。csv,正在进行转换,但数据格式不正确。请查找下面的代码,并建议对代码进行更改

在这里,我试图阅读一篇。xlsx文件并将其写入csv文件,即将xlsx转换为csv,但我没有得到。csv文件格式正确所有数据都显示在一个单独的文件中,但必须像Excel中的行一样显示

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class XlsxtoCSV {

    static void xlsx(File inputFile, File outputFile) {
        // For storing data into CSV files
        StringBuffer data = new StringBuffer();

        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("C:\\Users\\user69\\Desktop\\test.xlsx");
        //writing excel data to csv 
        File outputFile = new File("C:\\Users\\user69\\Desktop\\test1.csv");
        xlsx(inputFile, outputFile);
    }
}

共 (3) 个答案

  1. # 1 楼答案

    使用Commons CSV对单元格值进行编码,这样更健壮。不幸的是,仍然需要一些额外的代码来逐行/单元格地遍历工作表,并在每个单元格上调用Commons CSV(XSSF不提供这一点),但至少要保证编写的实际单元格值是标准CSV(即,您不必担心转义字符或添加逗号)

    Maven为Commons CSV添加:

    <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-csv</artifactId>
                <version>1.5</version>
            </dependency>   
    

    一旦Commons CSV可用,这就是将工作簿导出到CSV的代码。此示例写入OutputStream,但文件输出也很容易

    // Convert an XSSFWorkbook to CSV and write to provided OutputStream
    private void writeWorkbookAsCSVToOutputStream(XSSFWorkbook workbook, OutputStream out) {        
        CSVPrinter csvPrinter = null;       
        try {       
            csvPrinter = new CSVPrinter(new OutputStreamWriter(out), CSVFormat.DEFAULT);                
    
            if (workbook != null) {
                XSSFSheet sheet = workbook.getSheetAt(0); // Sheet #0 in this example
                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());
                    }                   
                    csvPrinter.println(); // Newline after each row
                }               
            }
    
        }
        catch (Exception e) {
            log.error("Failed to write CSV file to output stream", e);
        }
        finally {
            try {
                if (csvPrinter != null) {
                    csvPrinter.flush(); // Flush and close CSVPrinter
                    csvPrinter.close();
                }
            }
            catch (IOException ioe) {
                log.error("Error when closing CSV Printer", ioe);
            }           
        }
    }   
    
  2. # 2 楼答案

    这是感谢@Swapnil

    data.append("\r\n"); // After the columns have been appended.
    

    以下内容由@Abdullah编辑(添加) 我在上面最初的回答没有那么大的影响,但阿卜杜拉的编辑显示了很大的努力,所以我把它留给那些遇到这个问题的人&;回答

    public class App {
    
        public void convertExcelToCSV(Sheet sheet, String sheetName) {
            StringBuilder data = new StringBuilder();
            try {
                Iterator<Row> rowIterator = sheet.iterator();
                while (rowIterator.hasNext()) {
                    Row row = rowIterator.next();
                    Iterator<Cell> cellIterator = row.cellIterator();
                    while (cellIterator.hasNext()) {
                        Cell cell = cellIterator.next();
    
                        CellType type = cell.getCellTypeEnum();
                        if (type == CellType.BOOLEAN) {
                            data.append(cell.getBooleanCellValue());
                        } else if (type == CellType.NUMERIC) {
                            data.append(cell.getNumericCellValue());
                        } else if (type == CellType.STRING) {
                            String cellValue = cell.getStringCellValue();
                            if(!cellValue.isEmpty()) {
                                cellValue = cellValue.replaceAll("\"", "\"\"");
                                data.append("\"").append(cellValue).append("\"");
                            }
                        } else if (type == CellType.BLANK) {
                        } else {
                            data.append(cell + "");
                        }
                        if(cell.getColumnIndex() != row.getLastCellNum()-1) {
                            data.append(",");
                        }
                    }
                    data.append('\n');
                }
                Files.write(Paths.get("C:\\Users\\" + sheetName + ".csv"),
                    data.toString().getBytes("UTF-8"));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String [] args)
        {
            App app = new App();
            String path =  "C:\\Users\\myFile.xlsx";
            try (InputStream inp = new FileInputStream(path)) {
                Workbook wb = WorkbookFactory.create(inp);
    
                for (int i = 0; i < wb.getNumberOfSheets(); i++) {
                    System.out.println(wb.getSheetAt(i).getSheetName());
                    app.convertExcelToCSV(wb.getSheetAt(i), wb.getSheetAt(i).getSheetName());
                }
            } catch (Exception ex) {
                System.out.println(ex.getMessage());
            } 
        }
    }
    
  3. # 3 楼答案

    public static void convertToXlsx(File inputFile, File outputFile) {
    StringBuffer bf = new StringBuffer();
        FileOutputStream fos = null;
        String strGetValue = "";
        try {
            fos = new FileOutputStream(outputFile);
            XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(inputFile));
            XSSFSheet sheet = wb.getSheetAt(0);
            Row row;
            Cell cell;
            int intRowCounter = 0;
            Iterator<Row> rowIterator = sheet.iterator();
            while (rowIterator.hasNext()) {
                StringBuffer cellDData = new StringBuffer();
                row = rowIterator.next();
                int maxNumOfCells = sheet.getRow(0).getLastCellNum();
                int cellCounter = 0;
                while ((cellCounter) < maxNumOfCells) {
                    if (sheet.getRow(row.getRowNum()) != null
                            && sheet.getRow(row.getRowNum()).getCell(cellCounter) != null) {
                        cell = sheet.getRow(row.getRowNum()).getCell(cellCounter);
                        switch (cell.getCellType()) {
                        case Cell.CELL_TYPE_BOOLEAN:
                            strGetValue = cell.getBooleanCellValue() + ",";
                            cellDData.append(removeSpace(strGetValue));
                            break;
                        case Cell.CELL_TYPE_NUMERIC:
                            strGetValue = new BigDecimal(cell.getNumericCellValue()).toPlainString();
                            if (DateUtil.isCellDateFormatted(cell)) {
                                strGetValue = new DataFormatter().formatCellValue(cell);
                            } else {
                                strGetValue = new BigDecimal(cell.getNumericCellValue()).toPlainString();
                            }
                            String tempStrGetValue = removeSpace(strGetValue);
                            if (tempStrGetValue.length() == 0) {
                                strGetValue = " ,";
                                cellDData.append(strGetValue);
                            } else {
                                strGetValue = strGetValue + ",";
                                cellDData.append(removeSpace(strGetValue));
                            }
                            break;
                        case Cell.CELL_TYPE_STRING:
                            strGetValue = cell.getStringCellValue();
                            String tempStrGetValue1 = removeSpace(strGetValue);
                            if (tempStrGetValue1.length() == 0) {
                                strGetValue = " ,";
                                cellDData.append(strGetValue);
                            } else {
                                strGetValue = strGetValue + ",";
                                cellDData.append(removeSpace(strGetValue));
                            }
                            break;
                        case Cell.CELL_TYPE_BLANK:
                            strGetValue = "" + ",";
                            cellDData.append(removeSpace(strGetValue));
                            break;
                        default:
                            strGetValue = cell + ",";
                            cellDData.append(removeSpace(strGetValue));
                        }
                    } else {
                        strGetValue = " ,";
                        cellDData.append(strGetValue);
                    }
                    cellCounter++;
                }
                String temp = cellDData.toString();
                if (temp != null && temp.contains(",,,")) {
                    temp = temp.replaceFirst(",,,", ", ,");
                }
                if (temp.endsWith(",")) {
                    temp = temp.substring(0, temp.lastIndexOf(","));
                    cellDData = null;
                    bf.append(temp.trim());
                }
                bf.append("\n");
                intRowCounter++;
            }
            fos.write(bf.toString().getBytes());
            fos.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (fos != null)
                    fos.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    private static String removeSpace(String strString) {
        if (strString != null && !strString.equals("")) {
            return strString.trim();
        }
        return strString;
    }
    

    1. 代码示例句柄和单元格中的空格字符

      #