I downloaded the data and read by StringBuilder and achieved this result (The content of my StringBuilder)
User Manager_ID Date Humidity Temperature Pressure Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 dt-001 N5_220 09/19/2021 20.0 20.0 1000.0 1 2 3 4 5 1 2 3 dt-002 N5_220 09/25/2021 80.0 30.0 1200.0 4 5 1 2 3 4 5 1
Is there any method, library, or someone else has a solution for specifying semicolons between data? Of course, except at the end of the line. I will be grateful for your help 🙂 What I’d like to achieve:
User; Manager_ID; Date; Humidity; Temperature; Pressure; Q1; Q2; Q3; Q4; Q5; Q6; Q7; Q8 dt-001; N5_220; 09/19/2021; 20.0; 20.0; 1000.0; 1; 2; 3; 4; 5; 1; 2; 3 dt-002; N5_220; 09/25/2021; 80.0; 30.0; 1200.0; 4; 5; 1; 2; 3; 4; 5; 1
Code:
public void download() throws IOException { List<FileDTO> tests = testService.getTestFileDtoList(); // from repo XSLXManagerTestExporter excelExporter = new XSLXManagerTestExporter(tests ); XSSFWorkbook workBook = excelExporter.export(); // get XSSFWorkbook XSSFSheet selSheet = workBook.getSheet("sheet"); StringBuilder sb = new StringBuilder(); for (int i = 0; i <= selSheet.getLastRowNum(); i++) { Iterator<Cell> cellIterator = selSheet.getRow(i).cellIterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); if (sb.length() != 0) sb.append(" "); sb.append(cell.getStringCellValue()); } } workBook.close(); writeBytesToFileApache(sb.toString().getBytes()); } private static void writeBytesToFileApache(byte[] bytes) throws IOException { FileUtils.writeByteArrayToFile(new File(".....\file.csv"), bytes); }
This is my XLSX converter to StringBuilder. I’d like to heve this as .CSV
Advertisement
Answer
Have you considered using a StringJoiner?
public void download() throws IOException { List<FileDTO> tests = testService.getTestFileDtoList(); // from repo XSLXManagerTestExporter excelExporter = new XSLXManagerTestExporter(tests ); XSSFWorkbook workBook = excelExporter.export(); // get XSSFWorkbook XSSFSheet selSheet = workBook.getSheet("sheet"); List<String> csvLines = new ArrayList<>(); for (Row row : selSheet) { StringJoiner sj = new StringJoiner(";"); for (Cell cell : row) { sj.add(cell.getStringCellValue()); } csvLines.add(sj.toString()); } workBook.close(); writeBytesToFileApache(csvLines().stream().collect(Collectors.joining("n")).getBytes()); }
You may also want to consider a FileOutputStream instead of a List (or String Joiner or any other solution which essentially builds the entire CSV in memory and flushes it in a single go). It should be much more memory efficient, allowing you to deal with (potentially very) large excel files.