折线图

在worksheet中,以行或者列的方式来组织的数据也可以用折线图来很好的表示。在折线图中,分类数据沿着水平轴均匀分布,值数据沿着垂直轴均匀分布。折线图可以在均匀的按比例缩放的坐标轴上显示一段时间内的连续数据,因此非常适合用来显示相等的时间间隔里(如月、季度或者财年)数据的变化趋势。

SpreadJS 支持折线图、堆积折线图、百分比堆积折线图、数据点折线图、数据点堆积折线图、数据点百分比堆积折线图。通过 GC.Spread.Sheets.Charts.ChartType.line 来指定chartType为折线图。 您可以将折线图添加到Spread,并使用图表API更改其样式(如平滑线条) 折线图也可以是堆积折线图、百分比堆积折线图、数据点折线图、数据点堆积折线图、数据点百分比堆积折线图。使用 GC.Spread.Sheets.Charts.ChartType.lineStacked , GC.Spread.Sheets.Charts.ChartType.lineStacked100, GC.Spread.Sheets.Charts.ChartType.lineMarkers, GC.Spread.Sheets.Charts.ChartType.lineMarkersStacked, GC.Spread.Sheets.Charts.ChartType.lineMarkersStacked100 来指定这两种柱形图 你可以自定制图表中系列标记的颜色,形状以及标记边框: 折线图和数据点折线图: 折线图在显示时可以带有指示单个数据值的标记,也可以不带标记,可显示一段时间或均匀分布的类别的趋势,特别是你有多个数据点,并且这些数据点的出现顺序非常重要时。当有许多类别或值的大小接近时,请使用无数据点折线图。 堆积折线图和数据点堆积折线图: 堆积折线图显示时可带有标记以指示各个数据值,也可以不带标记,可显示每个值所占大小随着时间或均匀分布的类别而变化的趋势。 百分比堆积折线图和数据点百分比堆积折线图: 百分比堆积折线图显示时可带有标记以指示各个数据值,也可以不带标记,可显示每个值所占的百分比随时间或均匀分布的类别而变化的趋势。如果有许多类别或值大小接近,请使用无数据点百分比堆积折线图。
import * as React from 'react'; import { createRoot } from 'react-dom/client'; import './styles.css'; import { AppFunc } from './app-func'; // import { App } from './app-class'; // 1. Functional Component sample createRoot(document.getElementById('app')).render(<AppFunc />); // 2. Class Component sample // createRoot(document.getElementById('app')).render(<App />);
import * as React from 'react'; import GC from '@grapecity-software/spread-sheets'; import { SpreadSheets, Worksheet } from '@grapecity-software/spread-sheets-react'; import '@grapecity-software/spread-sheets-shapes'; import '@grapecity-software/spread-sheets-charts'; import '@grapecity-software/spread-sheets-resources-zh'; GC.Spread.Common.CultureManager.culture("zh-cn"); export function AppFunc() { let spread = null; const initSpread = (currSpread) => { spread = currSpread; let chartType = [{ type: GC.Spread.Sheets.Charts.ChartType.line, desc: "line", }, { type: GC.Spread.Sheets.Charts.ChartType.lineStacked, desc: "lineStacked", }, { type: GC.Spread.Sheets.Charts.ChartType.lineStacked100, desc: "lineStacked100", }, { type: GC.Spread.Sheets.Charts.ChartType.lineMarkers, desc: "lineMarkers", withMarker: true, }, { type: GC.Spread.Sheets.Charts.ChartType.lineMarkersStacked, desc: "lineMarkersStacked", withMarker: true, }, { type: GC.Spread.Sheets.Charts.ChartType.lineMarkersStacked100, desc: "lineMarkersStacked100", withMarker: true, }]; spread.suspendPaint(); let sheets = spread.sheets; for (let i = 0; i < chartType.length; i++) { let sheet = sheets[i]; initSheet(sheet, chartType[i].desc); initChart(sheet, chartType[i].type, chartType[i].withMarker);//add chart } spread.options.tabStripRatio = 0.8; spread.resumePaint(); } const initSheet = (sheet, sheetName) => { sheet.name(sheetName); //prepare data for chart let dataArray = [ ["", '2012', '2013', '2014', '2015', '2016', '2017'], ["Chrome", 0.3782, 0.5663, 0.4966, 0.6689, 0.4230, 0.6360], ["FireFox", 0.1284, 0.2030, 0.2801, 0.2560, 0.1531, 0.3304], ["IE", 0.3214, 0.2491, 0.2455, 0.1652, 0.2073, 0.0834], ]; sheet.setArray(0, 0, dataArray); } const initChart = (sheet, chartType, marker) => { //add chart let chart = sheet.charts.add((sheet.name() + 'Chart1'), chartType, 10, 85, 450, 350, "A1:G4", GC.Spread.Sheets.Charts.RowCol.rows); changeChartLegend(chart); changeChartArea(chart); changChartDataLabels(chart); changeGridLines(chart); changeLineStyle(chart, false); changeChartAxes(chart); changeChartTitle(chart); if (marker) { changeMarker(chart); } chart = sheet.charts.add((sheet.name() + 'Chart2'), chartType, 470, 85, 450, 350, "A1:G4", GC.Spread.Sheets.Charts.RowCol.rows); changeChartLegend(chart); changeChartArea(chart); changChartDataLabels(chart); changeGridLines(chart); changeLineStyle(chart, true); changeChartAxes(chart); changeChartTitle(chart); if (marker) { changeMarker(chart); } } const changeChartTitle = (chart) => { let title = chart.title(); title.text = "Browser Market Share"; title.fontSize = 18; chart.title(title); } //change legend position const changeChartLegend = (chart) => { let legend = chart.legend(); legend.visible = true; let legendPosition = GC.Spread.Sheets.Charts.LegendPosition; legend.position = legendPosition.bottom; chart.legend(legend); } //change backColor const changeChartArea = (chart) => { let chartArea = chart.chartArea(); chartArea.fontSize = 14; chart.chartArea(chartArea); } // show dataLabels const changChartDataLabels = (chart) => { let dataLabels = chart.dataLabels(); dataLabels.showValue = true; dataLabels.showSeriesName = false; dataLabels.showCategoryName = false; dataLabels.format = "0%"; let dataLabelPosition = GC.Spread.Sheets.Charts.DataLabelPosition; dataLabels.position = dataLabelPosition.above; chart.dataLabels(dataLabels); } // hide gridLines const changeGridLines = (chart) => { let gridLinesAxes = chart.axes(); gridLinesAxes.primaryValue.min = null; chart.axes(gridLinesAxes); } //change legend position const changeChartAxes = (chart) => { chart.axes({ primaryValue: { format: "0%" } }); } // change line style const changeLineStyle = (chart, smooth) => { let series = chart.series().get(); let seriesItem; for (let i = 0; i < series.length; i++) { seriesItem = series[i]; seriesItem.border.width = 2; seriesItem.smooth = smooth; chart.series().set(i, seriesItem); } } // change Marker const changeMarker = (chart) => { let preSet = [ { fill: "", shape: 0 /** circle */, size: 7, border: { color: "blue", width: 1 } }, { fill: "", shape: 8/** star */, size: 9, border: { color: "black", width: 1 } }, { fill: "yellow", shape: 2 /** diamond */, size: 7, border: { color: "red", width: 2 } }, ]; let series = chart.series().get(); let seriesItem; for (let i = 0; i < series.length; i++) { seriesItem = series[i]; seriesItem.symbol = preSet[i]; chart.series().set(i, seriesItem); } } return (<div class="sample-tutorial"> <div class="sample-spreadsheets"> <SpreadSheets workbookInitialized={spread => initSpread(spread)}> <Worksheet /> <Worksheet /> <Worksheet /> <Worksheet /> <Worksheet /> <Worksheet /> </SpreadSheets> </div> </div>); }
import * as React from 'react'; import GC from '@grapecity-software/spread-sheets'; import { SpreadSheets, Worksheet } from '@grapecity-software/spread-sheets-react'; import '@grapecity-software/spread-sheets-shapes'; import '@grapecity-software/spread-sheets-charts'; import '@grapecity-software/spread-sheets-resources-zh'; GC.Spread.Common.CultureManager.culture("zh-cn"); const Component = React.Component; export class App extends Component { constructor(props) { super(props); this.spread = null; } render() { return (<div class="sample-tutorial"> <div class="sample-spreadsheets"> <SpreadSheets workbookInitialized={spread => this.initSpread(spread)}> <Worksheet/> <Worksheet/> <Worksheet/> <Worksheet/> <Worksheet/> <Worksheet/> </SpreadSheets> </div> </div>); } initSpread(spread) { this.spread = spread; let chartType = [{ type: GC.Spread.Sheets.Charts.ChartType.line, desc: "line", }, { type: GC.Spread.Sheets.Charts.ChartType.lineStacked, desc: "lineStacked", }, { type: GC.Spread.Sheets.Charts.ChartType.lineStacked100, desc: "lineStacked100", }, { type: GC.Spread.Sheets.Charts.ChartType.lineMarkers, desc: "lineMarkers", withMarker: true, }, { type: GC.Spread.Sheets.Charts.ChartType.lineMarkersStacked, desc: "lineMarkersStacked", withMarker: true, }, { type: GC.Spread.Sheets.Charts.ChartType.lineMarkersStacked100, desc: "lineMarkersStacked100", withMarker: true, }]; spread.suspendPaint(); let sheets = spread.sheets; for (let i = 0; i < chartType.length; i++) { let sheet = sheets[i]; this.initSheet(sheet, chartType[i].desc); this.initChart(sheet, chartType[i].type, chartType[i].withMarker);//add chart } spread.options.tabStripRatio = 0.8; spread.resumePaint(); } initSheet(sheet, sheetName) { sheet.name(sheetName); //prepare data for chart let dataArray = [ ["", '2012', '2013', '2014', '2015', '2016', '2017'], ["Chrome", 0.3782, 0.5663, 0.4966, 0.6689, 0.4230, 0.6360], ["FireFox", 0.1284, 0.2030, 0.2801, 0.2560, 0.1531, 0.3304], ["IE", 0.3214, 0.2491, 0.2455, 0.1652, 0.2073, 0.0834], ]; sheet.setArray(0, 0, dataArray); } initChart(sheet, chartType, marker) { //add chart let chart = sheet.charts.add((sheet.name() + 'Chart1'), chartType, 10, 85, 450, 350, "A1:G4", GC.Spread.Sheets.Charts.RowCol.rows); this.changeChartLegend(chart); this.changeChartArea(chart); this.changChartDataLabels(chart); this.changeGridLines(chart); this.changeLineStyle(chart, false); this.changeChartAxes(chart); this.changeChartTitle(chart); if (marker) { this.changeMarker(chart); } chart = sheet.charts.add((sheet.name() + 'Chart2'), chartType, 470, 85, 450, 350, "A1:G4", GC.Spread.Sheets.Charts.RowCol.rows); this.changeChartLegend(chart); this.changeChartArea(chart); this.changChartDataLabels(chart); this.changeGridLines(chart); this.changeLineStyle(chart, true); this.changeChartAxes(chart); this.changeChartTitle(chart); if (marker) { this.changeMarker(chart); } } changeChartTitle(chart) { let title = chart.title(); title.text = "Browser Market Share"; title.fontSize = 18; chart.title(title); } //change legend position changeChartLegend(chart) { let legend = chart.legend(); legend.visible = true; let legendPosition = GC.Spread.Sheets.Charts.LegendPosition; legend.position = legendPosition.bottom; chart.legend(legend); } //change backColor changeChartArea(chart) { let chartArea = chart.chartArea(); chartArea.fontSize = 14; chart.chartArea(chartArea); } // show dataLabels changChartDataLabels(chart) { let dataLabels = chart.dataLabels(); dataLabels.showValue = true; dataLabels.showSeriesName = false; dataLabels.showCategoryName = false; dataLabels.format = "0%"; let dataLabelPosition = GC.Spread.Sheets.Charts.DataLabelPosition; dataLabels.position = dataLabelPosition.above; chart.dataLabels(dataLabels); } // hide gridLines changeGridLines(chart) { let gridLinesAxes = chart.axes(); gridLinesAxes.primaryValue.min = null; chart.axes(gridLinesAxes); } //change legend position changeChartAxes(chart) { chart.axes({primaryValue:{format:"0%"}}); } // change line style changeLineStyle(chart, smooth) { let series = chart.series().get(); let seriesItem; for (let i = 0; i < series.length; i++) { seriesItem = series[i]; seriesItem.border.width = 2; seriesItem.smooth = smooth; chart.series().set(i, seriesItem); } } // change Marker changeMarker(chart) { let preSet = [ { fill: "", shape: 0 /** circle */, size: 7, border: { color: "blue", width: 1 } }, { fill: "", shape: 8/** star */, size: 9, border: { color: "black", width: 1 } }, { fill: "yellow", shape: 2 /** diamond */, size: 7, border: { color: "red", width: 2 } }, ]; let series = chart.series().get(); let seriesItem; for (let i = 0; i < series.length; i++) { seriesItem = series[i]; seriesItem.symbol = preSet[i]; chart.series().set(i, seriesItem); } } }
<!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$/zh/react/node_modules/@grapecity-software/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <!-- SystemJS --> <script src="$DEMOROOT$/zh/react/node_modules/systemjs/dist/system.src.js"></script> <script src="systemjs.config.js"></script> <script> System.import('$DEMOROOT$/zh/lib/react/license.js').then(function() { System.import('./src/app'); }); </script> </head> <body> <div id="app"></div> </body> </html>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: 100%; height:100%; overflow: hidden; float: left; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } #app { height: 100%; }
(function(global) { System.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true, react: true }, meta: { '*.css': { loader: 'css' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { '@grapecity-software/spread-sheets-shapes': 'npm:@grapecity-software/spread-sheets-shapes/index.js', '@grapecity-software/spread-sheets-charts': 'npm:@grapecity-software/spread-sheets-charts/index.js', '@grapecity-software/spread-sheets': 'npm:@grapecity-software/spread-sheets/index.js', '@grapecity-software/spread-sheets-resources-zh': 'npm:@grapecity-software/spread-sheets-resources-zh/index.js', '@grapecity-software/spread-sheets-react': 'npm:@grapecity-software/spread-sheets-react/index.js', '@grapecity/jsob-test-dependency-package/react-components': 'npm:@grapecity/jsob-test-dependency-package/react-components/index.js', 'react': 'npm:react/cjs/react.production.js', 'react-dom': 'npm:react-dom/cjs/react-dom.production.js', 'react-dom/client': 'npm:react-dom/cjs/react-dom-client.production.js', 'scheduler': 'npm:scheduler/cjs/scheduler.production.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' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'jsx' }, "node_modules": { defaultExtension: 'js' }, } }); })(this);