회사에서의 첫 프로젝트를 일주일 진행하는 도중에 요구조건이 생겨서 글을 적게 되었다.
엑셀 저장버튼을 눌렀을때, 웹에서 기존에 가지고있는 자료 + 그래프 이미지를 같이 엑셀에 저장해줘야 하는 기능을 구현 해야했다. 문서들을 다 찾아보았지만 대부분 로컬에 png파일을 저장시키고 그 다음 그것을 다시 FileInputStream
을 사용하여 저장시킨 png를 불러와 엑셀에 저장해주는 자료만 나와있어서 여러가지 코드를 접목하여 만든 자료이다.
나는 maven을 사용하여 dependency를 추가해줬다.
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 라이브러리를 이용하여 엑셀을 생성할 수 있다.
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
로 바로 웹에서 다운받아 볼 수 있게 클라이언트쪽에서 처리하면 되겠다.
다음 포스팅에서는 클라이언트에서 서버쪽으로 값을 어떻게 넘기는지 알아보도록 하자.