БлогNot. Visual C++: проверяем орфографию и формируем офисный документ с помощью Word

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 [12877 просмотров]


теги: язык word c++/cli

показать комментарии (2)