使用 Excel JavaScript API 处理图表中的数据标签

将数据标签添加到 Excel 图表,以提供有关图表重要方面的更好可视化体验。 若要了解有关数据标签的详细信息,请参阅 在图表中添加或删除数据标签

以下代码示例设置本文中使用的示例数据和 自行车部件生产 图表。

async function setup() {
  await Excel.run(async (context) => {
    context.workbook.worksheets.getItemOrNullObject("Sample").delete();
    const sheet = context.workbook.worksheets.add("Sample");

    let salesTable = sheet.tables.add("A1:E1", true);
    salesTable.name = "SalesTable";

    salesTable.getHeaderRowRange().values = [["Product", "Qtr1", "Qtr2", "Qtr3", "Qtr4"]];

    salesTable.rows.add(null, [
      ["Frames", 5000, 7000, 6544, 5377],
      ["Saddles", 400, 323, 276, 1451],
      ["Brake levers", 9000, 8766, 8456, 9812],
      ["Chains", 1550, 1088, 692, 2553],
      ["Mirrors", 225, 600, 923, 344],
      ["Spokes", 6005, 7634, 4589, 8765]
    ]);

    sheet.activate();
    createChart(context);
  });
}

async function createChart(context: Excel.RequestContext) {
  const worksheet = context.workbook.worksheets.getActiveWorksheet();
  const chart = worksheet.charts.add(
    Excel.ChartType.lineMarkers,
    worksheet.getRange("A1:E7"),
    Excel.ChartSeriesBy.rows
  );
  chart.axes.categoryAxis.setCategoryNames(worksheet.getRange("B1:E1"));
  chart.name = "PartChart";

  // Place the chart below sample data.
  chart.top = 125;
  chart.left = 5;
  chart.height = 300;
  chart.width = 450;

  chart.title.text = "Bicycle Part Production";
  chart.legend.position = "Bottom";

  await context.sync();
}

此图显示运行示例代码后图表的显示方式。

没有数据标签的基本折线图的屏幕截图,其中显示了在四个季度内生产的六个不同的自行车部件。

添加数据标签

若要向图表添加数据标签,请获取要更改的数据点系列,并将 属性设置为 hasDataLabelstrue

async function addDataLabels() {
  await Excel.run(async (context) => {
    const worksheet = context.workbook.worksheets.getActiveWorksheet();
    const chart = worksheet.charts.getItem("PartChart");
    await context.sync();

    // Get spokes data series.
    const series = chart.series.getItemAt(5);

    // Turn on data labels and set location.
    series.hasDataLabels = true;
    series.dataLabels.position = Excel.ChartDataLabelPosition.top;
    await context.sync();
  });
}

显示每个数据点数量的数据标签的图表屏幕截图。

设置数据标签大小、形状和文本的格式

可以使用以下 API 更改数据标签的属性。

下面的代码示例演示如何设置数据标签的形状类型、高度和宽度以及字体格式。

 await Excel.run(async (context) => {
    const worksheet = context.workbook.worksheets.getActiveWorksheet();
    const chart = worksheet.charts.getItem("PartChart");
    const series = chart.series.getItemAt(5);

    // Set geometric shape of data labels to cubes.
    series.dataLabels.geometricShapeType = Excel.GeometricShapeType.cube;
    series.points.load("count");
    await context.sync();
    let pointsLoaded = series.points.count;

    // Change height, width, and font size of all data labels.
    for (let j = 0; j < pointsLoaded; j++) {
      series.points.getItemAt(j).dataLabel.setWidth(60);
      series.points.getItemAt(j).dataLabel.setHeight(30);
      series.points.getItemAt(j).dataLabel.format.font.size = 12;
    }

    // Set text of a data label.
    series.points.getItemAt(2).dataLabel.setWidth(80);
    series.points.getItemAt(2).dataLabel.setHeight(50);
    series.points.getItemAt(2).dataLabel.text = "Spokes Qtr3: 4589 ↓";

    await context.sync();
});

