Java

[JAVA]자바 엑셀 시트 여러개 생성하는 방법(Apache poi)

자바로 여러개의 시트를 가진 엑셀을 생성해보자.

자바에서 엑셀을 사용하기 위해선 Apache poi 를 다운받아야 한다.

아파치 POI(Apache POI)는 아파치 소프트웨어 재단에서 만든 라이브러리로서 마이크로소프트 오피스 파일 포맷을 순수 자바 언어로서 읽고 쓰는 기능을 제공한다

POI 라는 이름은 “Poor Obfuscation Implementation”의 줄임말로서 기존의 마이크로소프트 오피스의 파일 포맷(OLE 2 Compund Document Format : OLE2)이 일부러 해독하기 힘들게 만들어 놓은 것 같음에도 불구하고 실제로 리버스 엔지니어링되어 사용할 수 있게 되었음을 의미한다

( 출처 : 위키백과)

 

Apache Download Mirrors

We suggest the following mirror site for your download: https://mirror.navercorp.com/apache/poi/release/bin/poi-bin-5.0.0-20210120.zip Other mirror sites are suggested below. It is essential that you verify the integrity of the downloaded file using the PGP signature ( .asc file) or a hash ( .md5 or…

www.apache.org

여기서 다운받으면 된다.


https://mirror.navercorp.com/apache/poi/release/bin/poi-bin-5.0.0-20210120.zip

라고 써있는 링크를 다운받으면 된다. (맨 위 링크나 HTTP에 있는 링크나 BackUP Sites 링크 다 가능하다)

그리고 난 IntelliJ를 쓰기 때문에, Project Structure 의 library 에 jar 파일들을 추가해주었다.


폴더 자체를 한꺼번에 넣고 싶었으나 모듈을 찾을 수 없다는 에러가 뜨길래 그냥 jar파일 하나씩 다 넣어줬다.


여기 안에서 밖에 있는 jar 파일 뿐만 아니라 auxiliary,lib,ooxml-lib 폴더 안에 있는 jar 파일까지 다 추가해줘야한다.

이렇게 환경 세팅은 완료되었다.


그럼 이제 엑셀을 생성하는 프로그램을 작성해보겠다.

한 함수가 아니라 여러 함수에서 Workbook을 파라미터로 받아서 엑셀 시트를 생성해보았다.

1. 일단 Workbook 을 생성한다.

2. 그 workbook 에 sheet를 여러개 생성한다.

3.그 sheet 에 row,cell 객체를 이용하여 값을 쓴다.

4.마지막에 fileoutputstream 객체를 만들어서 엑셀에 저장한다.

결과 파일:

첨부파일

workbook.xlsx

파일 다운로드

import com.sun.corba.se.spi.orbutil.threadpool.Work;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.WorkbookUtil;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class Main {
    public static void main(String args[])
           throws FileNotFoundException, IOException
        {

            Workbook wb = new XSSFWorkbook();
            Sheet sheet1 = wb.createSheet("new sheet");
            CreationHelper createHelper = wb.getCreationHelper();

            // Create a row and put some cells in it. Rows are 0 based.
            Row row = sheet1.createRow(0);
            // Create a cell and put a value in it.
            Cell cell = row.createCell(0);
            cell.setCellValue(1);
            // Or do it on one line.
            row.createCell(1).setCellValue(1.2);
            row.createCell(2).setCellValue(
                    createHelper.createRichTextString("첫 번째 시트 문자열"));
            row.createCell(3).setCellValue(true);

            Main main = new Main();
            main.createNum(wb);

    }
    public void createNum(Workbook wb) throws IOException {
        Sheet sheet2 = wb.createSheet("second sheet");

        CreationHelper createHelper = wb.getCreationHelper();

        Row row = sheet2.createRow(0);
        // Create a cell and put a value in it.
        Cell cell = row.createCell(0);
        cell.setCellValue(14412);
        // Or do it on one line.
        row.createCell(1).setCellValue(1.2124124);
        row.createCell(2).setCellValue(
                createHelper.createRichTextString("두 번째 시트 문자열"));
        row.createCell(3).setCellValue(true);


        String safeName = WorkbookUtil.createSafeSheetName("[O'Brien's sales*?]"); // returns " O'Brien's sales   "
        Sheet sheet3 = wb.createSheet(safeName);

        row = sheet3.createRow(0);
        // Create a cell and put a value in it.
        cell = row.createCell(0);
        cell.setCellValue(1241241);
        // Or do it on one line.
        row.createCell(1).setCellValue(1241241.2);
        row.createCell(2).setCellValue(
                createHelper.createRichTextString("세 번째 시트 문자열"));
        row.createCell(3).setCellValue(true);




        try (OutputStream fileOut = new FileOutputStream("workbook.xlsx")) {
            wb.write(fileOut);
        }


    }

}

  } }


그러면 이렇게 시트 3개가 생성된다.

Workbook wb = new XSSFWorkbook();​

엑셀 생성시 확장명을 “.xlsx”로 하고 싶으면 XSSFWorkbook 을 써야하고

“xls”로 하고싶으면 HSSFWorkbook 을 써야한다.

“xls”는 1997~2003년 버전이고 , “xlsx”는 2007년 이후 버전으로 알고있다. (정확한 연도는 틀릴 수 있음)

Sheet sheet1 = wb.createSheet("new sheet");

그리고 Sheet를 생성해준다.

 
Row row = sheet1.createRow(0);

시트에 0 번째 행을 만든다.

Cell cell = row.createCell(0);

위에서 만든 행에 0번째 cell을 생성한다.

row.createCell(1).setCellValue(1.2);
1번째 cell에 cell value를 쓴다.
row.createCell(2).setCellValue(

createHelper.createRichTextString("첫 번째 시트 문자열"));

row.createCell(3).setCellValue(true);​

문자열을 쓸 수도 있고 .. true는 boolean 같은데 시트보면 True라고 써있다.

public void createNum(Workbook wb) throws IOException {
        Sheet sheet2 = wb.createSheet("second sheet");

다른 메소드를 만들어보았다. 파라미터로 Workbook wb 를 받아서

그 wb를 이용해 sheet를 만들고 위의 작업을 반복한다.

try (OutputStream fileOut = new FileOutputStream("workbook.xlsx")) {
            wb.write(fileOut);
        }

마지막으로 FileOutputStream 객체에 엑셀명을 써줘서 파일을 만들고

이 파일에 지금까지 생성한 Workbook 객체를 써주면 엑셀 작성 완성이다.

 

고찰:

위처럼 메소드 나눠서 여러개 sheet 생성하는 걸 해봤을 때,

맨 처음 메소드(main함수)에서 FileOutputStream 을 생성한다면 , 마지막 메소드(createNum())에서 파일을 저장하기 위해 Workbook 뿐만 아니라 FileOutputStream도 파라미터도 전달해줬는데, 저장할 때 오류가 났었다.

근데 이렇게 처음 메소드(main함수) 에서 FileOutputStream을 생성하지 않고, 마지막 메소드(createNum())에 FileOutputStream 생성을 생성했기 때문에 FileOutputStream을 파라미터로 받지 않아도 되고 Workbook 을 저장할 때 오류가 나지 않았다.

  

Leave a Reply

error: Content is protected !!