본문 바로가기

SpreadJS

[SpreadJS] 이미지 삽입

엑셀로 보고서를 만들다 보면 이미지를 넣어야 하는 경우가 있다. 이번 글에서는 SpreadJS 로 웹 화면에 보고서를 만들 때, 이미지를 추가하는 방법에 대해서 정리할 것이다.


이미지 삽입

SpreadJS 를 이용해서 시트에 이미지를 삽입 하는 방법은 3가지가 있다. 아래 3가지 방법을 통해 이미지를 시트에 삽입해 보았는데, 도형 기능을 이용해서 이미지를 삽입한 경우 이외에는 엑셀로 내보내 지지 않았다. 포럼에서 왜 그런지 찾아 봤는데 스파크라인과 움직이는 개체에 대한 기능은 SpreadJS 에서만 지원하고 엑셀에서는 지원하지 않는 기능이라 그런 것으로 보인다. (자세한 내용은 아래의 '삽입된 이미지를 포함해서 Excel 내보내기' 항목을 참고)


스파크라인

  • 특정 셀 안에 이미지를 추가
  • setFormula 메서드를 이용해서 IMAGE 수식을 특정 셀에 지정해서 사용
  • IMAGE 수식(=IMAGE(URL,mode,height,width,clipX,clipY,,clipWidth,vAlign,hAlign))의 매개 변수를 지정해서 원하는 이미지 추가
    • URL : 삽입될 이미지가 위치한 경로. url 형태 혹은 base64 형태의 내용을 기입. string 타입
    • mode : 이미지 맞춤 모드 (선택 사항)
      • 1 : 계속 배율에 맞춤
      • 2 : 전체 이미지에 맞춤
      • 3 : 원본 크기에 맞춤
      • 4 : 사용자 정의 크기에 맞춤
    • height : (모드가 4인 경우) 이미지의 높이 (선택 사항)
    • width : (모드가 4인 경우) 이미지의 너비 (선택 사항)
    • clipX : 대상 컨텍스트에 그릴 원본 이미지의 하위 직사각형 왼쪽 상단 모서리에 대한 X축 좌표 (선택 사항)
    • clipY : 대상 컨텍스트에 그릴 원본 이미지의 하위 직사각형 왼쪽 상단 모서리에 대한 Y축 좌표 (선택 사항)
    • clipHeight : 대상 컨텍스트에 그릴 원본 이미지의 하위 직사각형 높이 (선택 사항)
    • clipWidth : 대상 컨텍스트에 그릴 원본 이미지의 하위 직사각형 너비 (선택 사항)
    • vAlign : 이미지의 세로 맞춤 (선택 사항)
      • 0 : 위쪽
      • 1 : 가운데
      • 2 : 아래쪽
    • hAlign : 이미지의 가로 맞춤 (선택 사항)
      • 0 : 왼쪽
      • 1 : 가운데
      • 2 : 오른쪽
  • 엑셀에서 지원하지 않는 기능 -> 이 기능을 통해 지정된 이미지가 있는 통합문서를 엑셀로 내보내기하면 이미지가 지정되지 않은 상태로 내보내기 됨.

<<코드 예시>>

var img1 = 'data:image/png;base64,iV...';
// 셀 크기 조절
sheet.setColumnWidth(0, 100);
sheet.setRowHeight(0, 100);
// A1 셀에 이미지 삽입
sheet.setFormula(0, 0, '=IMAGE("' + img1 + '",4,100,100)');

[참고 링크 : SpreadJS 스파크라인 이미지 데모]

 

이미지 | 기능별 학습 | SpreadJS 데모

다음 수식에서 IMAGE 함수를 사용하여 이미지를 만들 수 있습니다. =IMAGE(URL,mode,height,width,clipX,clipY,clipHeight,clipWidth,vAlign,hAlign) 이 함수에는 다음과 같은 매개 변수가 있습니다. URL: 웹에 있는 이미

demo.grapecity.co.kr


