Редактирование docx с помощью openxml возвращает неверный поток памяти

Я создал DLL, которая принимает шаблон Word, у меня есть код, который редактирует документ с использованием openXML, а затем результат отправляется через поток памяти в веб-сервис, где документы загружаются пользователю. Проблема в том, что поток памяти отправляет либо оригинальный шаблон документа без обновлений, либо отправляет обновленный формат документа Word в формате XML, где документ явно поврежден. Вот код:

string strTemplate = AppDomain.CurrentDomain.BaseDirectory + "Report Template.docx";

WordprocessingDocument wdDocument;

//stream the template
byte[] fileBytes = File.ReadAllBytes(strTemplate);
MemoryStream memstreamDocument = new MemoryStream();

memstreamDocument.Write(fileBytes, 0, (int)fileBytes.Length);

wdDocument = WordprocessingDocument.Open(memstreamDocument, true);

//CODE TO UPDATE TEMPLATE

//Save entire document
wdDocument.MainDocumentPart.Document.Save();

После сохранения документа, если используется следующий код, поток памяти возвращает исходный шаблон без каких-либо обновлений в документе:

return memstreamDocument;

При использовании следующего кода поток памяти возвращает данные openXML с обновлениями, но документ поврежден:

MemoryStream memstreamUpdatedDocument = new MemoryStream();
Stream streamDocument = wdDocument.MainDocumentPart.GetStream();
streamDocument.CopyTo(memstreamUpdatedDocument);
return memstreamUpdatedDocument;

Вот мой код в веб-сервисе, который работает нормально:

HttpResponse response = HttpContext.Current.Response;
MemoryStream stream = GR.GetReport("", intReportID, Culture, ConnectionString, false);

response.Clear();
response.ClearHeaders();
response.ClearContent();
response.AddHeader("content-disposition", "attachment; filename=\"" + "Report_" + intReportID+ ".docx\"");
response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1");
stream.Position = 0;
stream.CopyTo(response.OutputStream);
response.End();
return response;

1

Решение

После просмотра предоставленного кода я предоставил измененный фрагмент кода, который должен соответствовать вашим потребностям по возврату измененного кода. MemoryStream из шаблона файла, используя WordprocessingDocument класс по OpenXML. Предоставленный фрагмент кода веб-службы должен работать как есть.

// file path of template
string strTemplate = AppDomain.CurrentDomain.BaseDirectory + "Report Template.docx";

// create FileStream to read from template
FileStream fsTemplate = new FileStream(strTemplate, FileMode.Open, FileAccess.Read);

// create MemoryStream to copy template into and modify as needed
MemoryStream msDocument = new MemoryStream();

// copy template FileStream into document MemoryStream
fsTemplate.CopyTo(msDocument);

// close the template FileStream as it is no longer necessary
fsTemplate.Close();

// reset cursor position of document MemoryStream back to top
// before modifying
msDocument.Position = 0;

// create WordProcessingDocument using the document MemoryStream
using (WordprocessingDocument wdDocument = WordprocessingDocument.Open(msDocument, true)) {

//Access the main Workbook part, which contains all references.
MainDocumentPart mainPart = wdDocument.MainDocumentPart;

/* ... CODE TO UPDATE TEMPLATE ... */

// save modification to main document part
wdDocument.MainDocumentPart.Document.Save();

// close wdDocument as it is no longer needed
wdDocument.Close();
}

// reset cursor position of document MemoryStream back to top
msDocument.Position = 0;

// return memory stream as promised
return msDocument;
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]