Работаем с файлами на С#. Как преобразовать любой файл в текстовый
В рамках этого поста рассмотрена задача –как получить данные из следующих файлов:
- MS Word (форматы .docx, .doc, .rtf)
- MS Excel (форматы .xlsx, .xls, .xlsm)
- MS PowerPoint (форматы .pptx, .ppt, .pptm)
- MS Outlook (формат .msg)
- Файлы формата .pdf
Для начала создаем проект в Microsoft Visual Studio (у меня это обычное консольное приложение) и подключаем нужные библиотеки. Для этого в решении проекта (рисунок 1) находим Reference и правой кнопкой мыши открываем меню, нам нужен пункт Add Reference.
В строке поиска набираем «interop» и добавляем библиотеки:
- Microsoft.Office.Interop.Excel
- Microsoft.Office.Interop.Word
- Microsoft.Office.Interop.Outlook
- Microsoft.Office.Interop.PowerPoint.
Также нам нужно добавить библиотеку Microsoft.Office.Core. В поиске набираем «office» и выбираем библиотеку office (рисунок 2).
Для работы с 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-файла.
Вызовем функцию, указав в ней путь до исходного файла и путь до файла, куда будем сохранять результат.
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-файла.
Работа с 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 – фрагмент текстового файла.
Работа с 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-файлы в текст.