Превращение потока в WordDoc без ссылки на SDK - PullRequest
0 голосов
/ 30 июня 2011

Итак, я создал библиотеку C #, которая манипулирует и редактирует документы Word.Это, конечно, относится к OpenXML SDK.Однако, когда я использую библиотеку, мне не нужно ссылаться и на .dll.

Один метод, который я мог бы использовать из другого проекта, имеет параметр WordprocessingDocument и имеет этот профиль:

public bool FillTemplate(ref WordprocessingDocument document, XElement data)
{
    //EDIT the document and return True if succesful.
}

Проблема здесь, конечно, в том, что мне нужно создать WordprocessingDocument внутри другого проекта, а не просто пропустить поток.

Хорошо, я думаю, самое простое решение - это другой профильпо методу:

public bool FillTemplate(Stream document, XElement data)
{
    WordprocessingDocument doc = WordprocessingDocument.Open(document, true);
    return FillTemplate(doc, data);
}

Но я получил, как мне казалось, блестящую идею, просто создать метод расширения для Stream:

public static WordprocessingDocument ConvertToWordDocument(this Stream stream, bool isEditable)
{
    return WordprocessingDocument.Open(stream, isEditable);
}

и использовать его следующим образом:

FileStream fStream = new FileStream(@"C:\Users\Me\Desktop\SomeDoc.docx", FileMode.Open);
var doc = fStream.ConvertToWordDocument(true);
filler.FillTemplate(ref doc, getXmlDataFor(42));

fStream.Flush();
fStream.Close();

Однако по какой-то причине это не работает (Doc меняется, но, похоже, не возвращается в поток), и я немного скептически отнесся к идее о том, как я использую Streams иWordprocessingDocument упаковка / упаковочная штука.

Что было бы оптимальным решением, чтобы у меня не было особых проблем?Как на самом деле класс WordprocessingDocument работает в отношении передачи его в качестве параметра и тому подобное?Почему поток не изменил первоначально открытый документ?

1 Ответ

2 голосов
/ 30 июня 2011
System.IO.Packaging.Package

, кажется, путь при работе с пакетами opc. Следующие строки кода выглядят хорошо для меня. Package.Open имеет несколько конструкторов, которые можно использовать со строками пути, потоками и т. Д. *

System.IO.Packaging.Package package = System.IO.Packaging.Package.Open(@"C:\Users\Me\Desktop\SomeDoc.docx");
DocumentFormat.OpenXml.Packaging.WordprocessingDocument document = DocumentFormat.OpenXml.Packaging.WordprocessingDocument.Create(package, DocumentFormat.OpenXml.WordprocessingDocumentType.Document);

// edit document                
package.Flush();
package.Close();
...