2009-08-05 27 views
8

Mam trochę kodu, który otworzy dokument Word 2007 (docx) i zaktualizuje odpowiednią CustomXmlPart (w ten sposób aktualizując kontrolę treści w samym dokumencie, ponieważ są one mapowane do CustomXmlPart), ale nie może znaleźć sposobu na zapisanie tego jako nowego pliku.! Z pewnością nie jest to takie trudne!Zapisywanie dokumentu OpenXML (Word) wygenerowanego z szablonu

Obecnie myślę, że muszę otworzyć szablon i skopiować zawartość do nowego, pustego dokumentu - pliku po pliku, aktualizując CustomXMLPart, gdy go napotkam. Zadzwoń do mnie staroświecki, ale brzmi to dla mnie trochę nieprzyjemnie!

Dlaczego nie mogę po prostu zrobić WordprocessingDocument.SaveAs (filename); ...?

Proszę mi powiedzieć, że brakuje mi tutaj czegoś prostego.

Z góry dziękuję

+0

Myślałem, że OpenXml miał sprawić, że rzeczy eaiser - pfft.! Zostawiając powyższe na czas, rzuciłem okiem na następne zadanie na liście - osadzenie garści plików docx w jednym docx (nie pytaj!) I po prostu boli mnie tutaj! – DilbertDave

+0

* łatwiej * .. niż ręczne tworzenie xml w oparciu o specyfikację;) – JoeBrockhaus

Odpowiedz

14

Czy masz na myśli zestaw SDK OpenXML? Niestety, podobnie jak w OpenXml SDK 2.0, nie ma metody SaveAs. Musisz:

  1. Wykonaj tymczasową kopię pliku szablonu, nadając mu nazwę, co chcesz.
  2. Wykonaj zmiany w OpenXML w powyższym pliku.
  3. Zapisz odpowiednie sekcje (np. Za pomocą metody. myWordDocument.MainDocumentPart.Document.Save() dla głównej treści lub metody someHeaderPart.Header.Save() dla określonego nagłówka).
+6

To właśnie to, co w końcu robiłem - wydaje mi się trochę zaniedbaniem. Jeśli otworzysz dokument i zmodyfikujesz go, to jest uzasadnione, że możesz chcieć zapisać zaktualizowaną wersję pod inną nazwą. – DilbertDave

+1

To samo można zrobić, jeśli czytasz plik w pliku MemoryStreams, który jest poprawny? Mam na myśli unikanie robienia kopii pliku. –

+0

@PabloRomeo Myślę, że to możliwe, ale nie jest to podejście, które próbowałem, kiedy pracowałem z OpenXml. Prawdopodobnie możesz pracować z 'MemoryStream', a następnie zapisać go do wybranej nazwy pliku, jeśli to jest celem. Te łącza mogą pomóc: [Praca z dokumentami XML w pamięci] (http://msdn.microsoft.com/en-us/library/office/ee945362%28v=office.11%29.aspx) i [Problem z OpenXML i MemoryStreams?] (Http://amykinsgardiner.blogspot.com/2011/02/trouble-with-openxml-and-memorystreams.html) –

0

Rzeczywiście można co najmniej w OpenXml SDK 2.5. Pamiętaj jednak, aby pracować z kopią oryginalnego pliku, ponieważ zmiany w pliku XML zostaną odzwierciedlone w pliku. Tutaj masz Load metody i Zapisz mojego niestandardowej klasy (po usunięciu jakiś kod weryfikacyjny, ...):

public void Load(string pathToDocx) 
    { 
     _tempFilePath = CloneFileInTemp(pathToDocx); 
     _document = WordprocessingDocument.Open(_tempFilePath, true); 
     _documentElement = _document.MainDocumentPart.Document; 
    }  

    public void Save(string pathToDocx) 
    { 
     using(FileStream fileStream = new FileStream(pathToDocx, FileMode.Create)) 
     { 
      _document.MainDocumentPart.Document.Save(fileStream); 
     } 
    } 

mieć „_document” jako WordprocessingDocument instancji.

Powiązane problemy