Как я могу получить файлы, которые прикреплены к текстовому документу? - PullRequest
0 голосов
/ 21 февраля 2011

Я использую Microsoft.Office.Interop.Word для доступа к документам Word через c #.В некоторых документах Word есть объекты.Это эквивалент вложений электронной почты.

Чтобы вставить какой-либо файл в документ Word в Word 2007, перейдите на вкладку Вставка -> Объект -> Объект ... и выберите файл.

У меня вопрос, как мне получить файл с помощью C #?

Вот пример того, как это делается с электронной почтой с помощью Outlook:

    protected Microsoft.Office.Interop.Outlook.ApplicationClass outlookApplication = null;
    protected Microsoft.Office.Interop.Outlook._MailItem        mailItem           = null;
    protected Microsoft.Office.Interop.Outlook.NameSpace        mapi               = null;

public OutlookFileExtracter(string filename, string contentPrefix, int startAttachmentNumber)
    this.outlookApplication = new Microsoft.Office.Interop.Outlook.ApplicationClass();
    this.mapi = outlookApplication.GetNamespace("MAPI");
    mailItem = mapi.OpenSharedItem(filename) as Microsoft.Office.Interop.Outlook._MailItem;
}

public Collection<string> GetFileNames()
{
    String extension;
    if (this.fileNamesOrig == null)
    {
        int numberOfFiles = this.mailItem.Attachments.Count;

        this.fileNamesOrig = new Collection<string>();
        this.fileNamesDest = new Collection<string>();
        this.fileValidBools = new Collection<bool>();

        for (int i = 0; i < numberOfFiles; i++)
        {
            //First attachment number is 1
            fileNamesOrig.Add(this.mailItem.Attachments[i + 1].FileName);
            this.fileValidBools.Add(false);
        }

        for (int la = 0; la < numberOfFiles; la++)
        {
            extension = Path.GetExtension(fileNamesOrig[la]).ToUpper().Trim('.');
            this.fileNamesDest.Add(this.contentPrefix + (this.startAttachmentNumber + la) + "." + extension);
        }
    }
    return this.fileNamesOrig;
}

Видимо Microsoft.Office.Interop.Word не использует вложения, но тогда я не знаю, как это называется.Есть идеи?

Ответы [ 3 ]

2 голосов
/ 26 февраля 2011

Возможно, вы имеете в виду OLE, который широко используется в документах Office.Из статьи в википедии: http://en.wikipedia.org/wiki/Object_Linking_and_Embedding

Связывание и внедрение объектов (OLE) - это технология, разработанная Microsoft, которая позволяет встраивать и связывать документы и другие объекты.Для разработчиков это принесло OLE Control eXtension (OCX), способ разработки и использования пользовательских элементов пользовательского интерфейса.На техническом уровне объект OLE - это любой объект, который реализует интерфейс IOleObject, возможно, наряду с широким спектром других интерфейсов, в зависимости от потребностей объекта.

Этот веб-сайт изначально будет выглядеть не связаннымна ваш вопрос, однако, это то, что используется.

Если вы хотите пропустить мясо, прокрутите вправо вниз до дна, где вы найдете «внешнюю ссылку» на: http://www.pldaniels.com/ripole/

ripOLE - это небольшая программа / библиотека, предназначенная для извлечения вложений из файлов данных OLE2 (т. Е. Документов MS Office).ripOLE имеет лицензию BSD, что означает, что коммерческие проекты также могут использовать код, не беспокоясь о стоимости лицензии или юридических обязательствах.

2 голосов
/ 26 февраля 2011

Вы можете попробовать использовать классы System.IO.Packaging для чтения данных.Файл Word 2007 - это просто zip-файл, поэтому объекты, которые вы ищете, вероятно, находятся внутри в формате, который вы можете прочитать.

В MSDN есть сборник статей под названием «Word 2007 Visual How Tos», который можетбыть полезным: http://msdn.microsoft.com/en-us/library/gg537324(v=office.12).aspx

Вы можете прочитать о SDK формата Open XML здесь: http://msdn.microsoft.com/en-us/library/bb448854(v=office.12).aspx

1 голос
/ 26 февраля 2011

Как сказал Арафангион, они являются объектами OLE, для большинства из них, если вы знаете, что они из себя представляют, вы можете попросить их экспортировать их содержимое в другое место.нужно извлечь двоичный контент и надеяться, что ваш пользователь сможет найти приложение для его чтения.

...