Visual C++: проверяем орфографию и формируем офисный документ с помощью Word
Приведём пример кода на Visual C++, работающего с Word. Подойдёт любая версия Visual Studio от сборки Express 2010 и выше. Похожий пример на работу с Excel приводился в этой заметке.
Создадим новый проект C++/CLI, на форме расположим поле ввода richTextBox1
и растянем его на всю форму (свойство Dock = Fill
)
Добавим на форму стандартные файловые диалоги openFileDialog1
, saveFileDialog1
Добавим верхнее меню menuStrip1
с пунктами Файл - Создать, Файл - Открыть, Файл - Сохранить, Файл - Выход, запрограммируем их:
Меню Файл - Создать:
richTextBox1->Clear();
Меню Файл - Открыть:
openFileDialog1->FileName = ""; openFileDialog1->Filter = "RTF files (*.rtf)|*.rtf|All files (*.*)|*.*"; if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK && openFileDialog1->FileName->Length > 0) { try { System::IO::Stream ^myStream; if ((myStream = openFileDialog1->OpenFile()) != nullptr) { myStream->Close(); richTextBox1->LoadFile(openFileDialog1->FileName); } } catch (...) { MessageBox::Show("Не могу открыть файл "+System::IO::Path::GetFileName(openFileDialog1->FileName)+ "\nПроверьте его имя, права доступа и формат (нужен RTF)","Ошибка",MessageBoxButtons::OK,MessageBoxIcon::Asterisk); return; } }
Меню Файл - Сохранить:
saveFileDialog1->FileName = ""; saveFileDialog1->Filter = "RTF files (*.rtf)|*.rtf"; saveFileDialog1->DefaultExt = "rtf"; if (saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK && saveFileDialog1->FileName->Length > 0) { try { richTextBox1->SaveFile(saveFileDialog1->FileName, RichTextBoxStreamType::RichText); /* //А вот код через потоки, но только для содержимого txt System::IO::Stream ^ fileStream = saveFileDialog1->OpenFile(); System::IO::StreamWriter ^ sw = gcnew System::IO::StreamWriter (fileStream); sw->Write(richTextBox1->Text); sw->Flush(); sw->Close(); */ } catch (...) { MessageBox::Show("Не могу сохранить файл "+System::IO::Path::GetFileName(saveFileDialog1->FileName)+ "\nПроверьте его имя и права доступа","Ошибка",MessageBoxButtons::OK,MessageBoxIcon::Asterisk); return; } }
Меню Файл - Выход:
this->Close();
Добавим к проекту внешнюю библиотеку:
- Для Visual Studio 2010 и подобных:
меню Проект, Свойства, Список Общие свойства - .NET Framework и ссылки,
кнопка Добавить новую ссылку..., вкладка Обзор.
Показать на файл
c:\ Program Files
(илиProgram Files (x86)
)\Microsoft Office\
Office 14
(или ваша версия)\ MSWORD.OLB
, ссылка добавится в список. - Для Visual Studio 2015 и подобных: в Обозревателе решений щёлкнуть правой кнопкой мыши на корневом узле формы, выбрать команды Добавить – Ссылка, Нажать кнопку Обзор, показать на указанный файл.
Добавим пункт меню Правка - Проверить и реализуем для него следующий (примерный) код:
auto Word1 = gcnew Microsoft::Office::Interop::Word::Application(); //тип auto - тип соответствующей переменной выводится из выражения инициализации, как в C# Object ^ t = Type::Missing; // Переменная с "пустым" значением auto Doc = Word1->Documents->Add(t, t, t, t); // Открываем новый документ MS Word Doc->Words->First->InsertBefore(richTextBox1->Text); // Вводим в документ MS Word текст из текстового поля //Или: //Word1->Selection->default = richTextBox1->Text; // Копируем содержимое текстового окна в документ //Или: //Word1->Selection->TypeText ("\nАшибка"); //Вводим текст прямо в документ Doc->CheckSpelling(t, t, t, t, t, t, t, t, t, t, t, t); // Непосредственная проверка орфографии String ^ CorrectedText = Doc->Content->default;// Получаем исправленный текст richTextBox1->Text = CorrectedText; // Возвращаем в текстовое поле исправленный текст //Или: richTextBox1->Text = CorrectedText->Replace("\r", ""); //Или: richTextBox1->Text = Word1->Selection->default; Object ^ tt = Microsoft::Office::Interop::Word::WdSaveOptions::wdDoNotSaveChanges; //Не сохранять документ Word1->Documents->Close(tt, t, t); // Закрыть документ Word без сохранения Word1->Quit(tt, t, t); Word1 = nullptr;
Если офис-2007 выдаёт ошибку "Неверно указана единица измерения", попробуйте заменить файл
C:\ Program Files\
(или Program Files (x86)\
) Microsot Office\Office12\1049\ WWINTL.DLL
на вот этот: скачать по ссылке
Перед заменой закройте все офисные программы и проверьте, что размеры оригинального и исправленного файлов совпадают.
Пример 2. Построение объекта в документе Word (на примере таблицы)
Аналогично предыдущему примеру, добавим к проекту ссылку на COM-объект:
- В Visual Studio 2010: вкладка COM в окне ”Добавить ссылку” – показать на библиотеку Microsoft Word 14.0 Object Library (или ваша версия вместо 14).
- В Visual Studio 2015: список COM в окне "Добавить ссылку" – пункт Библиотеки типов - включить чекбокс "Microsoft Word 14.0 Object Library" (или ваша версия вместо 14).
Добавим к приложению пункт меню Правка - Записать отчет и реализуем следующий код:
//Код для формирования таблицы и передачи её в Word: array<String^> ^ Imena = {"Name1", "Name2", "Name3"}; array<String^> ^ Tel = {"101-22-33", "310-00-47","222-13-15"}; int Size= Tel->Length; auto Word1 = gcnew Microsoft::Office::Interop::Word::Application(); Word1->Visible = true; auto t = Type::Missing; auto Doc1 = Word1->Documents->Add(t, t, t, t); Word1->Selection->TypeText("ТАБЛИЦА ТЕЛЕФОНОВ"); // Вводим текст в документ MS WORD с текущей позиции System::Object ^ t1 = Microsoft::Office::Interop::Word::WdDefaultTableBehavior::wdWord9TableBehavior; // Параметр, указывающий, показывать ли границы ячеек System::Object ^ t2 = Microsoft::Office::Interop::Word::WdAutoFitBehavior::wdAutoFitContent; // Параметр, указывающий будет ли приложение Word автоматически изменять размер ячеек // в таблице для подгонки содержимого Word1->ActiveDocument->Tables->Add(Word1->Selection->Range, Size, 2, t1, t2); // Создаем таблицу из Size строк и 2 столбцов for (int i = 1; i<=Size; i++) { // Заполняем таблицу Word1->ActiveDocument->Tables[1]->Cell(i, 1)->default->InsertAfter(Imena[i - 1]); Word1->ActiveDocument->Tables[1]->Cell(i, 2)->default->InsertAfter(Tel[i - 1]); } Object ^ t3 = Microsoft::Office::Interop::Word::WdUnits::wdLine; // Назначаем единицы измерения в документе приложения MS Word Object ^ LastString = Size; // Параметр, указывающий на последнюю строку в документе MS Word Word1->Selection->MoveDown(t3, LastString, t); // Перевести текущую позицию (Selection) за пределы таблицы, чтобы здесь вывести какой-либо текст Word1->Selection->TypeText("Какой-либо текст после таблицы"); Object ^ FileName = "report.doc"; //Подготовили имя файла для сохранения Word1->ActiveDocument->SaveAs(FileName, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t);
Скачать этот пример в архиве .ZIP с проектом Visual C++ (15 Кб)
31.03.2015, 11:41 [13113 просмотров]