在以下屏幕截图中,图表现在包括辐射数据的计数数据标签,并在第三个数据点使用自定义文本。

图表的屏幕截图,其中数据标签设置为其中一个数据标签中的多维数据集、新大小和自定义文本。

还可以更改数据标签中文本的格式。 下面的代码示例演示如何使用 getSubstring 方法获取部分数据标签文本并应用字体格式。

await Excel.run(async (context) => {
    const worksheet = context.workbook.worksheets.getActiveWorksheet();
    const chart = worksheet.charts.getItem("PartChart");
    const series = chart.series.getItemAt(5);

    // Get the "Spokes" data label.
    let label = series.points.getItemAt(2).dataLabel;
    label.load();
    await context.sync();

    // Change border weight of this label.
    label.format.border.weight = 2;
    // Format "Qtr3" as bold and italicized. 
    label.getSubstring(7, 4).font.bold = true;
    label.getSubstring(7, 4).font.italic = true;
    // Format "Spokes" as green.
    label.getSubstring(0, 6).font.color = "green";
    // Format "4589" as red.
    label.getSubstring(12).font.color = "red";
    // Move label up by 15 points.
    label.top = label.top - 15;

    await context.sync();
 });

显示数据标签的图表的屏幕截图,其中辐射设置为绿色,4589 设置为红色,Qtr3 粗体并斜体。

设置引线格式

引线将数据标签连接到其各自的数据点,以便更轻松地查看它们在图表中引用的内容。 使用 showLeaderLines 属性打开前导线。 可以使用 leaderLines.format 属性设置引线的格式。

await Excel.run(async (context) => {
    const worksheet = context.workbook.worksheets.getActiveWorksheet();
    const chart = worksheet.charts.getItem("PartChart");
    const series = chart.series.getItemAt(5);
    
    // Show leader lines.
    series.showLeaderLines = true;
    await context.sync();
    
    // Format leader lines as dotted orange lines with weight 2.
    series.dataLabels.leaderLines.format.line.lineStyle = Excel.ChartLineStyle.dot;
    series.dataLabels.leaderLines.format.line.color = "orange";
    series.dataLabels.leaderLines.format.line.weight = 2;
});

图表的屏幕截图,其中用橙色虚线将数据标签连接到其数据点。

创建标注

标注是使用气泡形指针连接到数据点的数据标签。 标注具有一个定位点,该定位点可从数据点移动到图表上的其他位置。

以下代码示例演示如何更改系列中的数据标签以使用 Excel.GeometricShapeType.wedgeRectCallout。 请注意,先导线处于关闭状态,以避免向同一数据标签显示两个指示器。

 await Excel.run(async (context) => {
    const worksheet = context.workbook.worksheets.getActiveWorksheet();
    const chart = worksheet.charts.getItem("PartChart");
    const series = chart.series.getItemAt(5);

    // Change to a wedge rectangle style callout.
    series.dataLabels.geometricShapeType = Excel.GeometricShapeType.wedgeRectCallout;
    series.showLeaderLines = false;
    await context.sync();
});

图表的屏幕截图,其中数据标签的格式为标注。

以下代码示例演示如何更改数据标签的定位点位置。

await Excel.run(async (context) => {
    const worksheet = context.workbook.worksheets.getActiveWorksheet();
    const chart = worksheet.charts.getItem("PartChart");
    const series = chart.series.getItemAt(5);

    let label = series.points.getItemAt(2).dataLabel;
    let point = series.points.getItemAt(2);
    label.load();
    await context.sync();

    let anchor = label.getTailAnchor();
    anchor.load();
    await context.sync();

    anchor.top = anchor.top - 10;
    anchor.left = 40;
});

此屏幕截图演示了前面的代码示例如何调整第三个数据标签的定位点。

图表的屏幕截图,其中分支数据标签的定位点在原始数据点位置上移和向左移动。

另请参阅