2015-11-13 2 views
1

Есть ли способ изменить диаграмму X или ось Y, чтобы установить собственное форматирование меток?C# Изменить формат диаграммы диаграммы Excel с помощью EPPLUS

Например, в XAxis мои метки являются датами, но форматирование составляет yyyy-mm-dd hh: mm: ss. Я бы хотел изменить его только на yyyy-mm-dd.

Было интересно, если это возможно в EPPLUS без использования Interop

ответ

2

Это немного боли с диаграммами и EPPlus. Они выставили свойство chart.XAxis.Format для установки формата, но не учитывают атрибут souceLinked, который, если не установлен в 0 (по умолчанию), говорит, что excel просто переходит с исходным форматом данных. Поэтому вы должны установить его вручную с помощью xml:

[TestMethod] 
public void Chart_Row_Offset_Test() 
{ 
    //Throw in some data 
    var datatable = new DataTable("tblData"); 
    datatable.Columns.AddRange(new[] 
    { 
     new DataColumn("Col1", typeof (DateTime)), new DataColumn("Col2", typeof (int)), new DataColumn("Col3", typeof (object)) 
    }); 

    for (var i = 0; i < 10; i++) 
    { 
     var row = datatable.NewRow(); 
     row[0] = DateTime.Now.AddDays(i) ;row[1] = i*10;row[2] = Path.GetRandomFileName(); 
     datatable.Rows.Add(row); 
    } 

    //Create a test file 
    var fi = new FileInfo(@"c:\temp\Chart_Row_Offset.xlsx"); 
    if (fi.Exists) 
     fi.Delete(); 

    using (var pck = new ExcelPackage(fi)) 
    { 
     var workbook = pck.Workbook; 
     var worksheet = workbook.Worksheets.Add("Sheet1"); 
     worksheet.Cells.LoadFromDataTable(datatable, true); 

     //This would be the axis label format if the XML Attribute is not set below 
     worksheet.Cells["A2:A11"].Style.Numberformat.Format = "m/d/yyyy"; 

     const int EXCELCHARTWIDTH = 375; 
     const int EXCELCHARTHEIGHT = 350; 
     const double EXCELDEFAULTROWHEIGHT = 20.0; //Assuming standard screen dpi 

     var startCell = (ExcelRangeBase)worksheet.Cells["A1"]; 
     for (var i = 0; i < 10; i++) 
     { 
      var chart = worksheet.Drawings.AddChart("chart " + i, eChartType.XYScatterLines); 
      chart.SetSize(EXCELCHARTWIDTH, EXCELCHARTHEIGHT); 
      chart.SetPosition(startCell.Start.Row, 0, startCell.Start.Column, 0); 
      chart.XAxis.Format = "yyyy-mm-dd"; 

      var series = chart.Series.Add(worksheet.Cells["B2:B11"], worksheet.Cells["A2:A11"]); 

      var chartcellheight = (int)Math.Ceiling(EXCELCHARTHEIGHT/EXCELDEFAULTROWHEIGHT); 
      startCell = startCell.Offset(chartcellheight, 0); 

      //Get reference to the chart xml for proper namespace 
      var xdoc = chart.ChartXml; 
      var nsm = new XmlNamespaceManager(xdoc.NameTable); 
      nsm.AddNamespace("default", xdoc.DocumentElement.NamespaceURI); 

      //Add the attribute to not link to the source data format 
      var att = xdoc.CreateAttribute("sourceLinked"); 
      att.Value = "0"; 
      var numFmtNode = xdoc.SelectSingleNode("/default:chartSpace/default:chart/default:plotArea/default:valAx/default:numFmt", nsm); 
      numFmtNode.Attributes.Append(att); 
     } 

     pck.Save(); 
    } 


} 
+0

Будет ли это работать над существующим файлом и листом? Метод работает, но когда я приспосабливаю его к моему коду (что примерно одинаково, за исключением открытия существующего листа) Я использовал код, связанный с xml, и получил это сообщение об ошибке в try-catch: Ссылка на объект не установлена к экземпляру объекта. – somethingstrang

+0

Nvm Я понял. Шахта была catAx вместо ValAx – somethingstrang