본문 바로가기

01. Java/02. etc

[Java]Apache POI

 파일 관련된 공부도 하였고 수습기간때 전자설문 관리자 페이지에서 엑셀다운로드 관련 구현이 있었는데 해당 코드 작성했던 것을 다시 가져와서 복습할 생각이다. 카테고리를 뭘로 넣지 하다가 자바로 짜니까 자바쪽 넣음

 

참고

https://ko.wikipedia.org/wiki/%EC%95%84%ED%8C%8C%EC%B9%98_POI

 

아파치 POI - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

 

 

Apache POI

아파치 소프트웨어 재단에서 만든 라이브러리로서 MS Office 파일 포맷을 순수 자바 언어로서 읽고 쓰는 기능을 제공한다. 주로 워드, 엑셀, 파워포인트와 파일을 지원하며 최근의 오피스 포맷인 Office Open XML File Formats이나 기타 등등 지원함.

 

 

엑셀을 다룰것이기 때문에 엑셀과 관련된 내용만 기술한다.

 

 

HSSF (Horrible Spreadsheet Format)

Microsoft Excel 97-2003 포맷(XLS)을 다루는데 사용된다.

 

XSSF (XML Spreadsheet Format)

Microsoft Excel 2007 이후의 새로운 XML 기반 포맷(XLSX)을 다루는데 사용된다.

 

 

기존 솔루션을 참고해서 커스텀을 하였었는데 HSSF을 쓰고 있었다. 의존성 주입할 것은 다음과 같다.

 

 

● poi

HSSF 모듈


● poi-ooxml

XSSF 모듈


● poi-ooxml-schemas

XSSF 에서 사용되는 XML 스키마 파일을 다루는 데 필요.

 

(나머지 2개는 그냥 이클립스에서 구성할 때 필요하다고 찾아서 넣어줌)

● commons-compress

● xmlbeans

 

 

ㆍMaven

<!-- 버전은 알아서 -->
<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-compress</artifactId>
	<version>1.8.1</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>3.13</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>3.13</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml-schemas</artifactId>
	<version>3.13</version>
</dependency>
<dependency>
	<groupId>org.apache.xmlbeans</groupId>
	<artifactId>xmlbeans</artifactId>
	<version>2.6.0</version>
</dependency>

 

ㆍGradle

dependencies {
    // 버전은 알아서
    implementation group: 'org.apache.commons', name: 'commons-compress', version: '1.18'
    implementation 'org.apache.poi:poi:3.13'
    implementation 'org.apache.poi:poi-ooxml:3.13'
    implementation 'org.apache.poi:poi-ooxml-schemas:3.13'
    implementation group: 'org.apache.xmlbeans', name: 'xmlbeans', version: '2.6.0'
}

 

난 귀찮아서 이클립스에서 작업하려고 jar 직접 받아서 추가 했다.

poi-ooxml-schema의 경우 mvn repository에 저게 제일 최신버전이던데 높은 버전 쓸거면  poi-ooxml-full로 사용해도 무방할 듯 하다.

 

이클립스에서 쓸거면 저거 위에 말고도 몇개 더 받아야 한다. (XSSFWorkbook 생성할 때 에러 파티)

 

그리고 HSSF와 XSSF는 필요한 게 다르다.

(XSSF 생성해보고 HSSF 생성하려니 클래스 못 찾음)

개발환경은 20.06 이클립스에 open-jdk 11 사용함.

(이럴줄 알았으면 그냥 sts로 할걸 그랬다)

 

★각각 버전 잘못 맞추면 충돌 엄청 많이난다. (최신 버전 써보려다가 2시간 날려먹음..)

뭔가 계속 안되서 그냥 기존 솔루션에 있는 버전 했더니 잘됨

(Maven, Gradle 코드 부분도 해당 jar들 의존성 주입할 수 있도록 변경)

HSSF, XSSF 생성 확인

 

자 그럼 사용해보자.

 

설명 따로 없고 그냥 코드에 상세하게 주석 달겠다.

 

HSSF와 XSSF는 좀 다를줄 알고 따로 코드 쓰려고 했었는데 그냥 위에 코드에서 HSSF 부분인 클래스들이랑 확장자(.xlsx) 정도만 바꿔주면 똑같이 적용된다.

 

package com.example;

import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellRangeAddress;

public class MyPOI_HSSF {

