Excel 공통 컴포넌트
-
Upload
hyung-eun-jin -
Category
Documents
-
view
994 -
download
2
Transcript of Excel 공통 컴포넌트
EXCEL CHART공통 컴포넌트 조사
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 범위를 지정하여 , 엑셀에 반영하는 방식
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);
1. POI EXCEL CHART 구현 (1)
현재 계열 (Series) 의 제목 (title) 수정 불가
현재 차트 레이아웃 수정 불가 .
1.현재 POI 를 이용할 경우 , 동적으로 ( 가로 /세로 ) 열 /행 지정은 가능하지만 , 분포도 (ScatterChart) 차트만 지원하고 있습니다 .
2. 이 역시 제한적인 지원이며 , 차트 제목 이나 layout 수정과 같은 세부적인 기능은 현재는 지원하지 않고 있습니다 .
1. POI EXCEL CHART 구현 (1)
( 문제점 )
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 파일처럼 .)이를 읽어서 데이터 및 차트 범위만 수정하여 사용 .
1. POI EXCEL CHART 구현 (2)
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)
( 문제점 )
2. 결론 ..
1. POI 에서는 Chart 의 경우 , limitation 으로 지정하고 있으며 , 앞서 찾은 2 가지 방법 모두 제한적인 형태로 지원하고 있습니다 . 따라서 , 아직 Excel Chart 를 사용 하기엔 문서도 , 기능도 부족한 상황인 게 현실입니다 ..
2. 하지만 , 차트 종류별 /레이아웃 양식을 미리 만들어놓을 경우 엑셀 파일이 많이 진다 뿐이지 , 이를 조작하는 방식은 모두 동일하므로 , 큰 문제는 되지 않을 것으로 생각됩니다 .
3. 이 외 방법으로는 JFreechart, 또는 엑셀 차트를 지원하는 유료 버전이 있습니다 .
*JFreeChart LGPL.. , SX(http://www.smartxls.com)..
1. JFreeChart 를 통해 자바로 이미지를 만든 후 엑셀에 삽입하는 방식입니다 .
장점으로는 2007 년 부터 꾸준히 업데이트 된 점과 , OpenSource 라는 점입니다 .
2. 하지만 , 현재 EMS 에서 fusion 차트를 이용한 방식과 동일하기 때문에 ,
이에 따른 문제점 역시 동일할 것으로 생각됩니다 ..
< 방법 >
3. JFREE CHART 대체방법 (1)
3. JFREE CHART 대체방법 (1)
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)
< 방법 >
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)
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)
3. SX 유료 - 대체방법 (2)