CSV文件转换成Excel文件

在Java中将CSV文件转换成Excel文件,可以使用Apache POI、JXL或更为现代的库如Apache Commons CSV与OpenCSV结合使用,或者使用Spire.XLS for Java等商业库。

1.使用Open csv将csv文件转换为excel文件           

            <dependency>
                <groupId>com.opencsv</groupId>
                <artifactId>opencsv</artifactId>
                <version>5.6</version>
            </dependency>
  /**
     * Csv文件转换为Excel文件
     * csvFile:csvFile文件
     * fileName:要转换的xlsx文件名
     */
    public static File convertCsvToExcel(File csvFile, String fileName) {
        try {
            //创建SXSSFWorkbook对象,参数表示要保持在内存中的行数
            SXSSFWorkbook workbook = new SXSSFWorkbook(100);
            CSVReader reader = new CSVReader(new FileReader(csvFile.getCanonicalPath()));
            Sheet sheet = workbook.createSheet("Sheet1");
 
            Row row;
            Cell cell;
            String[] dataRow;
            while ((dataRow = reader.readNext()) != null) {
                row = sheet.createRow(sheet.getPhysicalNumberOfRows());
                for (int j = 0; j < dataRow.length; j++) {
                    cell = row.createCell(j);
                    cell.setCellValue(dataRow[j]);
                    cell.setCellType(CellType.STRING);
                }
            }
            String newFileName = Files.createTempDirectory(THEME_ANALYSE_XLSX_FILE).toString() + File.separator + FilenameUtils.getName(fileName);
            File xlsxFile = new File(newFileName);
            FileOutputStream fos = new FileOutputStream(xlsxFile);
            workbook.write(fos);
            workbook.dispose();
            csvFile.delete();
            return xlsxFile;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

2.1.使用commons-csv将csv文件转换为excel文件

            <dependency>
                <groupId>com.opencsv</groupId>
                <artifactId>commons-csv</artifactId>
                <version>1.9</version>
            </dependency>
  /**
     * 使用commons csv转换csv文件
     * csvFile:csvFile文件
     * fileName:要转换的xlsx文件名
     */
    private File convertCsvToExcel2(File csvFile, String fileName) {
        try (FileReader reader = new FileReader(csvFile.getCanonicalPath());
             CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT)) {
            // 解析CSV文件
            Iterator<CSVRecord> iterator = parser.iterator();
            //创建SXSSFWorkbook对象,参数表示要保持在内存中的行数
            SXSSFWorkbook workbook = new SXSSFWorkbook(100);
            Sheet sheet = workbook.createSheet("Sheet1");
            Row row;
            Cell cell;
            while (iterator.hasNext()) {
                CSVRecord record = iterator.next();
                row = sheet.createRow(sheet.getPhysicalNumberOfRows());
                for (int j = 0; j < record.size(); j++) {
                    cell = row.createCell(j);
                    cell.setCellValue(record.get(j));
                    cell.setCellType(CellType.STRING);
                }
 
            }
            Path tempFile = Files.createTempDirectory("di.download.requirement");
            String sourceFilePath = tempFile.toString() + File.separator;
 
            String newFileName = sourceFilePath + FilenameUtils.getName(fileName);
            File xlsxFile= new File(newFileName);
            FileOutputStream fos = new FileOutputStream(xlsxFile);
            workbook.write(fos);
            workbook.dispose();
            return xlsxFile;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

3.使用easyexcel 转换csv文件

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
                <version>3.1.0</version>
            </dependency>
     /**
     * 使用EasyExcel转换csv文件
     * csvFile:csvFile文件
     * fileName:要转换的xlsx文件名
     */
    public static File convertCsvToExcel(File csvFile, String fileName) {
        try {
            String baseName = FilenameUtils.getBaseName(fileName);
            File xlsxFile = File.createTempFile(baseName, EXCEL_FILE_SUFFIX);
            //使用EasyExcel读取csv文件
            ExcelReaderBuilder readerBuilder = EasyExcel.read(csvFile);
            readerBuilder.headRowNumber(0);
 
            ExcelReader excelReader = readerBuilder.build();
            ReadWorkbookHolder readWorkbookHolder = excelReader.analysisContext().readWorkbookHolder();
 
            if (readWorkbookHolder instanceof CsvReadWorkbookHolder) {
                CsvReadWorkbookHolder csvReadWorkbookHolder = (CsvReadWorkbookHolder) readWorkbookHolder;
                // 底层读取csv 用的是apache的common-csv 所以设置 CsvFormat即可
                csvReadWorkbookHolder.setCsvFormat(csvReadWorkbookHolder.getCsvFormat().withDelimiter(',').withQuote(null));
            }
 
            List<Object> dataList = new ExcelReaderSheetBuilder(excelReader).doReadSync();
 
            // 使用EasyExcel写入xlsx文件
            ExcelWriterBuilder writerBuilder = EasyExcel.write(xlsxFile);
            writerBuilder.sheet().doWrite(dataList);
            return xlsxFile;
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
    }

对于大量数据且内存有限的情况,推荐使用如xlsxtream这样的库,它可以实现流式读写,从而避免一次性加载整个CSV文件到内存中。

            <dependency>
                <groupId>com.monitorjbl</groupId>
                <artifactId>xlsx-streamer</artifactId>
                <version>2.1.0</version>
            </dependency>
 /**
     * 解析Excel文件,判断是否是空文件
     */
    public static Boolean parseExcel(String filePath) {
        Workbook workbook = null;
        try {
            InputStream inputStream = new FileInputStream(new File(filePath));
            workbook = StreamingReader.builder()
                    .rowCacheSize(100)
                    .bufferSize(4096)
                    .open(inputStream);

            for (Sheet sheet : workbook) {
                for (Row row : sheet) {
                    int colnum = row.getPhysicalNumberOfCells();
                    for (int i = 1; i < colnum; i++) {
                        Cell cell = row.getCell(i);
                        if (!BLANK.equals(cell.getCellType()) && StringUtils.isNotEmpty(cell.getStringCellValue())) {
                            return false;
                        }
                    }
                }
            }
            workbook.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            if (workbook != null) {
                try {
                    workbook.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return true;
    }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值