	public static void main(String[] args) {
		String fileName = "workbook_HSSF";
		String title = "jar 버전 충돌 2시간 날림!";

		try {
			// 엑셀 만들기
			HSSFWorkbook workbook = new HSSFWorkbook();
			HSSFSheet sheet = workbook.createSheet("kdkhelloworld"); // 시트 이름

			// 행과 셀 변수 선언 및 초기화
			Row row = null;
			Cell cell = null;

			// 타이틀 넣을 셀 스타일
			HSSFCellStyle titleCellStyle = workbook.createCellStyle();
			titleCellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 가운데 정렬 설정
			titleCellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 수직 가운데 설정

			// 폰트 스타일 설정
			HSSFFont fontSize = workbook.createFont();
			fontSize.setBoldweight((short) HSSFFont.BOLDWEIGHT_BOLD); // 글씨 굵게
			fontSize.setFontHeightInPoints((short) 18); // 폰트 크기

			// 설정한 스타일 적용
			titleCellStyle.setFont(fontSize);

			// 타이틀을 위한 셀 병합
			// 특정 열의 폭 설정
			sheet.setColumnWidth(0, (sheet.getColumnWidth(0)) + (short) 2048); // 첫 번째 열, 첫번째 열 크기 + 2048

			// 셀 병합
			sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 7)); // 0,1 행 / 0,7 열 => 첫 번째,두 번째 행 8칸(A~H) 병합
			sheet.addMergedRegion(new CellRangeAddress(2, 2, 2, 6)); // 세 번째 행 3번째 칸부터 5칸(C~G) 병합
			row = sheet.createRow(0); // 첫 번째 시트에 행 생성
			cell = row.createCell(0); // 첫번째 행에 셀 생성
			cell.setCellValue(title); // 데이터 넣음
			cell.setCellStyle(titleCellStyle); // 스타일 적용

			// 셀 스타일 세팅 (header부분)
			HSSFCellStyle headerStyle = workbook.createCellStyle();

			// 헤더 스타일의 배경색을 회색(25% 그레이)으로 설정
			headerStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);

			// 배경색의 패턴을 'SOLID_FOREGROUND'으로 설정
			headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

			// 테두리를 설정. 각 메서드는 각각 아래, 위, 오른쪽, 왼쪽의 테두리를 설정하며, BORDER_THIN은 얇은 실선을 의미
			headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
			headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
			headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
			headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);

			// 수직 정렬. (short) 1은 상단 정렬
			headerStyle.setVerticalAlignment((short) 1);

			HSSFCellStyle bodyStyle = workbook.createCellStyle();
			bodyStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
			bodyStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
			bodyStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
			bodyStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);

			HSSFFont font = workbook.createFont();

			// 굵게
			font.setBoldweight((short) HSSFFont.BOLDWEIGHT_BOLD);

			// 설정한 폰트 헤더스타일에 적용
			headerStyle.setFont(font);
			
			row = sheet.createRow(2);
			cell = row.createCell(0);
			cell.setCellValue("Hello World!");
			cell = row.createCell(1);
			cell = row.createCell(2);
			cell.setCellValue("셀 병합");
			
			row = sheet.createRow(3);
			cell = row.createCell(0);
			cell.setCellValue("여기");
			cell.setCellStyle(headerStyle);
			cell = row.createCell(1);
			cell.setCellValue("원래");
			cell.setCellStyle(headerStyle);
			cell = row.createCell(2);
			cell.setCellValue("데이터 부분");
			cell.setCellStyle(headerStyle);
			cell = row.createCell(3);
			cell.setCellValue("첫줄 카테고리 였음");
			cell.setCellStyle(headerStyle);
			cell = row.createCell(4);
			cell.setCellValue("여기 길이에 따라 셀 늘어남~~~~~~~~");
			cell.setCellStyle(headerStyle);
			cell = row.createCell(5);
			cell.setCellValue(" ☞ ");
			cell.setCellStyle(headerStyle);
			cell = row.createCell(6);
			cell.setCellValue("");
			cell.setCellStyle(headerStyle);
			cell = row.createCell(7);
			cell.setCellValue("왼쪽은 빈칸");
			cell.setCellStyle(headerStyle);
			
			//셀 열의 너비, 행의 높이 자동 조절
			for(int i=0; i<8; i++) {
				sheet.autoSizeColumn(i);
			}
			
			// 파일로 저장
			try (FileOutputStream fileOut = new FileOutputStream("C:\\Users\\NC627\\Desktop\\" + fileName + ".xls")) {
				workbook.write(fileOut);
				System.out.println("Excel 파일이 생성되었습니다.");
			} catch (IOException e) {
				e.printStackTrace();
			}
			// 메모리 해제
			workbook.close();

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

바탕화면에 생성된 엑셀 파일과 내용

 

그때는 sheet.autoSizeColumn()를 안 써서 데이터가 들어가도 셀 크기가 똑같아서 한번 써봤더니

크기가 조절은 되는데 잘 맞진 않는듯 하다.

 

데이터 세팅 부분은 List로 가져와서 인덱스 크기만큼(행) 반복해서 넣어줬었다.

다음에 쓸 일 있으면 세팅 부분도 한번 만들어보겠다

'01. Java > 02. etc' 카테고리의 다른 글

java.util.Base64  (0) 2023.11.22
java.util.UUID  (0) 2023.11.21
java.lang.System  (0) 2023.11.20
java.util.Properties  (0) 2023.11.20