Большой Воронежский Форум
» Программирование>Вставка формул в Word из C++Builder
Sashok.vrn 17:43 19.12.2010
Господа программисты,

Делаю приложение, которое должно выводить отчет с пояснениями и формулами в Word. Делаю в C++Builder 6.

Никак не могу найти справочные файлы по COM серверу Word для C++. Нашел для Delphi и то без компонентов для формул.

Где можно найти справку именно для C++? [Ответ]
Part!zan 18:40 19.12.2010
msdn.... [Ответ]
Sashok.vrn 19:16 19.12.2010

Сообщение от Part!zan:
msdn....

Для C++ не нашел там... [Ответ]
X0R 19:53 19.12.2010
а для чего нашел? [Ответ]
Sashok.vrn 21:32 19.12.2010

Сообщение от X0R:
а для чего нашел?

Для VBA,
пробовал переводить на C++, и как раз момент с формулами не получилось перевести... [Ответ]
alexz 22:04 19.12.2010
А ком-сервера почти одинаково пишутся. vba-справки вполне хватало.
А что, вы знаете способ создать вордовскую формулу через ком? я не нашёл ком-интерфейса для этого, в своё время.
я делал через "поля" - там есть вставка/поле/формула - и там дроби,интегралы,и всё такое прочее. [Ответ]
Sashok.vrn 22:25 19.12.2010

Сообщение от alexz:
А ком-сервера почти одинаково пишутся. vba-справки вполне хватало.
А что, вы знаете способ создать вордовскую формулу через ком? я не нашёл ком-интерфейса для этого, в своё время.
я делал через "поля" - там есть вставка/поле/формула - и там дроби,интегралы,и всё такое прочее.

Из VBA:
Dim objRange As Range
Dim objEq As OMath

Set objRange = Selection.Range
objRange.Text = "Celsius = (5/9)(Fahrenheit – 32)"
Set objRange = Selection.OMaths.Add(objRange)
Set objEq = objRange.OMaths(1)
objEq.BuildUp


А как вы делали через "поля"? [Ответ]
X0R 23:49 19.12.2010

Сообщение от Sashok.vrn:
Из VBA:

ну и почему нельзя перевести во что то типа

Сообщение от :
#include <stdio.h>
#include "Office.h"

int main()
{
::CoInitialize(NULL);

{
using namespace Word;
_ApplicationPtr word(L"Word.Application");
word->Visible = true;
word->Activate();

// открывает документ test.doc
_DocumentPtr wdoc2 = word->Documents->Open(&_variant_t("C:\\MyDoc\\test.doc"));

//создаем новый документ
_DocumentPtr wdoc1 = word->Documents->Add();

//копирование текста из старого в новый. Вот здесь надо как-то указать именно абзацы копировать! Можно? А? Ато он всё выделяет и копирует...
wdoc2->Content->Select();
wdoc2->Content->Copy();
wdoc1->Content->Paste();

//Сохраняем, закрываем
wdoc1->SaveAs(&_variant_t("C:\\MyDoc\\1test.doc"));
wdoc2->Close();
wdoc1->Close();
}

::CoUninitialize();
}

известно же к чему надо обращаться [Ответ]
Sashok.vrn 22:54 20.12.2010
alexz, в общем, изучая данную тему, я сделал следующие выводы (я могу ошибаться):
1. В Word 2007 появился собственный редактор формул, который в предыдущих версиях не использовался. Для этого редактора есть COM интерфейс, однако в C++Builder 6 используется объект Office 2k, который не поддерживает новые дополнения в Office 2007.
2. Equation 3.0 - отдельное OLE приложение, которое используется для создания формул в Office до 2007 (начиная с 2007 версии к Equation добавился еще и собственный редактор формул Word).
3. Поскольку в моем приложении нужно именно Equation 3.0, необходимо найти его интерфейсы. Найдя интерфейсы Equation, вставить формулы в Word не составит труда даже используя объект Office 2k...

Только где их можно найти? [Ответ]
alexz 00:34 21.12.2010
Sashok.vrn, я долго (в своё время) пытался найти интерфейсы Equation 3.0 - но не вышло... Я пришёл к выводу тогда, что они закрыты. Поэтому мне пришлось "выворачиваться" с полями. В старом ворде они в меню Вставка, пункт Поле, далее в окошке выбрать "математические поля " или как-то так. Где они в новом ворде - хз, давно опенофисом пользуюсь уже.