움직이는 개체

  • GC.Spread.Sheets.FloatingObjects.FloatingObject 클래스로 움직이는 개체에 대한 객체 생성
  • 이미지 태그 요소를 생성하고 해당 요소의 src 속성으로 이미지 지정
  • 생성된 이미지 태그 요소를 content메서드를 이용하여 FloatingObject 객체에 지정
  • 시트에 FloatingObject 객체 추가
  • FloatingObject 생성자 매개변수(new FloatingObject(name, x, y, width, height))
    • name : 개체 이름
    • x : 개체가 지정될 x 좌표
    • y : 개체가 지정될 y 좌표
    • width : 개체의 너비
    • height : 개체의 높이
  • sheet.floatingObjects.remove(움직이는 개체 이름) 메서드를 이용해서 움직이는 개체 삭제
  • sheet.floatingObjects.zIndex(움직이는 개체 이름, z-index) 메서드
  • 엑셀에서 지원하지 않는 기능 -> 이 기능을 통해 지정된 이미지가 있는 통합문서를 엑셀로 내보내기하면 이미지가 지정되지 않은 상태로 내보내기 됨.

<<코드 예시>>

var floatingObject = new GC.Spread.Sheets.FloatingObjects.FloatingObject("test", 0, 120, 100, 100);
var img = document.createElement("img");
img.src = "./image/free-icon-star-1012248.png";
floatingObject.content(img);
sheet.floatingObjects.add(floatingObject);

[참고 링크 : SpreadJS 움직이는 개체 소개 데모] | [참고 링크 : SpreadJS 움직이는 개체 작업 데모]
[참고 링크 : SpreadJS FloatingObject API]

 

GC.Spread.Sheets.FloatingObjects.FloatingObject | JavaScript Spreadsheet | SpreadJS

 

www.grapecity.com

 

작업 | 기능별 학습 | SpreadJS 데모

움직이는 개체는 끌어서 놓기, 크기 조정, 이동, 복사, 붙여넣기 등의 다양한 작업을 지원합니다. 아래 JavaScript 스프레드시트에 있는 움직이는 개체에 대한 설명에 나열된 작업을 시도해 볼 수

demo.grapecity.co.kr

 

개요 | 기능별 학습 | SpreadJS 데모

FloatingObject: 사용자가 HTMLElement 콘텐츠를 사용자 정의할 수 있도록 콘텐츠 속성을 표시합니다. 움직이는개체를 시트에 추가하려면 FloatingObject 개체를 사용하고 add 메서드를 사용하여 시트에 추

demo.grapecity.co.kr

도형

  • sheet.shapes.addPictureShape 메서드로 도형을 추가해서 이미지를 삽입
  • addPictureShape 메서드 매개변수(addPictureShape(name, src, left?, top?, width?, height?))
    • name : 도형의 이름
    • src : 도형에 추가할 이미지 경로. 경로(절대/상대 경로) 혹은 base64 형태의 내용을 기입. string 타입
    • left : 도형의 x 좌표 (선택 사항)
    • top : 도형의 y 좌표 (선택 사항)
    • width : 도형의 너비 (선택 사항)
    • height : 도형의 높이 (선택 사항)
  • pictureFormat 메서드를 이용해서 그림 설정(pictureFormat(IPictureFormat))
  • IPictureFormat 옵션
    • blackAndWhite : 흑백 효과 설정
    • brightness : 밝기 설정
    • contrast : 대조 설정
    • crop : 자르기
    • duotone : 이중톤 효과
    • grayscale : 그레이스케일 설정
    • transparency : 투명도 설정
  • geometryType 메서드를 이용해 그림의 기하 도형 유형 변경
  • style 메서드를 이용해 그림의 테두리 및 배경색 설정

<<코드 예시>>

var pic1 = sheet.shapes.addPictureShape('pic1', img1, 0, 220, 100, 100);

[참고 링크 : SpreadJS 도형 셰이프 유형 그림 셰이프 데모] | [참고 링크 : SpreadJS addPictureShape API]
[참고 링크 : SpreadJS pictureFormat API] | [참고 링크 : SpreadJS IPictureFormat API]
[참고 링크 : SpreadJS geometryType API] | [참고 링크 : SpreadJS style API]

 

