-
Notifications
You must be signed in to change notification settings - Fork 129
[Excel] (Chart) Add leader lines snippet #992
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 6 commits
e0fdfca
2e3fd85
477891c
60b4646
79acde4
56ec8d3
8b47a37
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,188 @@ | ||
order: 17 | ||
id: excel-chart-leader-lines | ||
name: Leader lines | ||
description: Show and hide leader lines for chart labels. | ||
host: EXCEL | ||
api_set: | ||
ExcelApi: '1.19' | ||
script: | ||
content: |- | ||
document.getElementById("setup").addEventListener("click", () => tryCatch(setup)); | ||
document.getElementById("add-data-labels").addEventListener("click", () => tryCatch(addDataLabels)); | ||
document.getElementById("disable-leader-lines").addEventListener("click", () => tryCatch(disableLeaderLines)); | ||
document.getElementById("enable-leader-lines").addEventListener("click", () => tryCatch(enableLeaderLines)); | ||
document.getElementById("change-leader-line-format").addEventListener("click", () => tryCatch(changeLeaderLineFormat)); | ||
|
||
const sheetName = "Sample"; | ||
|
||
async function addDataLabels() { | ||
// This function adds data labels to the chart and positions them to demonstrate leader lines. | ||
await Excel.run(async (context) => { | ||
const sheet = context.workbook.worksheets.getItem(sheetName); | ||
const chart = sheet.charts.getItemAt(0); | ||
const series = chart.series.getItemAt(0); | ||
|
||
// Enable data labels for the series. Leader lines are enabled by default. | ||
series.hasDataLabels = true; | ||
series.points.load("items"); | ||
await context.sync(); | ||
|
||
// Load the top position for each data label. | ||
series.points.items.forEach((point) => point.dataLabel.load("top")); | ||
await context.sync(); | ||
|
||
// Move some data labels to create distance from their chart points. | ||
series.points.items[1].dataLabel.top = series.points.items[1].dataLabel.top - 50; | ||
series.points.items[2].dataLabel.top = series.points.items[2].dataLabel.top + 50; | ||
|
||
// Format the data labels. | ||
series.dataLabels.geometricShapeType = Excel.GeometricShapeType.rectangle; | ||
series.dataLabels.showCategoryName = true; | ||
series.dataLabels.format.border.weight = 1; | ||
|
||
await context.sync(); | ||
}); | ||
} | ||
|
||
async function disableLeaderLines() { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Consider calling this hideLeaderLines (and throughout). Disable implies the leader lines don't work, which sort of means they are hidden, but it's also a bit ambiguous and doesn't match the UI button. |
||
// This function disables leader lines for chart data labels. | ||
await Excel.run(async (context) => { | ||
const sheet = context.workbook.worksheets.getItem(sheetName); | ||
const chart = sheet.charts.getItemAt(0); | ||
const series = chart.series.getItemAt(0); | ||
const dataLabels = series.dataLabels; | ||
|
||
// Disable leader lines. | ||
dataLabels.showLeaderLines = false; | ||
|
||
await context.sync(); | ||
}); | ||
} | ||
|
||
async function enableLeaderLines() { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Similar suggestion as previous. Consider using showLeaderLines (or showChartLeaderLines if worried about same names as the property later). |
||
// This function enables leader lines for chart data labels. | ||
await Excel.run(async (context) => { | ||
const sheet = context.workbook.worksheets.getItem(sheetName); | ||
const chart = sheet.charts.getItemAt(0); | ||
const series = chart.series.getItemAt(0); | ||
const dataLabels = series.dataLabels; | ||
|
||
// Load the current leader lines setting. | ||
dataLabels.load("showLeaderLines"); | ||
await context.sync(); | ||
|
||
// Enable leader lines. | ||
dataLabels.showLeaderLines = true; | ||
|
||
await context.sync(); | ||
}); | ||
} | ||
|
||
async function changeLeaderLineFormat() { | ||
// This function changes the format of leader lines. | ||
// It adjusts color, weight, and line style. | ||
await Excel.run(async (context) => { | ||
const sheet = context.workbook.worksheets.getItem(sheetName); | ||
const chart = sheet.charts.getItemAt(0); | ||
const series = chart.series.getItemAt(0); | ||
const dataLabels = series.dataLabels; | ||
const lineFormat = dataLabels.leaderLines.format; | ||
|
||
// Set leader line formatting properties. | ||
lineFormat.line.color = "blue"; | ||
lineFormat.line.weight = 2; | ||
lineFormat.line.lineStyle = Excel.ChartLineStyle.dot; | ||
|
||
await context.sync(); | ||
}); | ||
} | ||
|
||
/** Create sample data and a line chart for the leader lines demo. */ | ||
async function setup() { | ||
await Excel.run(async (context) => { | ||
context.workbook.worksheets.getItemOrNullObject(sheetName).delete(); | ||
const sheet = context.workbook.worksheets.add(sheetName); | ||
|
||
// Add sample data to the worksheet. | ||
const dataRange = sheet.getRange("A1:C4"); | ||
dataRange.values = sampleData; | ||
|
||
// Create a line chart. | ||
const chart = sheet.charts.add(Excel.ChartType.line, dataRange); | ||
chart.title.text = "Sales Quantity"; | ||
|
||
sheet.activate(); | ||
await context.sync(); | ||
}); | ||
} | ||
|
||
/** Default helper for invoking an action and handling errors. */ | ||
async function tryCatch(callback) { | ||
try { | ||
await callback(); | ||
} catch (error) { | ||
// Note: In a production add-in, you'd want to notify the user through your add-in's UI. | ||
console.error(error); | ||
} | ||
} | ||
|
||
/** Sample data for the chart. */ | ||
const sampleData = [ | ||
["Type", "Product A", "Product B"], | ||
["Q1", 15, 20], | ||
["Q2", 22, 15], | ||
["Q3", 33, 47] | ||
]; | ||
language: typescript | ||
template: | ||
content: |- | ||
<section class="ms-Fabric ms-font-m"> | ||
<p>This sample shows how to add leader lines for data labels on your charts.</p> | ||
</section> | ||
<section class="ms-Fabric setup ms-font-m"> | ||
<h3>Set up</h3> | ||
<button id="setup" class="ms-Button"> | ||
<span class="ms-Button-label">Create a chart</span> | ||
</button> | ||
</section> | ||
<section class="ms-Fabric samples ms-font-m"> | ||
<h3>Try it out</h3> | ||
<button id="add-data-labels" class="ms-Button"> | ||
<span class="ms-Button-label">Add data labels</span> | ||
</button> | ||
</section> | ||
<section class="ms-Fabric samples ms-font-m"> | ||
<button id="disable-leader-lines" class="ms-Button"> | ||
<span class="ms-Button-label">Hide leader lines</span> | ||
</button> | ||
</section> | ||
<section class="ms-Fabric samples ms-font-m"> | ||
<button id="enable-leader-lines" class="ms-Button"> | ||
<span class="ms-Button-label">Show leader lines</span> | ||
</button> | ||
</section> | ||
<section class="ms-Fabric samples ms-font-m"> | ||
<button id="change-leader-line-format" class="ms-Button"> | ||
<span class="ms-Button-label">Change format of the leader lines</span> | ||
</button> | ||
</section> | ||
language: html | ||
style: | ||
content: |- | ||
section.samples { | ||
margin-top: 20px; | ||
} | ||
|
||
section.samples .ms-Button, section.setup .ms-Button { | ||
display: block; | ||
margin-bottom: 5px; | ||
margin-left: 20px; | ||
min-width: 80px; | ||
} | ||
language: css | ||
libraries: |- | ||
https://appsforoffice.microsoft.com/lib/1/hosted/office.js | ||
https://appsforoffice.microsoft.com/lib/1/hosted/office.d.ts | ||
|
||
https://unpkg.com/[email protected]/dist/css/fabric.min.css | ||
https://unpkg.com/[email protected]/dist/css/fabric.components.min.css |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This would be a little more readable.