2017-11-24 10 views
1

データをエクスポートして(非常にうまく動作するように)、グラフを作成しようとしています。x軸の異なる複数のシリーズのC#

私が持っているもの:3列 - ID、値、日付。同じIDを持ち、値と日時が異なる複数の行があります。

例:
ID - 値 - 日時
1 - 14 - 2017年11月21日午前2時17分08秒
1 - 15 - 2017年11月22日午後02時25分45秒
3から12.5 - 2017年11月21日午後03時12分12秒
3から18.7 - 2017年11月21日午後七時27分35秒
3から13 - 2017年11月22日午後12時47分17秒

私がしたいことは価値がY軸であるチャートです、各IDは系列で、DatetimeはX軸です。ただし、datetimeはIDごとに異なります。

これは表示方法ですが、X軸に数字の代わりに日付が表示されます。 Chart Image

私は解決策を探していて、同様の質問から解決策を試してきましたが、まだ「ポイント」はありませんでした。 は、これは私がこれまで持っているものです。

Excel.ChartObjects ChartObjects = (Excel.ChartObjects)WS.ChartObjects(); 
Excel.ChartObject chartObject = ChartObjects.Add(400, 40, 450, 300); 
chartObject.Chart.ChartType = Excel.XlChartType.xlXYScatterLines; 
Excel.SeriesCollection oSeriesCollection = (Excel.SeriesCollection)chartObject.Chart.SeriesCollection(); 

Excel.Axis xAxis = (Excel.Axis)chartObject.Chart.Axes(Excel.XlAxisType.xlCategory, Excel.XlAxisGroup.xlPrimary); 
xAxis.HasTitle = true; 
xAxis.AxisTitle.Text = "Date"; 

Excel.Axis yAxis = (Excel.Axis)chartObject.Chart.Axes(Excel.XlAxisType.xlValue, Excel.XlAxisGroup.xlPrimary); 
yAxis.HasTitle = true; 
yAxis.AxisTitle.Text = "Value"; 

int startPos = 4; 
int endPos = 0; 
int previousCount = 0; 
for (int i = 0; i < Count; i++) 
{ 
    startPos = startPos + previousCount; 
    endPos = startPos + CountList[i].Count - 1; 

    Excel.Series oSeries = oSeriesCollection.NewSeries(); 
    oSeries.Values = WS.Range["E" + startPos, "E" + endPos]; 
    //oSeries.XValues = WS.Range["F" + startPos, "F" + endPos]; //doesn't really do anything 
    oSeries.Name = "id " + CountList[i].Number.ToString(); 
    previousCount = CountList[i].Count; 
} 

それはどんな違いを行った場合、日付は、データベース内の日時ですが、リストに格納する際に、文字列に変換されます。

私はそれが必要な方法でx軸を設定できますか?出来ますか?

答えて

0

私はEPPlusを使って非常に似たようなことをしました。それはasp.net MVC 5にあったので、あなたのニーズに合うように文書を保存する必要があるかもしれません。私の場合、年齢はY軸に表示したい値で、X軸に日付があります。うまくいけば、これは少なくともあなたの上に構築する何かを与えるでしょう。その中のコメントに注目してください。そうでなければ、私にとって意図したとおりにチャートが機能しませんでした。

 var results = GetResultsSomehow(); 

     ExcelPackage excel = new ExcelPackage(); 
     var workSheet = excel.Workbook.Worksheets.Add("Reading Ages"); 

     workSheet.TabColor = System.Drawing.Color.Black; 

     var scatterChart = (ExcelScatterChart)workSheet.Drawings.AddChart("Reading Ages", eChartType.XYScatterSmooth); 
     scatterChart.SetPosition(3, 1, 4, 1); 
     scatterChart.SetSize(800, 500); 
     scatterChart.XAxis.Format = "dd/mm/yyyy"; 
     // must display hidden data and empty as gaps, otherwise the date axis will explode 
     scatterChart.ShowHiddenData = true; 
     scatterChart.DisplayBlanksAs = eDisplayBlanksAs.Gap; 

     int rowIndex = 4; 
     int stopIndex = 4; 
     foreach (var student in results.Select(a=> a.Student).Distinct()) 
     { 
      int start = rowIndex; 
      int stop = start + stopIndex; 

      workSheet.Cells[rowIndex, 1].Value = student.Surname; 
      foreach(var row in results.Where(a=> a.Student == student)) 
      { 
       workSheet.Cells[rowIndex, 2].Value = row.Age; 
       workSheet.Cells[rowIndex, 3].Value = row.Date; 

       rowIndex++; 
       stopIndex++; 
      } 

      stop = rowIndex; 
      var series = scatterChart.Series.Add(workSheet.Cells[start, 2, stop - 1, 2], workSheet.Cells[start, 3, stop - 1, 3]); 
      series.Header = student.Surname;   
     } 

     string excelName = identifier + " reading ages"; 
     using (var memoryStream = new MemoryStream()) 
     { 
      Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
      Response.AddHeader("content-disposition", "attachment; filename=" + excelName + ".xlsx"); 
      excel.SaveAs(memoryStream); 
      memoryStream.WriteTo(Response.OutputStream); 
      Response.Flush(); 
      Response.End(); 
     } 
+0

悲しいことに、これは私にも役立ちませんでした。なぜなら、ShowHiddenDataプロパティを持たないinteropを使用する必要があるからです。しかし、努力していただきありがとうございます、そして他の提案は大歓迎です! – YuppLo

関連する問題