Мне надо было просто "подставлять" цифры в готовые формулы (довольно хитрые). Я делал формулы с этими полями. А туда, куда надо подставлять цифры, вставлял переменные в таком формате $VOLUME$ или ещё как-то так. Это у меня был шаблон.
Затем я программно открывал шаблон в word, менял переменные на их значения, и вуаля!
Кстати, эти поля автоматически, по двойному щелчку, конвертировались в формулы.

3) А ведь вы можете создавать всё на машине с вордом 2007, и заставлять его сохранять в старый формат. не?

1) в си билдере не обязательно пользоваться этими объектами. Есть простой способ пользоваться почти любыми объектами через дисп-интерфейс (блин,я с трудом вспомнил это слово а когда-то шпарил их по сто штук в минуту)
Я только не помню как

Если хочешь - пороюсь в старых исходниках.
А ещё можно подключить к своей программе библиотеку типов - где-то вроде Project/Add type library, а tlb от ворда была в его папке.
[Ответ]
Sashok.vrn 23:12 21.12.2010
alexz, поскольку пока не получается найти интерфейсы к Equation, буду делать приложение для Word 2007 с "новым" редактором формул. Там тоже еще нужно много изучать, но хоть есть - что... Сейчас вот скачаю книг по Visual Studio и буду штудировать.
А вообще в интернете много вопросов задают на тему Equation и ответов особо я не встречал...

А что такое дисп-интерфейс? [Ответ]
MadFish 13:17 22.12.2010

Сообщение от Sashok.vrn:
А что такое дисп-интерфейс?

http://msdn.microsoft.com/ru-ru/libr...8en-us%29.aspx [Ответ]
Sashok.vrn 20:12 22.12.2010
alexz,
MadFish,
В общем не получается разобраться,
в C++Builder есть компонент Office 2k, который позволяет очень удобно пользоваться интерфейсом Word до 2007 версии. Вы не знаете, как такой же компонент сделать для Word 2007? [Ответ]
peromax 23:51 22.12.2010
Есть еще вариант: Нажать запись макроса -> с помощью интерфейса Ворда вставить тестовую формулу -> Остановить и посмотреть код макроса.. И его уже с легкостью перевести на си++
Всегда при кодировании для офиса делал так, очень удобно.. А если что не понятно, что сгенерировал макрос, то msdn в помощь [Ответ]
g_beard 16:18 23.12.2010
а не проще иcпользовать MathType? [Ответ]
Hopkroft 16:56 23.12.2010

Сообщение от g_beard:
а не проще иcпользовать MathType?

Мне нравится ход мысли
Тем более на сайте вроде как есть
SDK для офиса.

P.S. А здесь само приложение. [Ответ]
Sashok.vrn 18:52 24.12.2010
alexz,
Hopkroft,
g_beard,
peromax,
В Word 2007 есть внутренний редактор формул. В MSDN есть пример работы с этим редактором на VB:
Dim objRange As Range
Dim objEq As OMath

Set objRange = Selection.Range
objRange.Text = "Celsius = (5/9)(Fahrenheit – 32)"
Set objRange = Selection.OMaths.Add(objRange)
Set objEq = objRange.OMaths(1)
objEq.BuildUp


Если перевести этот код на C++, то:

Variant vVarApp,vVarDocs,vVarParagraphs,vVarParagraph, vSelection, vTypeText;
....
vVarApp=CreateOleObject("Word.Application");//Открываем Word
vVarApp.OlePropertySet("Visible",true);
...
vVarDocs=vVarApp.OlePropertyGet("Documents");//Создаем новый документ
vVarDocs.OleProcedure("Add");
...
AnsiString f="S=n^2";//Текст формулы
...
Variant vRange;// Dim objRange As Range
Variant vEq;//Dim objEq As OMath

vRange=vVarApp.OlePropertyGet("Selection").OleProp ertyGet("Range");//Set objRange = Selection.Range
vRange.OlePropertySet("Text",f.c_str());//objRange.Text = "Celsius = (5/9)(Fahrenheit – 32)"
vVarApp.OlePropertyGet("Selection").OlePropertyGet ("OMaths").OleFunction("Add",vRange);
vEq=vRange.OlePropertyGet("OMaths");
vEq.OleFunction("BuildUp"); [Ответ]
Вверх