2016-02-17 259 views
1

有沒有辦法使用EPPLUS來設置圖表中的軸刻度標籤的角度對齊?我正在生成eChartType.XYScatterLinesNoMarkers圖表,我的X軸(有很多刻度標籤)看起來非常混亂。C#EPPLUS設置圖表的X軸刻度標籤的角度

如何圖表目前看起來是一個雜亂的X軸: X axis horizontal alignment

我想怎麼圖表看: X axis 45 degree alignment

如果這是不可能的設置角度,是有可能設置標籤的方向爲垂直方向;即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; 

我能夠編輯最小值,最大值,主要/次要軸的單位而不是標籤的對齊方式。

+0

不要以爲在Epplus中有一個選項。你將不得不通過XML添加它,或者使用另一個庫,我害怕。路徑爲'c:chartSpace/c:chart/c:plotArea/c:valAx/c:txPr/a:bodyPr'並將該屬性添加到'rot =「2700000」'。 – Ernie

+0

謝謝@Ernie,它很糟糕,這在Epplus中不可用。我檢查了一些其他帖子,但找不到任何東西。它看起來像這樣做的唯一方法是通過'package.save'保存'ExcelPackage包',並按照您的建議或通過'Microsoft.Office.Interop.Excel'通過XML重新打開和格式化工作表。我將發佈這個問題的答案,以顯示我是如何使用'Microsoft.Office.Interop.Excel'完成的。 – Nikita93

回答

1

我能夠通過保存Epplus ExcelPackage來設置45度軸標籤對齊,通過Microsoft.Office.Interop.Excel重新打開文件,然後對其進行格式化。不要忘記保存,關閉並在完成後退出。

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(); 
-1

對於有些事情做對的Excel文件,在Epplus框架代碼不存在...

您可以使用添加宏,在打開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和供您使用

0

在類似案例,創建新宏,我發現使用的OpenXML SDK最好使用Excel互操作。實際的代碼是可怕的,但至少它不依賴於打開Excel的隱藏副本,必須實際安裝在用戶的計算機或服務器上等。

實際的魔法是在添加BodyPropertiesRotation = 5400000。其他一切都是OpenXML樣板/ cruft,並使用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); 
     }