Poprawa delimitera przy prasowaniu pliku

0

Potrzebuje szybkiej pomocy

Parsuje plik z CSV do XLSX plus na tym pliku robie jeszcze parę rzecze ale mam problem z samym zapisem ponieważ

Ponieważ są wiersze w ktorych są cydyszłowy i to powoduje mi rozjechanie się kolumn

Pierw jako separatora używałem ","

private void csvToXlsx(Path csvFilePath, Path excelFilePath) throws Exception {
        logger.info("Converting CSV to XLSX" + excelFilePath);
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFilePath.toString())));
        XSSFWorkbook myWorkBook = new XSSFWorkbook();
        FileOutputStream writer = new FileOutputStream(new File(excelFilePath.toString()));
        XSSFSheet mySheet = myWorkBook.createSheet();
        String line = "";
        int rowNo = 0;
        while ((line = reader.readLine()) != null) {
            String[] columns = line.split(",");
            XSSFRow myRow = mySheet.createRow(rowNo);
            for (int i = 0; i < columns.length; i++) {
                XSSFCell myCell = myRow.createCell(i);
                myCell.setCellValue(columns[i]);
            }
            rowNo++;
        }
        myWorkBook.write(writer);
        writer.close();
    }

Następnie chciałem to naprawiac uzywajac Apache commons csv ale tym razem dostaje w kazdym pliku po jednym wierszy. Czy ktos moze mi napisać co robie zle ?

 private void csvToXlsx(Path csvFilePath, Path excelFilePath) throws Exception {
        logger.info("Converting CSV to XLSX" + excelFilePath);
        List<CSVRecord> records = collectAllEntries(csvFilePath);
        XSSFWorkbook myWorkBook = new XSSFWorkbook();
        FileOutputStream writer = new FileOutputStream(new File(excelFilePath.toString()));
        XSSFSheet mySheet = myWorkBook.createSheet();
        records.forEach(record -> {
            int rowNo = 0;
            XSSFRow myRow = mySheet.createRow(rowNo);
            for (int i = 0; i < record.size(); i++) {
                XSSFCell myCell = myRow.createCell(i);
                myCell.setCellValue(record.get(i));
            }
            rowNo++;
        });
        myWorkBook.write(writer);
        writer.close();
    }
0

co to jest za metoda collectAllEntries?

1
MySpectre napisał(a):

Następnie chciałem to naprawiac uzywajac Apache commons csv ale tym razem dostaje w kazdym pliku po jednym wierszy. Czy ktos moze mi napisać co robie zle ?

 private void csvToXlsx(Path csvFilePath, Path excelFilePath) throws Exception {
        logger.info("Converting CSV to XLSX" + excelFilePath);
        List<CSVRecord> records = collectAllEntries(csvFilePath);
        XSSFWorkbook myWorkBook = new XSSFWorkbook();
        FileOutputStream writer = new FileOutputStream(new File(excelFilePath.toString()));
        XSSFSheet mySheet = myWorkBook.createSheet();
        records.forEach(record -> {
            int rowNo = 0;
            XSSFRow myRow = mySheet.createRow(rowNo);
            for (int i = 0; i < record.size(); i++) {
                XSSFCell myCell = myRow.createCell(i);
                myCell.setCellValue(record.get(i));
            }
            rowNo++;
        });
        myWorkBook.write(writer);
        writer.close();
    }

Wiersze Ci się nie nadpisują, tylko dla każdego rekordu z csv'ki (wiersza?) zapisujesz kolejne komórki w 0-wym wierszu Twojego arkusza:

int rowNo = 0;
XSSFRow myRow = mySheet.createRow(rowNo);

Widzisz to? Jeśli nie to wróć do tego tematu: https://www.geeksforgeeks.org/variable-scope-in-java/

2

@MySpectre:
Pomijając kwestie to co @PanamaJoe napisał to powinieneś nauczyć się korzystać z try-with-resources i java.nio.Files
Takie coś wygląda lepiej:

 private static List<Row> getCsvRow(Path csvPath) {
    try(Stream<String> lines = Files.lines(csvPath)) {
      return lines
          .skip(1) //nagłówek CSV
          .map(str -> str.split(","))
          .map(Converter::mapCvsRow)
          .collect(Collectors.toUnmodifiableList());
    } catch (Exception e) {
      return Collections.emptyList();
    }
  }

 try(var outputStream = Files.newOutputStream(excelPath)) {
      workbook.write(outputStream);
    } catch (Exception e) {
      e.printStackTrace(); //powinno być log.error, ale to tylko demonstracja
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1