I'm trying to create a new LineChart on excel worksheet, and i don't know how can i feel data on this chart and how to add values for each series. The following is what i try to do:
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();
}
}
in the code above i gave an example for the data that i want to feel on my chart :
Ser1 Ser2 Ser3 Ser4
2010 5 6 12 41
2011 65 1 31 43
2012 75 8 64 40
2013 12 31 47 66
i'm beginner on C# and OpenXml , please help me :-) thank you.
After hours of searching, finally i found a solution for this problem by using the spreadsheetlight library , this library doesn't the same thing as i want , but at the end i get the result which i hope. SpreadSheetLight, helps me to create a chart from a DataTable easily, then i used the following function to copy the chart from the excel file to new powerpoint file:
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();
}
}
}
After i can delete the generated excel file :-)
I hope this solution can help you!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With