C# EPPLUS 设置图表的 X 轴刻度标签的角度
本文关键字:EPPLUS 标签 设置 | 更新日期: 2023-09-27 18:34:57
有没有办法使用 EPPLUS 设置图表中轴刻度标签的角度对齐?我正在生成eChartType.XYScatterLinesNoMarks图表,我的X轴(有很多刻度标签(看起来非常混乱。
图表当前在杂乱的 X 轴下的外观:X 轴水平对齐
我希望图表的外观:X 轴 45 度对齐
如果无法设置角度,是否可以将标签的方向设置为垂直方向;即90°?
var chart = chartWorksheet.Drawings.AddChart(entry.Key, eChartType.XYScatterLinesNoMarkers);
chart.XAxis.MaxValue = businessDayDate.ToOADate();
chart.XAxis.MinValue = businessDayDate.AddDays(chartDayThreshold * -1).ToOADate();
chart.XAxis.MajorUnit = 20;
我可以编辑轴的最小、最大、主要/次要单位,但不能编辑标签的对齐方式。
我能够通过保存Epplus ExcelPackage,通过Microsoft.Office.Interop.Excel重新打开文件,然后格式化它来设置45度轴标签对齐方式。不要忘记保存,关闭并在完成后退出。
string fullFileNameWithPath = "C:'Temp'chartSheet.xlsx";
Application excelApp = new Application();
Workbook excelWorkbook = excelApp.Workbooks.Open(fullFileNameWithPath,
0, false, 5, "", "", false, XlPlatform.xlWindows, "",
true, false, 0, true, false, false);
//Get all sheets in workbook.
Sheets excelSheets = excelWorkbook.Worksheets;
//Get main chart sheet.
string currentSheet = "Chart Report";
Worksheet excelWorksheet = (Worksheet)excelSheets.get_Item(currentSheet);
//Access the chart.
ChartObject chartObject2 = (ChartObject)excelWorksheet.ChartObjects("Chart 1");
Microsoft.Office.Interop.Excel.Chart chartPage = chartObject2.Chart;
chartPage.Axes(XlAxisType.xlCategory).TickLabels.Orientation = -45;
excelWorkbook.Save();
excelApp.Workbooks.Close();
excelApp.Quit();
在这种情况下,我发现使用 OpenXML SDK 比使用 Excel Interop 更可取。实际的代码很可怕,但至少它不依赖于打开Excel的隐藏副本,该副本必须实际安装在用户的计算机或服务器上等。
真正的魔力在于添加带有Rotation = 5400000
BodyProperties
的部分。其他一切都是OpenXML样板/垃圾,并使用OpenXML生产力工具自动生成。
using (SpreadsheetDocument document = SpreadsheetDocument.Open(outputFile, true))
{
var chartSheet = document.WorkbookPart.Workbook.Descendants<Sheet>().SingleOrDefault(s => s.Name == "Geo Type Chart");
if (chartSheet == null)
{
return;
}
WorksheetPart wsPart = (WorksheetPart)document.WorkbookPart.GetPartById(chartSheet.Id);
DrawingsPart dp = wsPart.DrawingsPart;
ChartPart cp = dp.ChartParts.FirstOrDefault();
if (cp == null)
{
return;
}
C.ChartSpace chartSpace1 = cp.ChartSpace;
C.Chart chart1=chartSpace1.GetFirstChild<C.Chart>();
C.PlotArea plotArea1=chart1.GetFirstChild<C.PlotArea>();
C.CategoryAxis categoryAxis1=plotArea1.GetFirstChild<C.CategoryAxis>();
C.CrossingAxis crossingAxis1=categoryAxis1.GetFirstChild<C.CrossingAxis>();
C.TextProperties textProperties1 = new C.TextProperties();
A.BodyProperties bodyProperties1 = new A.BodyProperties(){ Rotation = 5400000 };
A.ListStyle listStyle1 = new A.ListStyle();
A.Paragraph paragraph1 = new A.Paragraph();
A.ParagraphProperties paragraphProperties1 = new A.ParagraphProperties();
A.DefaultRunProperties defaultRunProperties1 = new A.DefaultRunProperties();
paragraphProperties1.Append(defaultRunProperties1);
A.EndParagraphRunProperties endParagraphRunProperties1 = new A.EndParagraphRunProperties(){ Language = "en-US" };
paragraph1.Append(paragraphProperties1);
paragraph1.Append(endParagraphRunProperties1);
textProperties1.Append(bodyProperties1);
textProperties1.Append(listStyle1);
textProperties1.Append(paragraph1);
categoryAxis1.InsertBefore(textProperties1,crossingAxis1);
}
对于在
Epplus 框架代码中不存在的 Excel 文件上做一些事情......
您可以使用在打开的 Excel 文件中执行的添加宏。查看此示例代码,用于在图表中旋转 Epplus 中不存在的代码的所有标签数据文本,以便执行此操作。
package.Workbook.CreateVBAProject();
OfficeOpenXml.VBA.ExcelVBAModule excelVbaModule =
package.Workbook.VbaProject.Modules.AddModule("Module1");
System.Text.StringBuilder mac = new System.Text.StringBuilder();
mac.AppendLine("Sub Auto_Start()");
mac.AppendLine("Sheets(2).Select");
mac.AppendLine("ActiveSheet.ChartObjects('"chartWeeklyReport'").Activate");
mac.AppendLine("ActiveChart.FullSeriesCollection(1).DataLabels.Select");
mac.AppendLine("Selection.Position = xlLabelPositionAbove");
mac.AppendLine("Selection.Orientation = xlUpward");
mac.AppendLine("Selection.Position = xlLabelPositionAbove");
mac.AppendLine("End Sub");
excelVbaModule.Code = mac.ToString();
package.Save();
对于创建其他宏,您可以使用Excel中的"记录宏"按钮并创建新宏供您使用