Top Banner
EXCEL CHART 공공 공공공공 공공
15

Excel 공통 컴포넌트

Jun 29, 2015

Download

Documents

Hyung Eun Jin
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Excel 공통 컴포넌트

EXCEL CHART공통 컴포넌트 조사

Page 2: Excel 공통 컴포넌트

1) Sheet 에서 Drawing 객체를 받아 Chart 객체를 생성 ..

Drawing drawing = sheet.createDrawingPatriarch();

ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);

Chart chart = drawing.createChart(anchor);

ChartLegend legend = chart.getOrCreateLegend();

legend.setPosition(LegendPosition.TOP_RIGHT);

2) ScatterChartData 객체를 통해 Excel 의 ChartData 형식을 만듦 .

//Scatterchart 로 정의

ScatterChartData data = chart.getChartDataFactory().createScatterChartData();

1. POI EXCEL CHART 구현 (1)

방법 (1) : Excel 차트를 새로 만들어 , Data 범위를 지정하여 , 엑셀에 반영하는 방식

Page 3: Excel 공통 컴포넌트

1. POI EXCEL CHART 구현 (1)

3) 축 (Axis) 설정 / Series( 범례 ) 지정ValueAxis bottomAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.BOTTOM);

ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT);

leftAxis.setCrosses(AxisCrosses.MAX);

ChartDataSource<Number> xs = DataSources.fromNumericCellRange(

sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));

ChartDataSource<Number> ys1 = DataSources.fromNumericCellRange(

sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));

ChartDataSource<Number> ys2 = DataSources.fromNumericCellRange(

sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));

data.addSerie(xs, ys1);

data.addSerie(xs, ys2);

4) 실제 Chart 를 그림 .

chart.plot(data, bottomAxis, leftAxis);

Page 4: Excel 공통 컴포넌트

1. POI EXCEL CHART 구현 (1)

현재 계열 (Series) 의 제목 (title) 수정 불가

현재 차트 레이아웃 수정 불가 .

Page 5: Excel 공통 컴포넌트

1.현재 POI 를 이용할 경우 , 동적으로 ( 가로 /세로 ) 열 /행 지정은 가능하지만 , 분포도 (ScatterChart) 차트만 지원하고 있습니다 .

2. 이 역시 제한적인 지원이며 , 차트 제목 이나 layout 수정과 같은 세부적인 기능은 현재는 지원하지 않고 있습니다 .

1. POI EXCEL CHART 구현 (1)

( 문제점 )

Page 6: Excel 공통 컴포넌트

InputStream myxls = new FileInputStream("line_chart.xls");

wb = new HSSFWorkbook(myxls);

Sheet sheet = wb.getSheetAt(0);

//Chart 를 가져올수있음 .

HSSFChart[] chart = HSSFChart.getSheetCharts((HSSFSheet)sheet);

HSSFSeries[] series = chart[0].getSeries();

for(int i=0;i<series.length;i++){

printSerie(series[i]);

//series[i].setSeriesTitle( "new series" ) ;

series[i].setCategoryLabelsCellRange(new CellRangeAddress(4,23,3,3));

}

// 계열 추가가능

HSSFSeries serie = chart[0].createSeries();

serie.setValuesCellRange(new CellRangeAddress(4, 23, 2, 2));

serie.setCategoryLabelsCellRange(new CellRangeAddress(4,23,3,3));// 가로축 설정 .

printSerie(serie);

1. POI EXCEL CHART 구현 (2)

방법 (2) : 미리 Excel Chart 를 만들어 놓고 , (Template 파일처럼 .)이를 읽어서 데이터 및 차트 범위만 수정하여 사용 .

Page 7: Excel 공통 컴포넌트

1. POI EXCEL CHART 구현 (2)

Page 8: Excel 공통 컴포넌트

1.이 경우 , 기본적인 차트 (Area ,Bar, Line ,Pie, Scatter) 를 인식하며 , 동적으로 지정 및 Title, Series Title 수정 역시 가능합니다 .

( 단 , Template 파일 만들 때 , 반드시 차트제목 (chart title)/ 범례이름 (series title) 을 빈 문자열이라도 지정

해야 합니다 . 이유는 , 새로운 범례 (Series) 를 생성 시 기존에 만들어져 있는 양식을 복사 (clone) 하여

사용 하기 때문입니다 .)

2. 엑셀 2003 버전 (HSSF) 만 지원 .따라서 미리 , 차트를 만들 파일은 반드시 .xls 로 만들어야하며 ,

