Можете ли да извадите docx xml от клипборда в C# (.NET 4.0)

Лесно е да извадите неща като Html, rtf, UnicodeText и изображения от клипборда, като използвате това:

Clipboard.GetText(TextDataFormat.Html); или Clipboard.GetImage(); или какво имаш.

Има ли начин да извадите docx xml от клипборда (вида, който получавате, ако погледнете запазен docx файл)? Копирането/изрязването в word документ дори поставя ли docx xml в клипборда?


person shane    schedule 07.01.2011    source източник
comment
не - трябва да го изпратите в клипборда, преди да можете да го получите. обектният модел в Word 2007/2010 ви позволява да получите Open XML (и след това можете да правите всичко, което искате с него).   -  person Todd Main    schedule 18.03.2011
comment
Хей, помниш ли още дали си намерил решение за това?   -  person edi9999    schedule 11.02.2014
comment
Никога не намерих решение. Трябваше да премахна функцията. Оставен при плъзгане на docx файлове, защото това работи.   -  person shane    schedule 14.03.2014


Отговори (1)


Трябва да направите заобиколно решение, като вземете името на файла на Word docx и след това го прочетете, за да получите XML зад него, след което го поставите в клипборда.

Докато си там, можеш

  1. манипулирайте docx с помощта на http://docx.codeplex.com/
  2. поставете HTML в клипборда http://cathalscorner.blogspot.ca/2009/10/converting-docx-into-doc-pdf-html.html
  3. Вземете XML част от документ - https://msdn.microsoft.com/en-us/library/aa982683(v=office.12).aspx
  4. Как да получите обикновен текст на Word документ с помощта на Open XML (CSOpenXmlGetPlainText) - https://code.msdn.microsoft.com/office/CSOpenXmlGetPlainText-554918c3

.

    public static string ToStringWithDeclaration(this XDocument doc)
    {
        if (doc == null)
        {
            throw new ArgumentNullException("doc");
        }
        StringBuilder builder = new StringBuilder();
        using (TextWriter writer = new StringWriter(builder))
        {
            doc.Save(writer);
        }
        return builder.ToString();
    }

    public static void SetFileDropList(StringCollection filePaths) {

        IDataObject data = Clipboard.GetDataObject();
        if (!data.GetDataPresent(DataFormats.FileDrop))
        return;

        string[] filePaths = (string[])data.GetData(DataFormats.FileDrop);
        foreach (string fileLoc in filePaths) {

            if (Path.GetExtension(fileLoc)==".docx"){

                  if (File.Exists(c)) {

                        Microsoft.Office.Interop.Word.Application appWord = new Microsoft.Office.Interop.Word.Application();
                        Microsoft.Office.Interop.Word.Document doc = new Microsoft.Office.Interop.Word.Document();
                        XDocument xDoc = XDocument.Load(fileLoc);

                       Clipboard.SetText(xDoc.ToStringWithDeclaration(), TextDataFormat.Html);

                 }
            }
        }
person Markus    schedule 12.07.2016