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;

我可以编辑轴的最小、最大、主要/次要单位,但不能编辑标签的对齐方式。

C# EPPLUS 设置图表的 X 轴刻度标签的角度

我能够通过保存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中的"记录宏"按钮并创建新宏供您使用