2013-01-31 3 views
4

엑셀 워크 시트에 새로운 라인 차트를 만들려고합니다.이 차트의 데이터와 각 시리즈에 값을 추가하는 방법을 알 수 없습니다. 내가 내 차트에서 느끼고 싶어요 데이터에 대한 예를 준 위openxml을 사용하여 라인 차트 만들기

static void Main(string[] args) 
    { 
     string docName = @"myFile.xlsx"; 
     string worksheetName = "Sheet1"; 
     string title = "My Chart"; 
     InsertChartInSpreadsheet(docName, worksheetName, title); 
    } 


    private static void InsertChartInSpreadsheet(string docName, string worksheetName, string title) 
    { 

    // Open Document for editing 
     using (SpreadsheetDocument document = SpreadsheetDocument.Open(docName, true)) 
     { 
      IEnumerable<Sheet> sheets = document.WorkbookPart.Workbook.Descendants<Sheet>(). 
    Where(s => s.Name == worksheetName); 
      if (sheets.Count() == 0) 
      { 
       // The specified worksheet does not exist. 
       return; 
      } 

      WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheets.First().Id); 

      // Add a new drawing to the worksheet. 
      DrawingsPart drawingsPart = worksheetPart.AddNewPart<DrawingsPart>(); 
      worksheetPart.Worksheet.Append(new DocumentFormat.OpenXml.Spreadsheet.Drawing() { Id = worksheetPart.GetIdOfPart(drawingsPart) }); 
      worksheetPart.Worksheet.Save(); 

      // Add a new chart and set the chart language to English-US. 
      ChartPart chartPart = drawingsPart.AddNewPart<ChartPart>(); 
      chartPart.ChartSpace = new ChartSpace(); 
      chartPart.ChartSpace.Append(new EditingLanguage() { Val = new StringValue("en-US") }); 
      DocumentFormat.OpenXml.Drawing.Charts.Chart chart = chartPart.ChartSpace.AppendChild<DocumentFormat.OpenXml.Drawing.Charts.Chart>(
       new DocumentFormat.OpenXml.Drawing.Charts.Chart()); 

      // Create a new clustered column chart. 
      PlotArea plotArea = chart.AppendChild<PlotArea>(new PlotArea()); 
      Layout layout = plotArea.AppendChild<Layout>(new Layout()); 
      uint i = 0; 
      LineChart lineChart = plotArea.AppendChild<LineChart>(new LineChart()); 
      LineChartSeries[] series = new LineChartSeries() {} ; 
      uint j ; 
      // add series to the lineChart 
      for (LineChartSeries s in series) { 
       s = lineChart.AppendChild<LineChartSeries>(new LineChartSeries()); 
       s.SeriesText = new SeriesText(new NumericValue() { Text = "Ser "+j }); 
       series1.Index = new Index() { Val = new UInt32Value(j) }; 
       series1.Order = new Order() { Val = new UInt32Value(j) } ; 
       j++; 
      } 
      i = 1; 

      /*** 
      Here is my question , how can i add values to my chart 
      Example data: 
        Ser1 Ser2 Ser3 Ser4 
      2010 5  6  12  41 
      2011 65  1  31  43 
      2012 75  8  64  40 
      2013 12  31  47  66 
      ***/ 

      // Save the chart part. 
      chartPart.ChartSpace.Save(); 
      /* Here i'll add the position of the chart on the worksheet */ 
      // Save the WorksheetDrawing object. 
      drawingsPart.WorksheetDrawing.Save(); 
     } 
    } 

을 코드에서 :

    Ser1 Ser2 Ser3 Ser4 
      2010 5  6  12  41 
      2011 65  1  31  43 
      2012 75  8  64  40 
      2013 12  31  47  66 

내가 C 번호에 초보자이야 다음 내가 수행하려고 할 것입니다 및 OpenXml, 도와주세요 :-) 감사합니다.

답변

3

검색 시간이 지나면 마침내 spreadsheetlight 라이브러리를 사용하여이 문제에 대한 해결책을 찾았습니다.이 라이브러리는 내가 원하는 것과 똑같지는 않지만 결국 원하는 결과를 얻습니다.

public CopyChartFromXlsx2Pptx(string SourceFile, string TargetFile, string targetppt) 
    { 

     ChartPart chartPart; 

     ChartPart newChartPart; 

     //SlidePart slidepartbkMark = null; 

     string chartPartIdBookMark = null; 

     File.Copy(TargetFile, targetppt, true); 

     //Powerpoint document 

     using (OpenXmlPkg.PresentationDocument pptPackage = OpenXmlPkg.PresentationDocument.Open(targetppt, true)) 
     { 

      OpenXmlPkg.PresentationPart presentationPart = pptPackage.PresentationPart; 

      var secondSlidePart = pptPackage.PresentationPart.SlideParts.Skip(0).First(); // this will retrieve your second slide 

      chartPart = secondSlidePart.ChartParts.First(); 

      chartPartIdBookMark = secondSlidePart.GetIdOfPart(chartPart); 

      //Console.WriteLine("ID:"+chartPartIdBookMark.ToString()); 

      secondSlidePart.DeletePart(chartPart); 

      secondSlidePart.Slide.Save(); 

      newChartPart = secondSlidePart.AddNewPart<ChartPart>(chartPartIdBookMark); 

      ChartPart saveXlsChart = null; 

      using (SpreadsheetDocument xlsDocument = SpreadsheetDocument.Open(SourceFile.ToString(), true)) 
      { 

       WorkbookPart xlsbookpart = xlsDocument.WorkbookPart; 

       foreach (var worksheetPart in xlsDocument.WorkbookPart.WorksheetParts) 
       { 

        if (worksheetPart.DrawingsPart != null) 

         if (worksheetPart.DrawingsPart.ChartParts.Any()) 
         { 
          saveXlsChart = worksheetPart.DrawingsPart.ChartParts.First(); 
         } 

       } 

       newChartPart.FeedData(saveXlsChart.GetStream()); 
       //newChartPart.FeedData(
       secondSlidePart.Slide.Save(); 

       xlsDocument.Close(); 

       pptPackage.Close(); 

      } 

     } 
    } 

을 내가 파일을 엑셀 생성 삭제할 수 있습니다 후 : 엑셀 새로운 파워 포인트 파일에 파일에서 SpreadSheetLight, 나를 쉽게 DataTable의에서 차트를 만들 수 있습니다, 그럼 내가 차트를 복사하려면 다음 함수를 사용 -)

이 솔루션으로 도움이 되었기를 바랍니다.

+0

SpreadsheetLight를 사용해 주셔서 감사합니다! 그것은 도서관의 독창적 인 사용입니다. –