웹에서 png저장 없이 엑셀에 이미지 출력

lsj8367·2021년 4월 16일
0

회사에서의 첫 프로젝트를 일주일 진행하는 도중에 요구조건이 생겨서 글을 적게 되었다.

엑셀 저장버튼을 눌렀을때, 웹에서 기존에 가지고있는 자료 + 그래프 이미지를 같이 엑셀에 저장해줘야 하는 기능을 구현 해야했다. 문서들을 다 찾아보았지만 대부분 로컬에 png파일을 저장시키고 그 다음 그것을 다시 FileInputStream을 사용하여 저장시킨 png를 불러와 엑셀에 저장해주는 자료만 나와있어서 여러가지 코드를 접목하여 만든 자료이다.

나는 maven을 사용하여 dependency를 추가해줬다.
pom.xml에 추가한 것은 아래와 같다.

pom.xml

	<!-- 엑셀 관련 Apache poi -->	
	<dependency>	
		<groupId>org.apache.poi</groupId>	
		<artifactId>poi</artifactId>	
		<version>4.1.1</version>	
	</dependency>	
	
	<!-- 엑셀 관련 Apache poi -->	
	<dependency>	
	  <groupId>org.apache.poi</groupId>	
	  <artifactId>poi-ooxml</artifactId>	
	  <version>4.1.1</version>	
	</dependency>
	
	<!-- DatatypeConverter.parseBase64Binary 문자열 byte배열로 변환 -->
	<dependency>
	    <groupId>javax.xml.bind</groupId>
	    <artifactId>jaxb-api</artifactId>
	    <version>2.3.1</version>
	</dependency>

Apache poi 라이브러리를 이용하여 엑셀을 생성할 수 있다.

Java

package com.gogo.test;

import java.io.FileOutputStream;

import javax.xml.bind.DatatypeConverter;

import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Picture;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
	
	int count = 0; //0부터 증가하는 파일명 임의 할당
    
	@PostMapping("excelGo")
	public String xlsWriter(@RequestBody String ss) {
		
		try {
			Workbook wb = new XSSFWorkbook();
			Sheet sheet = wb.createSheet("My Sample Excel");

			// png파일 byte 배열로 변환
			// ss.split(",")[0] 는 data:image/png;base64 이므로 제외하고 그 다음부터 변환한다.
			String data = ss.split(",")[1];
			
			byte[] bytes = DatatypeConverter.parseBase64Binary(data);

			// png타입으로 바이트 배열 int변환
			int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);

			// 인스턴스화 과정
			CreationHelper helper = wb.getCreationHelper();
			Drawing drawing = sheet.createDrawingPatriarch();
			ClientAnchor anchor = helper.createClientAnchor();
			
			// 이미지 셀 행렬 setting
			anchor.setCol1(5); //열 5칸 띄움
			anchor.setRow1(5); //행 5칸 띄움

			// 그림 만들기
			Picture pict = drawing.createPicture(anchor, pictureIdx);
			
			// 만든 이미지 원래사이즈로 변경
			pict.resize();

			// 엑셀로 저장
			
			FileOutputStream fileOut = new FileOutputStream("경로명" + count +".xlsx");
			wb.write(fileOut);
			fileOut.close();
			count++;
			System.out.println("완료");
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return "success";
	}
}

이것을 기본으로 하여 웹서버와 연동하게 된다면 Ajax 호출 POST 방식으로 String ttt에 해당하는 문자열 값을 request로 받아서 이 방식으로 진행하면 될 것같다. 그리고 로컬 경로 FileOutputStream를 사용할 것이 아니라 다운로드 버튼을 눌렀을때 downloadURI로 바로 웹에서 다운받아 볼 수 있게 클라이언트쪽에서 처리하면 되겠다.

다음 포스팅에서는 클라이언트에서 서버쪽으로 값을 어떻게 넘기는지 알아보도록 하자.

profile
기록을 많이 하자!💻

0개의 댓글