我已经使用C#OpenXML生成了包含数据的电子表格和基于该数据的图表。
我现在想现在将此图表嵌入到Word文档中,以便在发送这些报告时,可以根据需要编辑这些图表(不是外部链接)。
我已经逛了好几个小时,找不到能达成此目的的文章的任何一致文档。大多数潜在客户似乎都在谈论“ EmbeddedPackageParts”。
如果任何人有任何有用的文章或可以提供一些清晰度,将不胜感激。
干杯, 邓肯。
答案 0 :(得分:2)
我最终弄明白了!
步骤: 1.生成包含我的数据的xlsx文件。 2.在本地保存xlsx文件 3.在我的Word文档中,创建一个新的图表部件并生成图形内容
ChartPart wordChartPart = document.MainDocumentPart.AddNewPart<ChartPart>();
string wordChartId = document.MainDocumentPart.GetIdOfPart(wordChartPart);
WordDocumentBuilder.Workflows.SpreadsheetUtils.GenerateBarChartPart(wordChartPart, categories, dataRows);
将电子表格嵌入ChartPart中
EmbeddedPackagePart EmbeddedObjectPart = wordChartPart.AddEmbeddedPackagePart(@“ application / vnd.openxmlformats-officedocument.spreadsheetml.sheet”);
使用(FileStream流=新的FileStream(file,FileMode.Open)) { byte [] documentBytes =新的byte [stream.Length];
stream.Read(documentBytes, 0, documentBytes.Length);
using (BinaryWriter writer = new BinaryWriter(embeddedObjectPart.GetStream()))
{
writer.Write(documentBytes);
writer.Flush();
}
}
然后,我可以在引用图表部分的Word文档中插入内嵌图形。
答案 1 :(得分:0)
您可以同时打开新的Word文档和当前包含图表的Excel工作表。 您可以在Word文档中添加一些富文本内容控件,然后在这些位置插入excel工作表的Chartparts。 确保您的图表具有标题。您可以从标题中阅读图表 要将它们附加到word文档,您需要创建一个段落对象并将其附加到Run对象,并且还需要定义一个Inline以便附加图表。 我希望您可以通过看下面的例子来使我的观点清楚。
private string WordReportGeneration(string docPath, string excelPath)
{
string[] chartTitles = new string[] {"","","","","","",.... };//Chart titles
string[] bookMark = new string[] { "C1", "C2", "C3",..... };//rich text controls of the word doc
for (int i = 0; i < chartTitles.Length; i++) //going through the chart title array
{
using (WordprocessingDocument myWordDoc = WordprocessingDocument.Open(docPath, true))
{
MainDocumentPart mainPart = myWordDoc.MainDocumentPart;
SdtBlock sdt = null;
mainPart.Document.Descendants<SdtBlock>().ToList().ForEach(b => {
var child = b.SdtProperties.GetFirstChild<Tag>();
if (child != null && child.Val.Equals(bookMark[i]))
sdt = b;
});
Paragraph p = sdt.SdtContentBlock.GetFirstChild<Paragraph>();
p.RemoveAllChildren();
Run r = new Run();
p.Append(r);
Drawing drawing = new Drawing();
r.Append(drawing);
Inline inline = new Inline(
new Extent()
{ Cx = 5486400, Cy = 3200400 });
using (SpreadsheetDocument mySpreadsheet = SpreadsheetDocument.Open(excelPath, true))
{
WorkbookPart workbookPart = mySpreadsheet.WorkbookPart;
Sheet theSheet = workbookPart.Workbook.Descendants<Sheet>().FirstOrDefault(s => s.Name == "Report");
WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(theSheet.Id);
DrawingsPart drawingPart = worksheetPart.DrawingsPart;
ChartPart chartPart = (ChartPart)drawingPart.ChartParts.FirstOrDefault(x =>
x.ChartSpace.ChildElements[4].FirstChild.InnerText.Trim() == chartTitles[i]);
ChartPart importedChartPart = mainPart.AddPart<ChartPart>(chartPart);
string relId = mainPart.GetIdOfPart(importedChartPart);
DocumentFormat.OpenXml.Drawing.Spreadsheet.GraphicFrame frame = drawingPart.WorksheetDrawing.Descendants<DocumentFormat.OpenXml.Drawing.Spreadsheet.GraphicFrame>().First();
Graphic clonedGraphic = (Graphic)frame.Graphic.CloneNode(true);
ChartReference c = clonedGraphic.GraphicData.GetFirstChild<ChartReference>();
c.Id = relId;
DocProperties docPr = new DocProperties();
docPr.Name = "XXX";
docPr.Id = GetMaxDocPrId(mainPart) + 1;
inline.Append(docPr, clonedGraphic);
drawing.Append(inline);
}
myWordDoc.Save();
myWordDoc.Close();
}
}
return docPath;
}
在此处输入代码
enter code here