Java를 사용한 텍스트, CSV, Excel 간 변환 처리

Excel 파일을 일반 텍스트로 변환

다음 예제는 .xlsx 형식의 Excel 파일을 지정된 경로에 쉼표(,)로 구분된 텍스트 파일로 변환하는 방법을 보여줍니다. 이 방식은 병합 셀이 포함된 시트에서는 정상 동작하지 않으며, 결과 파일이 비어 있을 수 있습니다.

import java.io.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ExcelToTextConverter {
    private static final Logger log = LoggerFactory.getLogger(ExcelToTextConverter.class);

    public static void main(String[] args) {
        String sourceExcel = "C:\\test\\test.xlsx";
        String targetText  = "C:\\test\\test.txt";
        convertExcelToText(sourceExcel, targetText);
    }

    public static void convertExcelToText(String excelPath, String txtPath) {
        StringBuilder content = new StringBuilder();
        Workbook workbook = loadWorkbook(excelPath);

        if (workbook == null) return;

        Sheet sheet = workbook.getSheetAt(0);
        int lastRow = sheet.getLastRowNum();
        Row sampleRow = sheet.getRow(lastRow);
        int columnCount = sampleRow != null ? sampleRow.getLastCellNum() : 0;

        for (int rowIndex = 0; rowIndex <= lastRow; rowIndex++) {
            Row currentRow = sheet.getRow(rowIndex);
            if (currentRow == null) break;

            for (int colIndex = 0; colIndex < columnCount; colIndex++) {
                content.append(formatCellValue(currentRow.getCell(colIndex)))
                       .append(",");
            }
            content.append("\n");
        }

        saveToFile(content.toString(), txtPath);
        try { workbook.close(); } catch (IOException e) { log.error("워크북 닫기 실패", e); }
    }

    private static Workbook loadWorkbook(String path) {
        try (InputStream input = new FileInputStream(path)) {
            return path.endsWith(".xlsx") ? new XSSFWorkbook(input) : null;
        } catch (IOException e) {
            log.error("엑셀 파일 로드 오류: " + path, e);
            return null;
        }
    }

    private static String formatCellValue(Cell cell) {
        if (cell == null) return "";

        return switch (cell.getCellType()) {
            case NUMERIC -> new BigDecimal(cell.getNumericCellValue())
                             .setScale(2, RoundingMode.HALF_UP)
                             .toString();
            case STRING  -> cell.getStringCellValue();
            default      -> "";
        };
    }

    private static void saveToFile(String data, String outputPath) {
        File file = new File(outputPath);
        if (file.exists() && !file.delete()) {
            log.warn("기존 파일 삭제 실패: " + outputPath);
        }

        try (BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(new FileOutputStream(file), "EUC-KR"))) {
            writer.write(data);
            writer.flush();
        } catch (IOException e) {
            log.error("파일 쓰기 중 오류 발생", e);
        }
    }
}

CSV 파일을 Excel(.xlsx)로 변환

쉼표로 구분된 CSV 파일을 XLSX 형식의 엑셀 문서로 변환합니다. 이 과정에서는 빈 줄이나 마지막에 공백 행이 있는 경우 문제가 발생할 수 있으므로 사전 정제가 필요합니다.

import java.io.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class CsvToExcelConverter {
    private static final Logger log = LoggerFactory.getLogger(CsvToExcelConverter.class);

    public static void main(String[] args) {
        String csvInput  = "C:\\test\\test.csv";
        String xlsxOutput = "C:\\test\\test.xlsx";
        transformCsvToExcel(csvInput, xlsxOutput);
    }

    public static void transformCsvToExcel(String csvFile, String excelFile) {
        XSSFWorkbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Data");

        // 헤더 생성
        Row header = sheet.createRow(0);
        String[] headers = {"이름", "나이", "취미"};
        for (int i = 0; i < headers.length; i++) {
            header.createCell(i).setCellValue(headers[i]);
        }

        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(new FileInputStream(csvFile), "UTF-8"))) {

            reader.readLine(); // 첫 번째 줄(헤더) 건너뛰기

            String line;
            int rowIndex = 1;
            while ((line = reader.readLine()) != null && !line.trim().isEmpty()) {
                String[] fields = line.split(",", -1); // 빈 필드도 유지
                Row row = sheet.createRow(rowIndex++);

                for (int i = 0; i < Math.min(fields.length, 3); i++) {
                    row.createCell(i).setCellValue(fields[i].trim());
                }
            }

            try (FileOutputStream out = new FileOutputStream(excelFile)) {
                workbook.write(out);
            }
            log.info("CSV → Excel 변환 완료: " + excelFile);

        } catch (IOException e) {
            log.error("CSV 처리 중 오류 발생", e);
        } finally {
            try { workbook.close(); } catch (IOException e) { /* 무시 */ }
        }
    }
}

태그: java Apache POI Excel CSV Text Conversion

7월 24일 09:38에 게시됨