Openxml Powerpoint — поврежден файл после программного создания таблицыC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Openxml Powerpoint — поврежден файл после программного создания таблицы

Сообщение Anonymous »

Конечный результат идеален. Однако Powerpoint выдает ошибку, сообщающую, что файл требует восстановления. После нажатия кнопки «Восстановить» результат будет таким, как ожидалось.
Есть идеи, почему этот код вызывает эту проблему? Любая помощь приветствуется.

Код: Выделить всё

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();
}
}
}

Вывод правильный, но каким-то образом XML-файл PPTP повреждается, когда я использую openxml C# для внесения каких-либо изменений.

Подробнее здесь: https://stackoverflow.com/questions/788 ... mmatically
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • ClosedXML выдает ошибку «Файл поврежден» после записи расширением NPOI, но файл не поврежден C#
    Anonymous » » в форуме C#
    0 Ответы
    74 Просмотры
    Последнее сообщение Anonymous
  • PowerPoint, созданный с использованием Apache POI, поврежден из -за функции addTitle ()
    Anonymous » » в форуме JAVA
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Как определить идентификаторы, используемые в презентации PowerPoint, с помощью OpenXML SDK версии 3.0?
    Anonymous » » в форуме C#
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous
  • Встраивайте Excel в Powerpoint с помощью openxml и C#.
    Anonymous » » в форуме C#
    0 Ответы
    49 Просмотры
    Последнее сообщение Anonymous
  • Получить имя выбора текстового поля, используя OpenXml в PowerPoint
    Anonymous » » в форуме C#
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»