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) { /* 무시 */ }
}
}
}