원형 차트

SpreadJS는 원형 차트를 지원합니다. 사용자가 워크시트의 한 열 또는 한 행에 배열된 데이터를 가지면 원형 차트로 그릴 수 있습니다.

설명
app.component.ts
index.html
app.component.html
styles.css

원형 차트를 Spread에 추가할 수 있으며 차트 스타일은 차트 API를 사용하여 변경할 수 있습니다. 원형 차트는 하나의 데이터 그룹만 표시할 수 있으므로 chart.series().get() 함수를 사용하여 계열 정보를 가져옵니다. 원형 차트는 하나의 데이터 계열에 있는 항목의 크기를 표시하고 데이터 요소는 전체 원형의 백분율로 표시됩니다.

     var chart = sheet.charts.add('pie', GC.Spread.Sheets.Charts.ChartType.pie, 0, 100, 400, 300, 'A1:D4')
     var series = chart.series().get(index)
     series.border.color = 'red';
     chart.series().set(index, series);

도넛형 차트를 Spread에 추가할 수 있으며 차트 스타일은 차트 API를 사용하여 변경할 수 있습니다. 도넛형 차트는 모든 계열을 표시할 수 있으며 각 계열은 데이터 계열을 나타내는 고리로 표시됩니다.

     var chart = sheet.charts.add('doughnut', GC.Spread.Sheets.Charts.ChartType.doughnut, 0, 100, 400, 300, 'A1:D4')
     var series = chart.series().get(index);
     series.border.width = 3;
     series.doughnutHoleSize = 0.3;
     chart.series().set(index, series);
