Как вставить код из Visual Studio в документ Word

Я ведь это уже делал, но хрен теперь найдешь тот кусок кода, гуглим снова… Где бы найти простое и понятное руководство для начинающего, а не тонкости для мега-гуру?

Главная→C#→MS Office→ Взаимодействие с MS Word из C#, часть 1. Загружаем шаблон и находим текст в документе

Рубрики

Свежие комментарии

  • Thank you for registering. Contact us again http://nullpro.info Okeygorandom bjt8357849 к записи Как заставить клавишу Enter работать аналогично Tab — переходить к следующему элементу управления
  • Waynehow к записи Как заставить клавишу Enter работать аналогично Tab — переходить к следующему элементу управления
  • kelleyma11 к записи Вырезаем числовую часть из начала строки в transact-sql
  • Kirill к записи Самоучитель по C# для начинающих. 01. Основы языка, переменные, логика, циклы.
  • как избавиться от чувства вины к записи Как добавить строку/текст в начало файла в C# и .Net
  • Архивы

    Мета

    Работаем с MS Word из C#, часть 1. Открываем шаблон, ищем текст внутри документа

    Дата публикации: 11.07.2012, автор: Ведомир

    Цель: экспортировать информацию в файл Word. Это действительно обширная и многогранная тема, сравнимая с самим Word, поскольку большинство пользователей не используют около 90% его функционала.

    Сузим до более простой и чаще встречающейся на практике задачи, с которой в своей время пришлось столкнуться мне самому: надо вывести красивую справку, договор, отчет или иной документ Word с добавлением данных из кода C#. Само собой должны поддерживаться версии Word до 2007, так что о новых форматах файлов придется забыть. Для начала вспомним, что в Word есть такая замечательная вещь как шаблоны. Соответственно большую часть сложного оформления можно вынести в них и из кода открывать шаблон и вставлять данные в нужные места. Для начала ограничимся простыми строками (типовая задача в крупных предприятиях — вставка дат, цифр, фио и тому подобных вещей, договор на сумму такую-то, от такой-то даты с фио таким-то с параметрами объекта такими-то).

    Цель данной статьи заключается в том, чтобы открыть шаблон Word из кода на C# и вставить в него определённые данные. Шаблон в формате .dot будет подготовлен заранее в самом Word. Для взаимодействия с ним мы будем использовать механизм COM Interoperability (сокращенно Interop), что подразумевает запуск отдельного процесса для Word и управление им через специальный интерфейс. К счастью, такие интерфейсы существуют и предоставляются в специальных библиотеках, которые идут в комплекте с Office, однако документация по ним оставляет желать лучшего, а поведение иногда бывает весьма странным и нелогичным. В версиях Visual Studio 2010 и далее возможности для программирования Office значительно расширены, но данное руководство актуально и для студии 2008 года.

    1. Подключить необходимые библиотеки 2. Открыть шаблон Word 3. Найти нужное место в документе 4. Вставить строку с необходимой информацией

    1. Проект в студии у нас уже должен быть. В разделе Ссылки/References кликаем правой кнопкой, идем в "Добавить ссылку" и ищем Microsoft.Office.Interop.Word. В параметрах добавленной библиотеки ставим true в Копировать локально/Copy local, так как библиотеку надо копировать вместе с исполняемыми файлами проекта.

    В код необходимо добавить соответствующие using директивы

    using Word = Microsoft.Office.Interop.Word; using System.Reflection;

    2. Теперь вам предстоит потратить немало времени, изучая прекрасный интерфейс Word, который демонстрирует сам текстовый редактор и его внутренние элементы в виде различных объектов. В данный момент важны два из них — Application и Document. Переменные для этих объектов по ряду не очевидных причин рекомендуется объявлять через интерфейсы.

    Word._Application application; Word._Document document;

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

    Object missingObj = System.Reflection.Missing.Value; Object trueObj = true; Object falseObj = false;

    Чтобы запустить Word и открыть в нем шаблон с диска (путь известен), потребуется примерно такой код

    // создаем экземпляр приложения Word application = new Word.Application(); // задаем путь к файлу Object templatePathObj = "путь до файла шаблона"; // если произойдет ошибка на этом этапе, приложение останется активным try < document = application.Documents.Add(ref templatePathObj, ref missingObj, ref missingObj, ref missingObj); >catch (Exception error) < document.Close(ref falseObj, ref missingObj, ref missingObj); application.Quit(ref missingObj, ref missingObj, ref missingObj); document = null; application = null; throw error; >_application.Visible = true;

    Принципиально важны два момента

    1. Мы создаем неуправляемый ресурс, который не соберет сборщик мусора — отдельный процесс в памяти с приложением Word, если мы его не закроем и не выведем на экран, он так и останется там висеть до выключения компьютера. Более того такие ворды могут накапливаться незаметно для пользователя, программист-то еще прибьет их вручную. Заботиться о высвобождения неуправляемого ресурса должен программист.

    2. По умолчанию Word запускается невидимым, на экран его выводим мы.

    Пришло время познакомится с фундаментом работы с Word — великим и ужасным объектом Range. Его суть сложно описать словами -это некоторый произвольный кусок документа, диапазон (range), который может включать в себя все что угодно — от пары символов, до таблиц, закладок и прочих интересных вещей. Не стоит путать его с Selection — куском документа, выделенным мышкой, который само собой можно конвертировать в Range. Соотвественно нам надо получить Range для всего документа, найти нужную строку внутри него, получить Range для этой строки и уже внутри этого последнего диапазона заменить текст на требуемый. И не стоит забывать, что документ может иметь сложную структуру с колонтитулами и прочей ересью, возможный универсальный метод для замены всех вхождений данной строки:

    // объектные строки для Word

    object strToFindObj = strToFind;

    object replaceStrObj = replaceStr;

    // область документа Word

    Word.Range wordRange;

    // тип поиска и замены

    object replaceTypeObj;

    replaceTypeObj = Word.WdReplace.wdReplaceAll;

    // проходим по всем разделам документа

    for (int i = 1; i ; wordFindObj.GetType().InvokeMember("Execute", BindingFlags.InvokeMethod, null, wordFindObj, wordFindParameters); >

    На самом деле это не самый лучший метод для вставки информации в документ, так как могут возникнуть сложности с уникальными именами для текстовых меток (если текст одной входит в начало другой, данный метод найдет ее и заменит), их совпадением с произвольным текстом и так далее.

    Даже если нам надо найти (и например отформатировать) именно строку с текстом внутри документа, лучше всего выдать наружу найденный Range и уже с ним производить разные злодеяния. Получим примерно такой метод:

    object искомыйСтроковыйОбъект = строкаДляПоиска; Word.Range диапазонДляСлова; bool найденДиапазон; // в цикле проходим по всем секциям документа, получаем диапазон, запускаем поиск // если поиск вернул true, он должен укоротить диапазон до найденной строки, выходим и возвращаем диапазон // проходим по всем секциям документа for (int i = 1; i ; найденДиапазон = (bool)поисковыйОбъект.GetType().InvokeMember("Execute", BindingFlags.InvokeMethod, null, поисковыйОбъект, параметрыПоиска); if (найденДиапазон) < return диапазонДляСлова; >> // если ничего не обнаружили, возвращаем null return null;

    Простейшее решение проблемы уникальности текста (нужно нам найти Range слова Word, но внутри всего документа оно встречается десятки раз) — искать строку внутри строки, сначала найти уникальную строку, потом не уникальную внутри нее, неэстетично, но дешево, надежно и практично.

    // оформляем обьектные параметры object stringToFindObj = stringToFind; bool rangeFound; /* Обходим редкий глюк в Find, ПРИЗНАННЫЙ MICROSOFT, метод Execute на некоторых машинах вылетает с ошибкой "Заглушке переданы неправильные данные / Stub received bad data" http://support.microsoft.com/default.aspx?scid=kb;en-us;313104 rangeFound = containerRange.Find.Execute(ref stringToFindObj, ref wordMissing, ref wordMissing, ref wordMissing, ref wordMissing, ref wordMissing, ref wordMissing, ref wordMissing, ref wordMissing, ref wordMissing, ref wordMissing, ref wordMissing, ref wordMissing, ref wordMissing, ref wordMissing); */ Word.Find wordFindObj = containerRange.Find; object[] wordFindParameters = new object[15] < stringToFindObj, _missingObj, _missingObj, _missingObj, _missingObj, _missingObj, _missingObj, _missingObj, _missingObj, _missingObj, _missingObj, _missingObj, _missingObj, _missingObj, _missingObj >; rangeFound = (bool)wordFindObj.GetType().InvokeMember("Execute", BindingFlags.InvokeMethod, null, wordFindObj, wordFindParameters); if (rangeFound) < return containerRange; >else

    Для простой замены строки подойдет следующий вариант

    _range.Text = "Этот текст заменит содержимое диапазона";

    Но так как Range является универсальный контейнером для любого куска документа Word, то его возможности неизмеримо шире, часть их будет рассмотрена в дальнейших заметках.

    Если нам надо просто встать в начало документа (и что-то вставить уже туда):

    объект начало = 0; объект конец = 0; _текущийДиапазон = _документ.Диапазон(ref начало, ref конец);

    Сохранить документ на диск можно следующим образом

    Object путьДляСохраненияОбъекта = строкаДляСохраненияПути; _документ.СохранитьКак(ref путьДляСохраненияОбъекта, Word.WdSaveFormat.wdFormatDocument, ref _отсутствующийОбъект, ref _отсутствующийОбъект, ref _отсутствующийОбъект, ref _отсутствующийОбъект, ref _отсутствующийОбъект, ref _отсутствующийОбъект, ref _отсутствующийОбъект, ref _отсутствующийОбъект, ref _отсутствующийОбъект, ref _отсутствующийОбъект, ref _отсутствующийОбъект, ref _отсутствующийОбъект, ref _отсутствующийОбъект, ref _отсутствующийОбъект, ref _отсутствующийОбъект);

    1. Работаем с MS Word из C#, часть 0, класс и тестовый проект-пример WinForms
    2. Работаем с MS Word из C#, часть 1. Открываем шаблон, ищем текст внутри документа
    3. Работаем с MS Word из C#, часть 2. Вставляем текст на закладку и форматируем
    4. Работаем с MS Word из C#, часть 3. Работа с таблицами
    5. Работаем с MS Word из C#, часть 4. Обьединяем несколько файлов в один, считаем количество страниц
    6. Microsoft.Office.Interop.Word Namespace
    7. Range Interface

    Категория: MS Office Постоянная ссылка

    Комментарии

    Работаем с MS Word из C#, часть 1. Открываем шаблон, ищем текст внутри документа — Комментарии (9)

    Павел сообщает 24.02.2016 в 18:41:

    Локально этот код работает, но как быть с сервером? Как сделать так, чтобы Word открывался на стороне клиента, когда сайт и файлы уже на сервере?

    VSC | Как скопировать код с подсветкой синтаксиса в виде HTML-разметки с цветами?

    На этом сайте пишу публикации и периодически вставляю кусочки кода из редакторов. Часто приходится разукрашивать синтаксические элементы языковых конструкций JavaScript.

    Для небольших кодов я вручную присваиваю цвета в блоках PRE при помощи редактора публикаций WordPress.

    Но на больших фрагментах кода делать разукрашивание ручным способом довольно запарно. Хочется просто взять из редактора кода visual studio code нужный фрагмент и просто скопировать его в WordPress. Как это сделать?

    Я нашёл один способ. Может быть он вам поможет избежать головной боли. Способ не самый удобный, но рабочий. Вы получите 100% отображение кода в WordPress также, как вы видите его в VSC.

    Шаг № 1 — Копируем код в редакторе VSC

    Выделяем нужный кусок кода в самом редакторе VSC и затем копируем его в буфер обмена.

    Шаг № 2 — Вставляем скопированный код из VSC в новый документ MS WORD

    MS WORD и VSC являются продуктами компании Microsoft, что гарантирует безупречную вставку кода в новый документ. Вы сможете наблюдать идентичную цветовую палитру.

    Шаг № 3 — Сохраняем новый документ MS WORD в виде « Веб-страница с фильтром (*.htm; *.html) «

    Шаг № 4 — Открываем сохранённый документ обычным Блокнотом

    Вся разметка будет представлять собой стандартную структуру HTML-документа. Но нам нужно только два блока из неё, потому что мы планируем вставлять эти два размеченных цветных блока в свой документ.

    Шаг № 5 — Копируем только блок style и блок div со всеми абзацами p

    Нетрудно догадаться, что блок style хранит в себе общее стилевое CSS-оформление для блоков, представляющих код.

    Блок div с p состоит из span’ов, которые оформляются инлайновыми стилями в виде атрибута style, без дополнительных подгружаемых файлов. Это как раз то, что нам и нужно.

    Шаг № 6 — Вставляем размеченный код с инлайновыми стилями в нужную часть нашего HTML-документа

    Там где у вас будут запятые в коде, может перенестись на новую строку. Но это не критично и можно быстро поправить.

    Ниже пример вставленного кода:

    if ( ! defined ( ‘CZR_MIN_PHP_VERSION’ ) ) define ( ‘CZR_MIN_PHP_VERSION’ , 5.3 );

    if ( ! defined ( ‘CZR_MIN_WP_VERSION’ ) ) define ( ‘CZR_MIN_WP_VERSION’ , 4.5 );

    if ( version_compare ( phpversion (), CZR_MIN_PHP_VERSION, ‘

    add_action ( ‘admin_notices’ , ‘czr_fn_display_min_php_message’ );

    если ( сравнить_версии ( $wp_version , CZR_MIN_WP_VERSION, ‘

    add_action ( ‘admin_notices’ , ‘czr_fn_display_min_wp_message’ );

    Оцените статью
    InternetDoc.ru
    Добавить комментарий