Время прочтения: 9 мин.

В рамках этого поста рассмотрена задача –как получить данные из следующих файлов:

  1. MS Word (форматы .docx, .doc, .rtf)
  2. MS Excel (форматы .xlsx, .xls, .xlsm)
  3. MS PowerPoint (форматы .pptx, .ppt, .pptm)
  4. MS Outlook (формат .msg)
  5. Файлы формата .pdf

Для начала создаем проект в Microsoft Visual Studio (у меня это обычное консольное приложение) и подключаем нужные библиотеки. Для этого в решении проекта (рисунок 1) находим Reference и правой кнопкой мыши открываем меню, нам нужен пункт Add Reference.

Рисунок 1. Добавление библиотек

В строке поиска набираем «interop» и добавляем библиотеки:

  1. Microsoft.Office.Interop.Excel
  2. Microsoft.Office.Interop.Word
  3. Microsoft.Office.Interop.Outlook
  4. Microsoft.Office.Interop.PowerPoint.

Также нам нужно добавить библиотеку Microsoft.Office.Core. В поиске набираем «office» и выбираем библиотеку office (рисунок 2).

Рисунок 2. Выбор библиотеки Microsoft.Office.Core

Для работы с pdf файлами я буду использовать библиотеки itextsharp и SautinSoft.PdfFocus. Для их использования необходимо заранее их скачать и указать путь до .dll-файлов при добавлении библиотек (кнопка Browse).

Когда все нужные библиотеки добавлены, объявим об их использовании в коде программы.

using Excel = Microsoft.Office.Interop.Excel;
using Word = Microsoft.Office.Interop.Word;
using Outlook = Microsoft.Office.Interop.Outlook;
using PPoint = Microsoft.Office.Interop.PowerPoint;
using Core = Microsoft.Office.Core;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
using SautinSoft;

Работа с MS Word

Для начала нужно создать объект приложения MS Word и в нем открыть нужный документ. Также нужно создать объект для записи данных в текстовый файл. В StreamWriter нужно указать путь до txt-файла, включая название самого файла. Если файла не существует, он будет создан программой сам. Второй параметр показывает, добавляется ли текст в файл или данные перезаписываются. Выбираем true, так как будем считывать текст по параграфам и постепенно добавлять его в файл. Третий параметр – кодировка.

В цикле идем по параграфам файла, получаем текст. Если в абзаце есть текст, записываем его в txt-файл. В конце не забываем закрыть открытый документ, приложение и объект для записи в файл. Если этого не делать, то при обработке большого количества файлов может не хватить памяти и программа даст сбой.

static void Word_to_TXT(string path_word, string txt_path)
        {            
            // создаем экземпляр приложения Word
            Word.Application appWord = new Word.Application();
            // открываем документ
            appWord.Documents.Open(path_word);
            // работаем с активным документоми
            Word.Document doc = appWord.ActiveDocument;
            // создаем объект для записи в текстовый файл
            StreamWriter writer = new StreamWriter(txt_path, true, Encoding.UTF8);

            // идем по абзацам документа, получаем текст и добавляем его в файл
            for (int i = 1; i <= doc.Paragraphs.Count; i++)
            {
                string Paragraph_Text = doc.Paragraphs[i].Range.Text;
                Paragraph_Text = Paragraph_Text.Replace("\n", "").Replace("\t", "").Replace("\r", "");
                if (!String.IsNullOrEmpty(Paragraph_Text) || !String.IsNullOrWhiteSpace(Paragraph_Text))
                    writer.WriteLine(Paragraph_Text);
            }

            // закрываем объекты
            if (writer != null)
                writer.Close();
            if (doc != null)
                doc.Close(false);
            if (appWord != null)
                appWord.Quit();                      
        }

Работа с MS Excel

Начинаем работу также с создания объекта приложения MS Excel, открываем нужный файл и создаем объект для записи данных в текстовый файл. Параметры StreamWriter были описаны выше и далее будут такие же. В Excel файлах может быть заполнено несколько листов, поэтому мы организуем цикл по листам. На каждом листе определяем область ячеек, которая заполнена, и считаем количество строк и столбцов.