원형 차트를 Spread에 추가할 수 있으며 차트 스타일은 차트 API를 사용하여 변경할 수 있습니다. 원형 차트는 하나의 데이터 그룹만 표시할 수 있으므로 chart.series().get() 함수를 사용하여 계열 정보를 가져옵니다. 원형 차트는 하나의 데이터 계열에 있는 항목의 크기를 표시하고 데이터 요소는 전체 원형의 백분율로 표시됩니다. 도넛형 차트를 Spread에 추가할 수 있으며 차트 스타일은 차트 API를 사용하여 변경할 수 있습니다. 도넛형 차트는 모든 계열을 표시할 수 있으며 각 계열은 데이터 계열을 나타내는 고리로 표시됩니다.
import { Component, NgModule, enableProdMode } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import GC from '@mescius/spread-sheets'; import { SpreadSheetsModule } from '@mescius/spread-sheets-angular'; import '@mescius/spread-sheets-shapes'; import '@mescius/spread-sheets-charts'; import "@mescius/spread-sheets-resources-ko"; GC.Spread.Common.CultureManager.culture("ko-kr"); import './styles.css'; @Component({ selector: 'app-component', templateUrl: 'src/app.component.html' }) export class AppComponent { spread: GC.Spread.Sheets.Workbook; hostStyle = { width: '100%', height: '100%', overflow: 'hidden', float: 'left' }; initSpread($event: any) { this.spread = $event.spread; let spread = this.spread; spread.suspendPaint(); let sheets = spread.sheets; this.initPieSheet(sheets[0]); this.initPieChart(sheets[0]); this.initDoughnutSheet(sheets[1]); this.initDoughnutChart(sheets[1]); spread.resumePaint(); } initPieSheet(sheet: GC.Spread.Sheets.Worksheet) { sheet.name('Pie'); //prepare data for chart let dataArray = [ ["", 'Chrome', 'Firefox', 'IE', 'Safari', 'Edge', 'Opera', 'Other'], ["2017", 0.6360, 0.1304, 0.0834, 0.0589, 0.0443, 0.0223, 0.0246] ]; sheet.setArray(0, 0, dataArray); } initPieChart(sheet: GC.Spread.Sheets.Worksheet) { let chart = sheet.charts.add('PieChart1', GC.Spread.Sheets.Charts.ChartType.pie, 0, 50, 600, 400, "A1:H2"); this.showPieDataLabels(chart); this.changePieStyle(chart); this.changeChartTitle(chart); } changeChartTitle(chart: GC.Spread.Sheets.Charts.Chart) { let title = chart.title(); title.text = "Browser Market Share"; title.fontSize = 18; chart.title(title); } // show dataLabels showPieDataLabels(chart: GC.Spread.Sheets.Charts.Chart) { let dataLabels = chart.dataLabels(); dataLabels.showValue = true; dataLabels.showSeriesName = false; dataLabels.showCategoryName = true; dataLabels.format = "0.00%"; let dataLabelPosition = GC.Spread.Sheets.Charts.DataLabelPosition; dataLabels.position = dataLabelPosition.bestFit; chart.dataLabels(dataLabels); } //change pie color changePieStyle(chart: GC.Spread.Sheets.Charts.Chart) { chart.legend({ position: GC.Spread.Sheets.Charts.LegendPosition.right }); let seriesItem = chart.series().get(0); seriesItem.dataPoints = { 0: { backColor: "rgb(91, 155, 213)" }, 1: { backColor: "rgb(237, 125, 49)" }, 2: { backColor: "rgb(165, 165, 165)" }, 3: { backColor: "rgb(255, 192, 0)" }, 4: { backColor: "rgb(68, 114, 196)" }, 5: { backColor: "rgb(112, 173, 71)" }, 6: { backColor: "rgb(255,20,128)" } } seriesItem.border.width = 3; chart.series().set(0, seriesItem); } initDoughnutSheet(sheet: GC.Spread.Sheets.Worksheet) { sheet.name('Doughnut'); sheet.suspendPaint(); //prepare data for chart let dataArray = [ ["", 'Chrome', 'Firefox', 'IE', 'Safari', 'Edge', 'Opera', 'Other'], ["2014", 0.4966, 0.1801, 0.2455, 0.0470, 0.0, 0.0150, 0.0158], ["2015", 0.5689, 0.1560, 0.1652, 0.0529, 0.0158, 0.0220, 0.0192], ["2016", 0.6230, 0.1531, 0.1073, 0.0464, 0.0311, 0.0166, 0.0225], ["2017", 0.6360, 0.1304, 0.0834, 0.0589, 0.0443, 0.0223, 0.0246] ]; sheet.setArray(0, 0, dataArray); sheet.resumePaint(); } initDoughnutChart(sheet: GC.Spread.Sheets.Worksheet) { let chart = sheet.charts.add('DoughnutChart1', GC.Spread.Sheets.Charts.ChartType.doughnut, 0, 100, 600, 320, "A1:H5"); this.changeDoughnutColor(chart); this.changeDoughnutLegendPosition(chart); this.changeDoughnutHoleSize(chart); this.changeChartTitle(chart); } //change doughnut color changeDoughnutColor(chart: GC.Spread.Sheets.Charts.Chart) { let series = chart.series().get(); for (let i = 0; i < series.length; i++) { let seriesItem = series[i]; seriesItem.dataPoints = { 0: { backColor: "rgb(91, 155, 213)" }, 1: { backColor: "rgb(237, 125, 49)" }, 2: { backColor: "rgb(165, 165, 165)" }, 3: { backColor: "rgb(255, 192, 0)" }, 4: { backColor: "rgb(68, 114, 196)" }, 5: { backColor: "rgb(112, 173, 71)" }, 6: { backColor: "rgb(255,20,128)" } } chart.series().set(i, seriesItem); } } changeDoughnutHoleSize(chart: GC.Spread.Sheets.Charts.Chart) { let seriesItem = chart.series().get(0); seriesItem.doughnutHoleSize = 0.3; chart.series().set(0, seriesItem); } changeDoughnutLegendPosition(chart: GC.Spread.Sheets.Charts.Chart) { chart.legend({ position: GC.Spread.Sheets.Charts.LegendPosition.right }); } } @NgModule({ imports: [BrowserModule, SpreadSheetsModule], declarations: [AppComponent], exports: [AppComponent], bootstrap: [AppComponent] }) export class AppModule {} enableProdMode(); // Bootstrap application with hash style navigation and global services. platformBrowserDynamic().bootstrapModule(AppModule);
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/ko/angular/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <!-- Polyfills --> <script src="$DEMOROOT$/ko/angular/node_modules/core-js/client/shim.min.js"></script> <script src="$DEMOROOT$/ko/angular/node_modules/zone.js/fesm2015/zone.min.js"></script> <!-- SystemJS --> <script src="$DEMOROOT$/ko/angular/node_modules/systemjs/dist/system.js"></script> <script src="systemjs.config.js"></script> <script> // workaround to load 'rxjs/operators' from the rxjs bundle System.import('rxjs').then(function (m) { System.import('@angular/compiler'); System.set(SystemJS.resolveSync('rxjs/operators'), System.newModule(m.operators)); System.import('$DEMOROOT$/ko/lib/angular/license.ts'); System.import('./src/app.component'); }); </script> </head> <body> <app-component></app-component> </body> </html>
<div class="sample-tutorial"> <gc-spread-sheets [hostStyle]="hostStyle" (workbookInitialized)="initSpread($event)"> <gc-worksheet></gc-worksheet> <gc-worksheet></gc-worksheet> </gc-spread-sheets> </div>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; }
(function (global) { System.config({ transpiler: 'ts', typescriptOptions: { tsconfig: true }, meta: { 'typescript': { "exports": "ts" }, '*.css': { loader: 'css' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { 'core-js': 'npm:core-js/client/shim.min.js', 'zone': 'npm:zone.js/fesm2015/zone.min.js', 'rxjs': 'npm:rxjs/dist/bundles/rxjs.umd.min.js', '@angular/core': 'npm:@angular/core/fesm2022', '@angular/common': 'npm:@angular/common/fesm2022/common.mjs', '@angular/compiler': 'npm:@angular/compiler/fesm2022/compiler.mjs', '@angular/platform-browser': 'npm:@angular/platform-browser/fesm2022/platform-browser.mjs', '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/fesm2022/platform-browser-dynamic.mjs', '@angular/common/http': 'npm:@angular/common/fesm2022/http.mjs', '@angular/router': 'npm:@angular/router/fesm2022/router.mjs', '@angular/forms': 'npm:@angular/forms/fesm2022/forms.mjs', 'jszip': 'npm:jszip/dist/jszip.min.js', 'typescript': 'npm:typescript/lib/typescript.js', 'ts': './plugin.js', 'tslib':'npm:tslib/tslib.js', 'css': 'npm:systemjs-plugin-css/css.js', 'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js', 'systemjs-babel-build':'npm:systemjs-plugin-babel/systemjs-babel-browser.js', '@mescius/spread-sheets-shapes': 'npm:@mescius/spread-sheets-shapes/index.js', '@mescius/spread-sheets-charts': 'npm:@mescius/spread-sheets-charts/index.js', '@mescius/spread-sheets': 'npm:@mescius/spread-sheets/index.js', '@mescius/spread-sheets-resources-ko': 'npm:@mescius/spread-sheets-resources-ko/index.js', '@mescius/spread-sheets-angular': 'npm:@mescius/spread-sheets-angular/fesm2020/mescius-spread-sheets-angular.mjs', '@grapecity/jsob-test-dependency-package/react-components': 'npm:@grapecity/jsob-test-dependency-package/react-components/index.js' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'ts' }, rxjs: { defaultExtension: 'js' }, "node_modules": { defaultExtension: 'js' }, "node_modules/@angular": { defaultExtension: 'mjs' }, "@mescius/spread-sheets-angular": { defaultExtension: 'mjs' }, '@angular/core': { defaultExtension: 'mjs', main: 'core.mjs' } } }); })(this);