Я пытаюсь изменить данные для уже существующего файла слов. У меня был успех в управлении данными во встроенном файле Excel, но почему-то эти данные не используются в файле Word. Более того, в файле Excel я вижу зеленый маркер до последней строки, что, вероятно, означает, что последняя строка все еще не рассматривается для данных. Может ли кто-нибудь помочь в решении проблемы?Как добавить данные диаграммы в Open XML C# для Word?
Я ссылался на множество ссылок с сайта ericwhite.com/openxmldeveloper.org, но не повезло.
код ниже:
public void ReplaceChartValues(string placeholderCaption, System.Data.DataTable chartData, string newCaption)
{
if (wordDocument != null)
{
try
{
ChartPart target = mainDocumentPart
.ChartParts
.Where(r => r
.ChartSpace
.GetFirstChild<Chart>()
.Title
.InnerText
.StartsWith(placeholderCaption)
)
.FirstOrDefault();
if (target != null)
{
target
.ChartSpace
.GetFirstChild<Chart>()
.Title
.ChartText
.RichText
.GetFirstChild<DocumentFormat.OpenXml.Drawing.Paragraph>()
.GetFirstChild<DocumentFormat.OpenXml.Drawing.Run>()
.Text
.Text = newCaption;
ExternalData externalData =
target
.ChartSpace
.Elements<ExternalData>()
.FirstOrDefault();
if (externalData != null)
{
EmbeddedPackagePart embeddedPackagePart =
(EmbeddedPackagePart)
target
.Parts
.Where(r => r.RelationshipId == externalData.Id)
.FirstOrDefault()
.OpenXmlPart;
if (embeddedPackagePart != null)
{
using (Stream stream = embeddedPackagePart.GetStream())
{
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(stream, true))
{
DocumentFormat.OpenXml.Spreadsheet.Sheet worksheet = (DocumentFormat.OpenXml.Spreadsheet.Sheet)spreadsheetDocument
.WorkbookPart
.Workbook
.Sheets
.FirstOrDefault();
WorksheetPart worksheetPart = (WorksheetPart)
spreadsheetDocument
.WorkbookPart
.Parts
.Where(r => r.RelationshipId == worksheet.Id)
.FirstOrDefault()
.OpenXmlPart;
DocumentFormat.OpenXml.Spreadsheet.SheetData sheetData =
worksheetPart
.Worksheet
.Elements<DocumentFormat.OpenXml.Spreadsheet.SheetData>()
.FirstOrDefault();
var existingRows = sheetData
.Elements<DocumentFormat.OpenXml.Spreadsheet.Row>()
.Skip(1)
.ToArray();
for (int ctr = 0; ctr < existingRows.Length; ctr++)
{
sheetData
.RemoveChild<DocumentFormat.OpenXml.Spreadsheet.Row>(existingRows[ctr]);
}
for (int ctr = 0; ctr < chartData.Rows.Count; ctr++)
{
DocumentFormat.OpenXml.Spreadsheet.Row newRecord = new DocumentFormat.OpenXml.Spreadsheet.Row();
for (int ctr2 = 0; ctr2 < chartData.Columns.Count; ctr2++)
{
DocumentFormat.OpenXml.Spreadsheet.Cell newCell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
DocumentFormat.OpenXml.Spreadsheet.CellValue newCellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue();
if (chartData.Columns[ctr2].DataType == typeof(DateTime))
{
newCellValue.Text = Convert.ToDateTime(chartData.Rows[ctr][ctr2]).ToString("MM/dd/yyyy");
newCell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.Date;
}
else if (chartData.Columns[ctr2].DataType == typeof(decimal))
{
newCellValue.Text = chartData.Rows[ctr][ctr2].ToString();
newCell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.Number;
}
else
{
newCellValue.Text = chartData.Rows[ctr][ctr2].ToString();
newCell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
}
newCell.AppendChild(newCellValue);
newRecord.AppendChild(newCell);
}
sheetData.AppendChild(newRecord);
}
spreadsheetDocument.Save();
}
}
}
}
}
}
catch (Exception)
{
}
finally
{
// Save the document.
mainDocumentPart.Document.Save();
}
}
}
Не знаю, почему этот вопрос вниз проголосовали ... Некоторая ссылка должна была быть предоставлена до этого. –