Далее проходимся по ячейкам в каждой строке и получаем из них текст. Если ячейка не пустая, то записываем текст в строку, не забываем разделять ячейки каким-либо символом, у нас будет символ табуляции. Когда проходим одну строку в таблице, то записываем ее в текстовый файл.

В конце также не забываем закрыть все объекты Excel-файла.

static void Excel_to_TXT(string path_excel, string txt_path)
        {
            // создаем экземпляр приложения Excel
            Excel.Application appExcel = new Excel.Application();           
            // открываем документ
            Excel.Workbook EWorkbook = appExcel.Workbooks.Open(path_excel);
            // создаем объект для записи в текстовый файл
            StreamWriter writer = new StreamWriter(txt_path, true, Encoding.UTF8);

            // идем листам Excel-файла
            for (int i = 1; i <= EWorkbook.Worksheets.Count; i++)
            {
                // определяем рабочий лист
                Excel._Worksheet worksheet = EWorkbook.Sheets[i];
                // определяем рабочую область на листе
                Excel.Range ExcelRange = worksheet.UsedRange;
                // определяем количество строк и колонок
                int rowCount = ExcelRange.Rows.Count;
                int colCount = ExcelRange.Columns.Count;

                // цикл по строкам
                for (int row = 1; row <= rowCount; row++)
                {
                    string Table_string = "";
                    // цикл по столбцам
                    for (int col = 1; col <= colCount; col++)
                    {
                        // собираем текст из непустых ячеек
                        if (ExcelRange.Cells[row, col] != null && ExcelRange.Cells[row, col].Value2.ToString() != null)
                        {
                            Table_string += ExcelRange.Cells[row, col].Value2.ToString() + "\t";
                        }
                    }
                    writer.WriteLine(Table_string);
                }
            }

            // закрываем объекты
            if (writer != null)
                writer.Close();          
            if (EWorkbook != null)
                EWorkbook.Close(false);
            if (appExcel != null)
                appExcel.Quit();           
        }

Рассмотрим, как программа преобразует Excel-файл в текстовый на примере конкретного файла. На рисунке 3 представлен фрагмент Excel-файла.

Рисунок 3. Фрагмент Excel-таблицы

Вызовем функцию, указав в ней путь до исходного файла и путь до файла, куда будем сохранять результат.

static void Main(string[] args)
        {        
            string path_excel = @"C:\Users\Admin\Desktop\Калорийность.xlsx";
            string path_txt = @"C:\Users\Admin\Desktop\Калорийность.txt";
            Excel_to_TXT(path_excel, path_txt);     
        }

На рисунке 4 представлен фрагмент текстового файла, который был получен из Excel-файла.

Рисунок 4. Текстовое представление таблицы

Работа с MS PowerPoint

            Создаем экземпляр приложения PowerPoint и объект для записи данных в файл. Далее открываем файл презентации. При открытии файла нужно указать следующие параметры:

  • путь к файлу
  • флаг для чтения файла. Если True, то файл открывается в режиме чтения.
  • флаг для заголовков. Если True, то заголовки не учитываем.
  • флаг для отображения окна самой презентации. Если True, то при открытии файла, вы увидите саму презентацию.

Текст из презентации будем получать, поочередно обращаясь к элементам на слайдах. После обработки презентации закрываем все объекты, которые использовали.

static void PPoint_to_TXT(string path_ppoint, string txt_path)
        {
            // создаем экземпляр приложения PowerPoint           
            PPoint.Application appPPoint = new PPoint.Application();
            // создаем объект для записи в текстовый файл
            StreamWriter writer = new StreamWriter(txt_path, true, Encoding.UTF8);
            // открываем файл презентации
            PPoint.Presentation presentation = appPPoint.Presentations.Open(path_ppoint, Core.MsoTriState.msoTrue, Core.MsoTriState.msoTrue, Core.MsoTriState.msoFalse);            
            
            // идем по слайдам презентации
            for (int i = 1; i <= presentation.Slides.Count; i++)
            {
                string text = "";
                string tmpText = "";
                // идем по элементам слайда
                for (int j = 1; j <= presentation.Slides[i].Shapes.Count; j++)
                {
                    try
                    {
                        // пытаемся получить текст из элемента слайда
                        tmpText = presentation.Slides[i].Shapes[j].TextFrame.TextRange.Text + "\t";
                    }
                    catch
                    {
                        tmpText = "";
                    }
                    if (tmpText != "")
                        text += tmpText;
                }
                writer.WriteLine(text);
            }
            
            // закрываем объекты
            if (writer != null)
                writer.Close();
            if (presentation != null)
                presentation.Close();
            if (appPPoint != null)
                appPPoint.Quit();
            
        }

