如何用EPPLUS/Open XML设置XY散点线图标签垂直(45°)方向?
解决EPPlus散点折线图X轴标签垂直显示的问题
用EPPlus生成eChartType.XYScatterLinesNoMarkers类型图表后,若想通过OpenXML设置X轴标签垂直以避免拥挤,直接参考普通图表的分类轴设置方案会出现空引用错误——因为散点图的X轴是数值轴(ValueAxis),而非普通图表的分类轴(CategoryAxis)。
以下是可行的代码实现:
using System.IO; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Drawing.Charts; using OfficeOpenXml; using OfficeOpenXml.Drawing.Chart; // 加载目标Excel文件 using (var package = new ExcelPackage(new FileInfo("你的文件路径.xlsx"))) { var worksheet = package.Workbook.Worksheets["目标工作表名"]; var scatterChart = worksheet.Drawings["目标图表名"] as ExcelScatterChart; // 将EPPlus包写入内存流,用于OpenXML操作 using (var stream = new MemoryStream()) { package.SaveAs(stream); stream.Position = 0; using (var doc = SpreadsheetDocument.Open(stream, true)) { // 获取对应工作表的ChartPart var chartPart = doc.WorkbookPart.WorksheetParts.First(wp => wp.Worksheet.Name == "目标工作表名") .DrawingsPart.ChartParts.First(); var chart = chartPart.ChartSpace.Chart; // 定位散点图的X轴(ValueAxis类型) var xValueAxis = chart.Descendants<ValueAxis>().FirstOrDefault(axis => axis.AxisId?.Val == scatterChart.XAxis.AxisId); if (xValueAxis != null) { // 若TickLabels不存在则创建 var tickLabels = xValueAxis.TickLabels ?? new TickLabels(); if (xValueAxis.TickLabels == null) { xValueAxis.Append(tickLabels); } // 设置标签旋转为90度(垂直显示) tickLabels.Rotation = new Rotation { Val = 90 }; } chartPart.ChartSpace.Save(); } // 将修改后的内容写回文件 using (var fileStream = new FileStream("你的文件路径.xlsx", FileMode.Create)) { stream.WriteTo(fileStream); } } }
关键说明
- 散点图的X轴属于
ValueAxis类型,而非普通柱状图/折线图的CategoryAxis,这是之前出现空引用的核心原因。 - 代码中通过
AxisId匹配EPPlus生成的X轴,确保定位准确;若未设置轴ID,也可通过顺序(第一个ValueAxis)定位。 - 设置
Rotation.Val = 90即可让标签垂直显示,解决拥挤问题。
内容的提问来源于stack exchange,提问作者signora
相关产品推荐
相关产品推荐