사용자에게 제공해줄 엑셀 형식도 반드시 .xls 형태로 제공할 수 밖에 없습니다 .

3.한 Sheet 당 3 만건 정도는 안정적으로 제공 .

1. POI EXCEL CHART 구현 (2)

( 문제점 )

Page 9: Excel 공통 컴포넌트

2. 결론 ..

1. POI 에서는 Chart 의 경우 , limitation 으로 지정하고 있으며 , 앞서 찾은 2 가지 방법 모두 제한적인 형태로 지원하고 있습니다 . 따라서 , 아직 Excel Chart 를 사용 하기엔 문서도 , 기능도 부족한 상황인 게 현실입니다 ..

2. 하지만 , 차트 종류별 /레이아웃 양식을 미리 만들어놓을 경우 엑셀 파일이 많이 진다 뿐이지 , 이를 조작하는 방식은 모두 동일하므로 , 큰 문제는 되지 않을 것으로 생각됩니다 .

3. 이 외 방법으로는 JFreechart, 또는 엑셀 차트를 지원하는 유료 버전이 있습니다 .

*JFreeChart LGPL.. , SX(http://www.smartxls.com)..

Page 10: Excel 공통 컴포넌트

1. JFreeChart 를 통해 자바로 이미지를 만든 후 엑셀에 삽입하는 방식입니다 .

장점으로는 2007 년 부터 꾸준히 업데이트 된 점과 , OpenSource 라는 점입니다 .

2. 하지만 , 현재 EMS 에서 fusion 차트를 이용한 방식과 동일하기 때문에 ,

이에 따른 문제점 역시 동일할 것으로 생각됩니다 ..

< 방법 >

3. JFREE CHART 대체방법 (1)

Page 11: Excel 공통 컴포넌트

3. JFREE CHART 대체방법 (1)

Page 12: Excel 공통 컴포넌트

1. 장점으로는 POI 를 이용하여 만들었기 때문에 , 사용법은 크게 다르지 않고 ,

다양한 차트 제어 기능이 가능하다는 장점이 있습니다 . 따라서 , 동적인 구조 및 차트 구현이 가능합니다 .

2. 하지만 , 생각보다 비싼 라이센스라는 점이 가장 큰 걸림돌이 될 거 같습니다 ..

Single Developer License USD $299.00**

Unlimited Developer License USD $799.00**

Single Developer Subscription Renewal License USD $119.00**

Unlimited Developer Subscription Renewal License USD $319.00**

3. SX 유료 - 대체방법 (2)

< 방법 >

Page 13: Excel 공통 컴포넌트

1) 차트의 위치를 지정 후 차트 Type 설정 .

( 지원 차트 : Column , Line, Area, Step, Bar, Combination, Pie, Doughnut, Scatter, Bubble)

//create chart with it's location

ChartShape chart = workBook.addChart(left, top, right, bottom);

chart.setChartType(ChartShape.Bar);

2) 차트의 데이터 범위를 지정 .

//link data source, link each series to columns(true to rows).

chart.setLinkRange("Sheet1!$a$1:$F$6", false);

3) 가로 /세로 축 (Axis) 설정 .

//set axis title

chart.setAxisTitle(ChartShape.XAxis, 0, "X-axis data");

chart.setAxisTitle(ChartShape.YAxis, 0, "Y-axis data");

3. SX 유료 - 대체방법 (2)

Page 14: Excel 공통 컴포넌트

1) 차트의 범례 (Series) 제목 및 차트 제목 지정가능 .

//set series name

chart.setSeriesName(0, "My Series number 1");

chart.setSeriesName(1, "My Series number 2");

chart.setSeriesName(2, "My Series number 3");

chart.setSeriesName(3, "My Series number 4");

chart.setSeriesName(4, "My Series number 5");

chart.setTitle("My Chart");

2) 차트의 레이아웃 /스타일 수정가능

//set plot area's color to darkgray

ChartFormat chartFormat = chart.getPlotFormat();

chartFormat.setSolid();

chartFormat.setForeColor(Color.red.getRGB());

chart.setPlotFormat(chartFormat);

//set series 0's color to blue

ChartFormat seriesformat = chart.getSeriesFormat(0);

seriesformat.setSolid();

seriesformat.setForeColor(Color.BLUE.getRGB());

chart.setSeriesFormat(0, seriesformat);

3. SX 유료 - 대체방법 (2)

Page 15: Excel 공통 컴포넌트

3. SX 유료 - 대체방법 (2)