Есть идеи, почему этот код вызывает эту проблему? Любая помощь приветствуется.
Код: Выделить всё
using System;
using System.IO;
using System.Linq;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Presentation;
using A = DocumentFormat.OpenXml.Drawing;
namespace Easydocgen.Engine
{
public static class PowerPointTableUpdater
{
class Program
{
static void Main(string[] args)
{
string csvString = "Name, Age, Gender\nJohn1 Doe, 29, Male\nJane Doe, 25, Female";
string placeholder = "TablePlaceholder"; // Placeholder text to identify the table
// Load your PowerPoint document into a MemoryStream
byte[] byteArray = File.ReadAllBytes("YourPowerPointDocument.pptx");
using (MemoryStream memoryStream = new MemoryStream(byteArray))
{
// Call the UpdateTableWithCsv method
PowerPointTableUpdater.UpdateTableWithCsv(csvString, placeholder, memoryStream);
// Save the updated document to a file
File.WriteAllBytes("UpdatedPowerPointDocument_Updated.pptx", memoryStream.ToArray());
}
}
}
public static void UpdateTableWithCsv(string csvString, string placeholder, MemoryStream fileStream)
{
string[] csvLines = csvString.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
string[][] csvData = new string[csvLines.Length][];
for (int i = 0; i < csvLines.Length; i++)
{
csvData[i] = csvLines[i].Split(new[] { ',' }, StringSplitOptions.None);
}
// Open the existing PowerPoint document
using (PresentationDocument pptDoc = PresentationDocument.Open(fileStream, true))
{
PresentationPart presentationPart = pptDoc.PresentationPart;
var slides = presentationPart.SlideParts;
foreach (var slide in slides)
{
// Find the table containing the placeholder text
var table = slide.Slide.Descendants()
.FirstOrDefault(t => t.Descendants().Any(text => text.Text.Contains(placeholder)));
if (table != null)
{
// Find the row containing the placeholder
var headerRow = table.Descendants()
.FirstOrDefault(r => r.Descendants().Any(text => text.Text.Contains(placeholder)));
if (headerRow != null)
{
// Replace the placeholder with headers
var headerCells = headerRow.Elements().ToList();
for (int i = 0; i < csvData[0].Length; i++)
{
if (i < headerCells.Count)
{
var textBody = headerCells[i].GetFirstChild();
textBody.RemoveAllChildren();
textBody.Append(CreateParagraph(csvData[0][i].Trim()));
}
else
{
headerRow.Append(new A.TableCell(new A.TextBody(CreateParagraph(csvData[0][i].Trim()))));
}
}
// Remove existing rows below the header row
var rowsToRemove = table.Elements().SkipWhile(r => r != headerRow).Skip(1).ToList();
foreach (var row in rowsToRemove)
{
row.Remove();
}
// Add rows from CSV data (excluding the header row)
for (int i = 1; i < csvData.Length; i++)
{
A.TableRow tableRow = new A.TableRow();
foreach (var cell in csvData[i])
{
tableRow.Append(new A.TableCell(new A.TextBody(CreateParagraph(cell.Trim()))));
}
table.Append(tableRow);
}
// Save changes to the slide
slide.Slide.Save();
}
else
{
Console.WriteLine("Placeholder row not found in the table.");
}
}
else
{
Console.WriteLine("Table with placeholder not found in the slide.");
}
}
// Repair the document
RepairPowerPointDocument(pptDoc);
}
}
private static A.Paragraph CreateParagraph(string text)
{
return new A.Paragraph(new A.Run(new A.Text(text)));
}
private static void RepairPowerPointDocument(PresentationDocument pptDoc)
{
PresentationPart presentationPart = pptDoc.PresentationPart;
// Ensure SlideIdList exists
var slideIdList = presentationPart.Presentation.SlideIdList;
if (slideIdList == null)
{
slideIdList = new SlideIdList();
presentationPart.Presentation.Append(slideIdList);
}
uint maxSlideId = 1;
foreach (SlideId slideId in slideIdList.Elements())
{
if (slideId.Id > maxSlideId)
{
maxSlideId = slideId.Id;
}
}
var slideParts = presentationPart.SlideParts.ToList();
foreach (var slidePart in slideParts)
{
if (!slideIdList.Elements().Any(id => id.RelationshipId == presentationPart.GetIdOfPart(slidePart)))
{
slideIdList.Append(new SlideId()
{
Id = ++maxSlideId,
RelationshipId = presentationPart.GetIdOfPart(slidePart)
});
}
}
// Ensure correct relationships
foreach (var slidePart in slideParts)
{
RepairSlideRelationships(slidePart);
}
presentationPart.Presentation.Save();
}
private static void RepairSlideRelationships(SlidePart slidePart)
{
var relationships = slidePart.ExternalRelationships.ToList();
foreach (var relationship in relationships)
{
slidePart.DeleteExternalRelationship(relationship.Id);
slidePart.AddExternalRelationship(relationship.RelationshipType, relationship.Uri, relationship.Id);
}
var internalRelationships = slidePart.HyperlinkRelationships.ToList();
foreach (var relationship in internalRelationships)
{
slidePart.DeleteReferenceRelationship(relationship.Id);
slidePart.AddHyperlinkRelationship(relationship.Uri, relationship.IsExternal, relationship.Id);
}
slidePart.Slide.Save();
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/788 ... mmatically