1+ order : 16
2+ id : excel-chart-data-labels
3+ name : Data labels
4+ description : Add and style data labels for your charts.
5+ host : EXCEL
6+ api_set :
7+ ExcelApi : ' 1.19'
8+ script :
9+ content : |-
10+ document.getElementById("setup").addEventListener("click", () => tryCatch(setup));
11+ document.getElementById("add-data-labels").addEventListener("click", () => tryCatch(addDataLabels));
12+ document.getElementById("style-data-label-substrings").addEventListener("click", () => tryCatch(styleDataLabelSubstrings));
13+ document.getElementById("change-label-to-round-rectangle").addEventListener("click", () => tryCatch(changeLabelShapesToRoundRectangle));
14+ document.getElementById("change-label-to-assorted").addEventListener("click", () => tryCatch(changeLabelShapesToAssorted));
15+
16+ // Define the worksheet name for the sample.
17+ const sheetName = "Sample";
18+
19+ async function addDataLabels() {
20+ // This function adds data labels to specific chart points
21+ // and sets their text and position.
22+ await Excel.run(async (context) => {
23+ const sheet = context.workbook.worksheets.getItem(sheetName);
24+ const chart = sheet.charts.getItemAt(0);
25+ await context.sync();
26+
27+ const series = chart.series.getItemAt(0);
28+ series.points.load("dataLabel");
29+ await context.sync();
30+
31+ // Define properties for data label positioning and shape.
32+ const labelProperties = [
33+ {
34+ top: 70,
35+ geometricShapeType: Excel.GeometricShapeType.rectangle
36+ },
37+ {
38+ top: 200,
39+ geometricShapeType: Excel.GeometricShapeType.rectangle
40+ }
41+ ];
42+
43+ // Add data labels to specific chart points and set their text and properties.
44+ for (let i = 0; i < dataLabelInfo.length; i++) {
45+ const point = series.points.getItemAt(dataLabelInfo[i].index);
46+ point.hasDataLabel = true;
47+
48+ const dataLabel = point.dataLabel;
49+ dataLabel.text = dataLabelInfo[i].news;
50+ dataLabel.set(labelProperties[i]);
51+ }
52+ await context.sync();
53+ });
54+ }
55+
56+ async function styleDataLabelSubstrings() {
57+ // This function styles substrings within data label text using font formatting.
58+ await Excel.run(async (context) => {
59+ const sheet = context.workbook.worksheets.getItem(sheetName);
60+ const chart = sheet.charts.getItemAt(0);
61+ await context.sync();
62+
63+ const series = chart.series.getItemAt(0);
64+ series.load("points");
65+ await context.sync();
66+
67+ series.points.load("items");
68+ await context.sync();
69+
70+ // Style a substring in the first data label.
71+ let searchString = "sports";
72+ let dataLabel = series.points.getItemAt(dataLabelInfo[0].index).dataLabel.load("text");
73+ await context.sync();
74+ let substringStart = dataLabel.text.indexOf(searchString);
75+ let subLabel = dataLabel.getSubstring(substringStart, searchString.length);
76+ subLabel.font.size = 13;
77+ subLabel.font.bold = true;
78+
79+ // Style a substring in the second data label.
80+ searchString = "'Titanic'";
81+ dataLabel = series.points.getItemAt(dataLabelInfo[1].index).dataLabel.load("text");
82+ await context.sync();
83+
84+ substringStart = dataLabel.text.indexOf(searchString);
85+ subLabel = dataLabel.getSubstring(substringStart, searchString.length);
86+ subLabel.font.name = "Calibri";
87+ subLabel.font.size = 13;
88+ subLabel.font.italic = true;
89+ subLabel.font.color = "blue";
90+ await context.sync();
91+ });
92+ }
93+
94+ async function changeLabelShapesToRoundRectangle() {
95+ // This function changes the geometric shape of data labels to round rectangles.
96+ await Excel.run(async (context) => {
97+ const sheet = context.workbook.worksheets.getItem(sheetName);
98+ const chart = sheet.charts.getItemAt(0);
99+ await context.sync();
100+
101+ const series = chart.series.getItemAt(0);
102+ series.load("*");
103+ await context.sync();
104+
105+ series.points.load("*");
106+ await context.sync();
107+
108+ // Set both data labels to round rectangle shape.
109+ let dataLabel = series.points.getItemAt(dataLabelInfo[0].index).dataLabel;
110+ dataLabel.geometricShapeType = Excel.GeometricShapeType.roundRectangle;
111+
112+ dataLabel = series.points.getItemAt(dataLabelInfo[1].index).dataLabel;
113+ dataLabel.geometricShapeType = Excel.GeometricShapeType.roundRectangle;
114+ await context.sync();
115+ });
116+ }
117+
118+ async function changeLabelShapesToAssorted() {
119+ // This function changes data labels to different geometric shapes with custom formatting.
120+ await Excel.run(async (context) => {
121+ const sheet = context.workbook.worksheets.getItem(sheetName);
122+ const chart = sheet.charts.getItemAt(0);
123+ await context.sync();
124+
125+ const series = chart.series.getItemAt(0);
126+
127+ // Set first data label to snip1Rectangle shape.
128+ let dataLabel = series.points.getItemAt(dataLabelInfo[0].index).dataLabel;
129+ dataLabel.geometricShapeType = Excel.GeometricShapeType.snip1Rectangle;
130+
131+ // Set second data label to snip2DiagonalRectangle shape with light green fill.
132+ dataLabel = series.points.getItemAt(dataLabelInfo[1].index).dataLabel;
133+ dataLabel.geometricShapeType = Excel.GeometricShapeType.snip2DiagonalRectangle;
134+ dataLabel.format.fill.setSolidColor("90EE90");
135+ await context.sync();
136+ });
137+ }
138+
139+ /** Create sample data and a line chart for the data labels demo. */
140+ async function setup() {
141+ await Excel.run(async (context) => {
142+ context.workbook.worksheets.getItemOrNullObject(sheetName).delete();
143+ const sheet = context.workbook.worksheets.add(sheetName);
144+
145+ // Add sample data to the worksheet.
146+ const dataRange = sheet.getRange("A1:B32");
147+ dataRange.values = sampleData;
148+
149+ sheet.activate();
150+ await context.sync();
151+
152+ // Create a line chart with markers.
153+ const chart = sheet.charts.add(Excel.ChartType.lineMarkers, dataRange);
154+
155+ // Position and format the chart.
156+ chart.setPosition("D4", "Q25");
157+ chart.legend.visible = false;
158+ chart.title.text = "Product price";
159+ chart.title.format.font.size = 20;
160+ chart.axes.valueAxis.minimum = 80;
161+
162+ await context.sync();
163+ });
164+ }
165+
166+ /** Default helper for invoking an action and handling errors. */
167+ async function tryCatch(callback) {
168+ try {
169+ await callback();
170+ } catch (error) {
171+ // Note: In a production add-in, you'd want to notify the user through your add-in's UI.
172+ console.error(error);
173+ }
174+ }
175+
176+ // Save chart data labels as an object for use throughout the sample.
177+ const dataLabelInfo = [
178+ {
179+ index: 11,
180+ date: "7/12/2023",
181+ news: "The city holds a sports event."
182+ },
183+ {
184+ index: 20,
185+ date: "7/21/2023",
186+ news: "The movie 'Titanic' returns to the cinema."
187+ }
188+ ];
189+
190+ // Sample data for the chart.
191+ const sampleData = [
192+ ["Date", "Price"],
193+ ["7/1/2023", 100],
194+ ["7/2/2023", 96.71],
195+ ["7/3/2023", 103.24],
196+ ["7/4/2023", 109.09],
197+ ["7/5/2023", 113.68],
198+ ["7/6/2023", 118.68],
199+ ["7/7/2023", 123.2],
200+ ["7/8/2023", 135.05],
201+ ["7/9/2023", 138.68],
202+ ["7/10/2023", 129.63],
203+ ["7/11/2023", 130.85],
204+ ["7/12/2023", 135.71],
205+ ["7/13/2023", 124.83],
206+ ["7/14/2023", 118.94],
207+ ["7/15/2023", 119.63],
208+ ["7/16/2023", 127.2],
209+ ["7/17/2023", 113.98],
210+ ["7/18/2023", 110.32],
211+ ["7/19/2023", 119.3],
212+ ["7/20/2023", 120.36],
213+ ["7/21/2023", 111.88],
214+ ["7/22/2023", 118.88],
215+ ["7/23/2023", 124.37],
216+ ["7/24/2023", 119.53],
217+ ["7/25/2023", 133.42],
218+ ["7/26/2023", 125.67],
219+ ["7/27/2023", 135.82],
220+ ["7/28/2023", 137.87],
221+ ["7/29/2023", 138.9],
222+ ["7/30/2023", 139.36],
223+ ["7/31/2023", 138.75]
224+ ];
225+ language : typescript
226+ template :
227+ content : |-
228+ <section class="ms-Fabric ms-font-m">
229+ <p>This sample shows how to create data labels for charts and adjust the font and appearance of those labels.</p>
230+ </section>
231+ <section class="ms-Fabric setup ms-font-m">
232+ <h3>Set up</h3>
233+ <button id="setup" class="ms-Button">
234+ <span class="ms-Button-label">Add data and create a chart</span>
235+ </button>
236+ </section>
237+ <section class="ms-Fabric samples ms-font-m">
238+ <h3>Add data labels to the chart</h3>
239+ <button id="add-data-labels" class="ms-Button">
240+ <span class="ms-Button-label">Add data labels</span>
241+ </button>
242+ </section>
243+ <section class="ms-Fabric samples ms-font-m">
244+ <h3>Style data labels</h3>
245+ <button id="style-data-label-substrings" class="ms-Button">
246+ <span class="ms-Button-label">Style data label substrings</span>
247+ </button>
248+ </section>
249+ <section class="ms-Fabric samples ms-font-m">
250+ <button id="change-label-to-round-rectangle" class="ms-Button">
251+ <span class="ms-Button-label">Change data label shapes</span>
252+ </button>
253+ </section>
254+ <section class="ms-Fabric samples ms-font-m">
255+ <button id="change-label-to-assorted" class="ms-Button">
256+ <span class="ms-Button-label">Change data label shapes</span>
257+ </button>
258+ </section>
259+ language : html
260+ style :
261+ content : |-
262+ section.samples {
263+ margin-top: 20px;
264+ }
265+
266+ section.samples .ms-Button, section.setup .ms-Button {
267+ display: block;
268+ margin-bottom: 5px;
269+ margin-left: 20px;
270+ min-width: 80px;
271+ }
272+ language : css
273+ libraries : |-
274+ https://appsforoffice.microsoft.com/lib/1/hosted/office.js
275+ https://appsforoffice.microsoft.com/lib/1/hosted/office.d.ts
276+
277+ https://unpkg.com/office-ui-fabric-core@11.1.0/dist/css/fabric.min.css
278+ https://unpkg.com/office-ui-fabric-js@1.5.0/dist/css/fabric.components.min.css
0 commit comments