2016-02-17 4 views
1

Есть ли способ установить угловое выравнивание меток тика оси на диаграмме с использованием EPPLUS? Я генерирую диаграммы eChartType.XYScatterLinesNoMarkers, и моя ось X (имеющая много ярлыков меток) выглядит очень загроможденной.C# EPPLUS, устанавливающий угол метки метки оси X диаграммы

Как диаграмма выглядит в настоящее время с перегруженной оси X: X axis horizontal alignment

Как я хотел бы диаграмму, чтобы посмотреть: X axis 45 degree alignment

Если это не представляется возможным, чтобы установить угол, можно установить ориентация этикеток к вертикальной ориентации; т. е. 90 & deg;

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. Я проверил несколько других сообщений, но ничего не нашел. Похоже, что единственный способ сделать это - сохранить пакет «ExcelPackage» 'package.save' и повторно открыть и форматировать лист через XML, как вы предложили, или через« Microsoft.Office.Interop.Excel ». Я отправлю ответ на этот вопрос, чтобы показать, как я это сделал, используя «Microsoft.Office.Interop.Excel». – Nikita93

ответ

1

Я смог установить выравнивание меток оси 45 градусов, сохранив Epplus ExcelPackage, повторно открыв файл через 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

Для делать Somethings В Excel файл, который не существует в Epplus рамочного кодекса ...

Вы можете использовать Добавить Macro, исполняющих в файле Open 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(); 

Для создания макрокоманды Вы можете использовать Record Macro Button в Excel и создать новый макрос вашего использования

0

В случаях, как это, я считаю, используя OpenXML SDK предпочтительного с помощью Excel Interop. Фактический код является отвратительным, но, по крайней мере, он не полагается на открытие скрытой копии Excel, которая должна быть фактически установлена ​​на компьютере пользователя или сервере и т. Д.

Фактическое волшебство находится в той части, которая добавляет BodyProperties с Rotation = 5400000. Все остальное - OpenXML-шаблон/крест, и сгенерировано автоматически с помощью инструмента OpenXML Productivity Tool.

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); 
     } 
Смежные вопросы