Рассмотрим пример преобразования файла презентации в текстовый на рисунках 5 и 6 представлены слайды презентации, а на рисунке 7 – фрагмент текстового файла.

Рисунок 5. Первый слайд презентации
Рисунок 6. Второй слайд презентации
Рисунок 7. Текстовое представление презентации

Работа с MS Outlook

            Последний из форматов файлов Microsoft – файлы .msg. Если нам нужно получить данные из письма, то также создаем экземпляр приложения Outlook и объект для записи текста в файл. Создаем новый объект письма из текущего, указав в параметрах путь к файлу (письму). Следующим шагом получаем из тела письма текст и записываем его сразу в текстовый файл.

static void Outlook_to_TXT(string path_outlook, string txt_path)
        {
            // создаем экземпляр приложения Outlook
            Outlook.Application appOutlook = new Outlook.Application();
            // создаем объект для записи в текстовый файл
            StreamWriter writer = new StreamWriter(txt_path, true, Encoding.UTF8);
            // открываем письмо Outlook
            Outlook.MailItem mail = appOutlook.CreateItemFromTemplate(path_outlook);
            // получаем текст из письма
            string text = mail.Body.ToString().Replace("\t", String.Empty).Replace("\r", String.Empty);
            // записываем текст в текстовый файл
            writer.Write(text);

            // закрываем объекты
            if (writer != null)
                writer.Close();
            if (appOutlook != null)          
                appOutlook.Quit();              
            
        }

Работа с PDF

            Файлы PDF можно разделить на два вида – файлы-сканы и pdf-файлы с выделяемым текстом. Отмечу сразу, что мы будем работать только со вторым видом pdf-файлов.

            При использовании библиотеки iTextSharp мы сразу считываем pdf-файл в объект и создаем привычный для нас объект для записи в текстовый файл. Поочередно будем идти по каждой странице файла, получать текст сразу со всей страницы и записывать его в текстовый файл. Не забываем закрывать объекты файлов в конце.

static void PDF_to_TXT(string path_pdf, string txt_path)
        {     
            // считываем pdf-файл
            PdfReader reader = new PdfReader(path_pdf);
            // создаем объект для записи в текстовый файл
            StreamWriter writer = new StreamWriter(txt_path, true, Encoding.UTF8);
            
            // получаем текст с каждой страницы и записываем в файл  
            for (int i = 1; i <= reader.NumberOfPages; i++)
            {
                string t = PdfTextExtractor.GetTextFromPage(reader, i, new LocationTextExtractionStrategy());
                if (t != "")
                    writer.WriteLine(t);                   
            }

            // закрываем объекты
            if (reader != null)
                reader.Close();
            if (writer != null)
                writer.Close();
        }

При использовании библиотеки SautinSoft все выглядит еще проще. Мы создаем объект, чтобы потом открыть в нем pdf-файл. Далее мы сразу получаем текст из файла и тут же записываем его в текстовый файл, минуя StreamWriter, который мы использовали до этого.

static void PDF_to_Text(string path_pdf, string txt_path)
        {
            // создали экземпляр объекта 
            PdfFocus pdf = new PdfFocus();
            // открыли pdf-файл
            pdf.OpenPdf(path_pdf);
            // если не пустой, то получаем текст и сразу записываем в файл
            if (pdf.PageCount != 0)
                pdf.ToText(txt_path);

            // закрываем pdf-файл
            pdf.ClosePdf();
        }

В этом посте были рассмотрены способы преобразования различных файлов пакета Microsoft Office в текстовый формат с использованием встроенных библиотек Microsoft.Office.Interop и библиотеки, которые преобразуют pdf-файлы в текст.