개요 | 기능별 학습 | SpreadJS 데모

SpreadJS는 다음과 같은 세 가지 셰이프 유형을 제공합니다. 자동 셰이프: 자동 셰이프는 독립 실행형으로 사용할 수 있습니다. 연결선 셰이프: 연결선 셰이프는 독립 실행형 또는 다른 셰이프에

demo.grapecity.co.kr

 

GC.Spread.Sheets.Shapes.ShapeCollection | JavaScript Spreadsheet | SpreadJS

 

www.grapecity.com

 

GC.Spread.Sheets.Shapes.PictureShape | JavaScript Spreadsheet | SpreadJS

 

www.grapecity.com

 

GC.Spread.Sheets.Shapes.IPictureFormat | JavaScript Spreadsheet | SpreadJS

 

www.grapecity.com

 

GC.Spread.Sheets.Shapes.PictureShape | JavaScript Spreadsheet | SpreadJS

 

www.grapecity.com

 

GC.Spread.Sheets.Shapes.PictureShape | JavaScript Spreadsheet | SpreadJS

 

www.grapecity.com


삽입된 이미지를 포함해서 Excel 내보내기

SpreadJS 에서 삽입한 이미지를 포함하여 Excel 로 내보내려면, 이미지는 도형 기능을 통해 시트에 삽입되어 있어야한다.
스파크라인이나, 움직이는 개체에 대한 기능은 SpreadJS 에서만 지원하고 Excel에서는 지원되지 않는 기능이기 때문이다.
도형 기능을 통해 이미지가 삽입된 통합문서를 Excel 내보내기 하면 이미지가 잘 포함되어서 내보내기 되어진다.
근데 여기서 하나 문제점이 있었다. SpreadJS 에서 1 대 1 비율의 이미지를 넣고 Excel 로 내보내기 했는데, 내보내진 Excel 을 열어보니 삽입된 이미지의 비율이 살짝 안맞아 있었다.

SpreadJS 에 이미지 삽입

 

이미지를 포함해서 내보내진 Excel 파일

이에 대해서 개발자 포럼을 또 한참을 뒤져 보니 아래와 같은 글을 발견했다. 나같은 사람이 또 있던 모양.
[참고 링크 : 그레이프시티 개발자 포럼 Q&A 글]

 

엑셀 export 이미지 비율 관련 ssjson > Q&A | 토론 | 그레이프시티 개발자 포럼

요청하신 이미지가 포함된 ssjson 파일입니다.

dev.grapecity.co.kr

해서 해결법으로는 아래 코드를 쓰면 된다.

if (spread) {
    spread.sheets.forEach(function (item) {
		// 시트에 적용된 기본 고정 글꼴 지정 및 크기 지정
    	let style = item.getDefaultStyle();
    	style.themeFont = undefined;
    	style.font = "14.6px 맑은 고딕";
    	item.setDefaultStyle(style);
	});
}

 

위 코드를 써서 내보내기 한 Excel을 열어보니 삽입한 이미지 비율이 1 대 1 비율로 잘 들어가 있었다.


결론

SpreadJS 에서 이미지를 삽입할 때 쓰는 기능은 세가지가 있다.

  • 스파크라인
  • 움직이는 개체
  • 도형

이미지가 포함된 시트를 Excel 로 내보내기 할 때, 이미지가 삽입된 채로 내보내기 할려면 도형 기능으로 이미지를 넣어야 한다.

'SpreadJS' 카테고리의 다른 글

[SpreadJS] 테이블 시트  (0) 2023.03.23
[SpreadJS] 컨텍스트 메뉴  (0) 2023.03.08
[SpreadJS] 조건부 서식  (0) 2023.03.03
[SpreadJS] ExcelIO  (0) 2023.02.16
[SpreadJS] 데이터 바인딩  (0) 2023.02.13