Здравствуйте, програмисты.
Вынужден снова обратится к професионалам.
Вот такая заморочка :
Приложение (повторюсь) должно выдавать Ворд — документ.(что типа отчета)
Есть пример такого документа, но приложение должно "вставлять" в некоторые части этого документа меняющиеся данные.
Тоесть есть вариант в документ с помощью методов определенных в Microsoft.Office.Interop.Word "вставлять-заменять" что необходимо.
Но исходный (1-й) документ (шаблон) в котором будут расставлены "метки" где необходимо будет выполнить вставку-замену должен оставатся нетронутым.
Я ненашол — как мне программно на C# копировать Word — документ ?? (классы, методы, или как знаете)
Причом тут XML ??
Мне кажется что хранить шаблон бы ло бы "красивее" (так сказать "более по програмистски" (не придумал более подходящего слова)) в виде XML файла (в меру его некоторых приемуществ перед doc-фалом) и темболее не каждый обычний юзер , если он залезет в директорию с с установленым приложением рискнет клацать мышью на файл такого вида, а Ворд-файл с искушение откроет глянуть еще и напортачить что-то.
Насолько я понимаю (правильно ли это?)
Необходимо сохранить этот документ в XML формате. 2003 Word отлично это делает, но если просмотривать содержимое то там трудно разобраться.
Насколько возможно и КАК мне потом образовать из этого XML-файла DOC(WORD) — файл, опять же копируя его ??? (классы, методы, или как знаете)
Пытался расписать ситуацию для тех кому интересно, может кто то с этим сталкивался и может/хочет поделится своей идеей.
Кому так уж ОБЛОМ ЧИТАТЬ —
1) Я ненашол — как мне программно на C# копировать Word — документ ??
2) Насколько возможно и КАК мне образовать из XML-файла DOC(WORD) — файл, опять же копируя его ???
(классы, методы, или как знаете)
Здравствуйте, barabashka, Вы писали:
B>Здравствуйте, програмисты. B>Вынужден снова обратится к професионалам.
B>Вот такая заморочка : B>Приложение (повторюсь) должно выдавать Ворд — документ.(что типа отчета) B>Есть пример такого документа, но приложение должно "вставлять" в некоторые части этого документа меняющиеся данные. B>Тоесть есть вариант в документ с помощью методов определенных в Microsoft.Office.Interop.Word "вставлять-заменять" что необходимо. B>Но исходный (1-й) документ (шаблон) в котором будут расставлены "метки" где необходимо будет выполнить вставку-замену должен оставатся нетронутым.
При создании документа можно указать шаблон на основе которого будет создан документ.
я бы посоветовал копать в сторону VSTO
как то баловался с этой штукой, есть вроде рабочий код проекта в котором создан вордовый шаблон и при загрузке он заполняется из базы, в шаблоне простая таблица, котороая программно копируется на каждую запись в бд
если нужен код, могу вечерем выложить с пояснениями, просто на данный момент нет нужного компа под рукой.
Здравствуйте, Viper84, Вы писали:
V>Здравствуйте, barabashka,
V>я бы посоветовал копать в сторону VSTO V>как то баловался с этой штукой, есть вроде рабочий код проекта в котором создан вордовый шаблон и при загрузке он заполняется из базы, в шаблоне простая таблица, котороая программно копируется на каждую запись в бд V>если нужен код, могу вечерем выложить с пояснениями, просто на данный момент нет нужного компа под рукой.
V>удачи
Да копаю потихоньку это VSTO, в MSDN-е так неудобно написано ...
По поводу кода ... то буду очень благодарен, если незатруднит.
Здравствуйте, barabashka, Вы писали:
B>Да копаю потихоньку это VSTO, в MSDN-е так неудобно написано ...
B>По поводу кода ... то буду очень благодарен, если незатруднит.
согласен с доками не все так хорошо как хотелось бы, код вышлю часа через 3-5
После закрытия документа (WordDoc.Close(ref isSaveChanges, ref missing, ref missing);) сам Word то незакрывается,
но возникает вопрос как его закрыть, он остается висеть в процесах ("невидимый") для пользователя.
Посмотрел код ниже, это случайно не vsto 2005, на самом деле я писал под 2003, сегодня посмотрел еще 2005 но что-то он сильно отличается, может я что-то установил не то, но я так и не нашел шаблона проекта по созданию вордового шаблона с логикой на c#, по поводу кода создается проект "шаблон вордового дока" и в шаблоне рисуется табличка, далее в обработке дока:
данный кусок запускается при создании документа по вышеописанному шаблону
по поводу вопроса закрытия, у меня просто запускается шаблон вордовый и тут же заполняется данными и пользователь сам решает сохранить ему все ето дело или просто закрыть ворд
Здравствуйте, Viper84, Вы писали:
V>Здравствуйте, barabashka, Вы писали:
V>Посмотрел код ниже, это случайно не vsto 2005, на самом деле я писал под 2003, сегодня посмотрел еще 2005 но что-то он сильно отличается, может я что-то установил не то, но я так и не нашел шаблона проекта по созданию вордового шаблона с логикой на c#, по поводу кода создается проект "шаблон вордового дока" и в шаблоне рисуется табличка, далее в обработке дока:
...
Да это VSTO 2005, документация по подобным вопросам оставляет желать лучшего, в MSDNе и в Google рылся сегодня долго, и немогу похвастатся большими успехами (про MSDN кроме ругательст в голову вообще ниче н еприходит, в отношении этого вопроса).
Хоть ваш код и под 2003, надеюсь он поможет мне хоть как то с логико добавления таблиц.
кстати если word не является обязательным условием, то можно посмотреть в сторону infopath тож входит в состав 2003 офиса, по крайней мере под него писать намноко приятнее и возможностей дофига(можно даж на javascripte писать), и с доками соответственно тож много лучше
PS если подойдет то у меня есть примерчики (очень даж ничего по сравнению с вордом)
Здравствуйте, barabashka, Вы писали:
B> но возникает вопрос как его закрыть, он остается висеть в процесах ("невидимый") для пользователя.
WordApp.Selection.Find.Replacement.Text = " Found ";
Нельзя так обращаться с COM-объектами, для каждого COM-объекта, полученного через свойства, методы другого COM-объекта, вы должны после использования этого объекта вызвать метод Release (исп-я Marshal.ReleaseComObject).
Здравствуйте, Viper84, Вы писали:
V>Здравствуйте, barabashka, Вы писали:
V>кстати если word не является обязательным условием, то можно посмотреть в сторону infopath тож входит в состав 2003 офиса, по крайней мере под него писать намноко приятнее и возможностей дофига(можно даж на javascripte писать), и с доками соответственно тож много лучше
V>PS если подойдет то у меня есть примерчики (очень даж ничего по сравнению с вордом)
Незнаю даже, времени мало, и я ничего нечитал (непримомню что бы даже слышал) про infopath. Какие его возможности, для чего он ? В моей задаче есть необходимостьв результате получить Word-документ, посколько пользователь (лабарант, технолог ХОЧЕТ получать именно Вордовский документ, ему с ним привычнее, удобнее работать)
Но если можете(/хочете) поделится знаниями(/инфой) буду блягодарен, всетаки для общего развития, лишним небудет.
Здравствуйте, AlexZu, Вы писали:
AZ>Здравствуйте, barabashka, Вы писали:
B>> но возникает вопрос как его закрыть, он остается висеть в процесах ("невидимый") для пользователя.
AZ>
AZ>WordApp.Selection.Find.Replacement.Text = " Found ";
AZ>
AZ>Нельзя так обращаться с COM-объектами, для каждого COM-объекта, полученного через свойства, методы другого COM-объекта, вы должны после использования этого объекта вызвать метод Release (исп-я Marshal.ReleaseComObject).
Извините, мне трудно спорить с вами поскольку я в этом деле только новичок, но я основывался на MSDN-е, исходя из выших слов он (MSDN) врет чтоли ?
Здравствуйте, barabashka, Вы писали:
B>Но если можете(/хочете) поделится знаниями(/инфой) буду блягодарен, всетаки для общего развития, лишним небудет.
по сути это простые формы похожие на вордовый документ которые могут поддерживать логику на с# или javascript, интерфейс работы с ними достаточно понятен как и с вордом, большой уклон в сторону интерактивности, с печатью работает нормально, есть возможность публиковать на iis и sharepoint portal, но пробовал токо с iis, хранится в формате xml, печать работает также как и в ворде, попозже могу примерчик накидать, могет подойдет.
AZ>>WordApp.Selection.Find.Replacement.Text = " Found ";
AZ>>
AZ>>Нельзя так обращаться с COM-объектами, для каждого COM-объекта, полученного через свойства, методы другого COM-объекта, вы должны после использования этого объекта вызвать метод Release (исп-я Marshal.ReleaseComObject).
B>Извините, мне трудно спорить с вами поскольку я в этом деле только новичок, но я основывался на MSDN-е, исходя из выших слов он (MSDN) врет чтоли ?
Врет наверное слишком сильно сказано, но вводит в заблуждение, это точно. Сознательно это делается (напр. чтобы код не загромождали не относящиеся к теме детали), или есть еще какие причины (тупой копи-паст с VB примеров)
К сожалению, таких некорректных примеров (для .NET) в MSDN полно.
Здравствуйте, AlexZu, Вы писали:
AZ>Здравствуйте, barabashka, Вы писали:
AZ>>>
AZ>>>WordApp.Selection.Find.Replacement.Text = " Found ";
AZ>>>
AZ>>>Нельзя так обращаться с COM-объектами, для каждого COM-объекта, полученного через свойства, методы другого COM-объекта, вы должны после использования этого объекта вызвать метод Release (исп-я Marshal.ReleaseComObject).
B>>Извините, мне трудно спорить с вами поскольку я в этом деле только новичок, но я основывался на MSDN-е, исходя из выших слов он (MSDN) врет чтоли ?
AZ>Врет наверное слишком сильно сказано, но вводит в заблуждение, это точно. Сознательно это делается (напр. чтобы код не загромождали не относящиеся к теме детали), или есть еще какие причины (тупой копи-паст с VB примеров) AZ>К сожалению, таких некорректных примеров (для .NET) в MSDN полно.
Как я уже сказал — нимагу спорить.
В таком случае подскажите где можно посмотреть, или сами напишите как правильно обращаться, что ли
Думаю вы догадываетесь что я этого незнаю, и неособо "дружу" с COM технологией (так немного что то слышал, но серезно азов особо незнаю )
Здравствуйте, barabashka, Вы писали:
B>Как я уже сказал — нимагу спорить. B>В таком случае подскажите где можно посмотреть, или сами напишите как правильно обращаться, что ли B>Думаю вы догадываетесь что я этого незнаю, и неособо "дружу" с COM технологией (так немного что то слышал, но серезно азов особо незнаю )
Здравствуйте, barabashka, Вы писали:
B>Но если можете(/хочете) поделится знаниями(/инфой) буду блягодарен, всетаки для общего развития, лишним небудет.
как я уже говорил есть возможность писать на .net(на клиенте должен быть установлен .net & infopath 2003)
или на javascript(на клиенте соответственно нужен токо infopath 2003)
после установки всего етого должен появиться шаблон проектов infopath в vs2003, создаем шаблон по проекту
и у нас открывается проект в vs2003 и шаблон документа в infopath, накидываем контролов на формочку
каких угодно (полет фантазий) так же можно некоторые контролы привязать к данным из базы или веб службы,
в свойствах контролов можно найти обработчики событий при выборе которых создается обработчик в cs файле
пример обработчика дроп даун листа который модифицирует таблицу
// The following function handler is created by Microsoft Office InfoPath. Do not
// modify the type or number of arguments.
[InfoPathEventHandler(MatchPath="/my:myFields/my:поле3", EventType=InfoPathEventType.OnAfterChange)]
public void _43F__43E__43B__435_3_OnAfterChange(DataDOMEvent e)
{
// Write code here to restore the global state.if (e.IsUndoRedo)
{
// An undo or redo operation has occurred and the DOM is read-only.return;
}
// A field change has occurred and the DOM is writable. Write code here to respond
// to the changes.if(!flag)
{
IXMLDOMNode node = e.XDocument.DOM.selectSingleNode("/my:myFields/my:поле3");
DOMNodeList nodeList = e.XDocument.DOM.selectNodes("/my:myFields/my:группа5/my:группа6");
switch(node.text)
{
case"Add row":
IXMLDOMNode newRootNode = this.thisXDocument.DOM.createNode((object)XMLELEM_TYPE.XMLELEMTYPE_TEXT, "группа6", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-01-12T18-14-04");
IXMLDOMNode newNode1 = this.thisXDocument.DOM.createNode((object)XMLELEM_TYPE.XMLELEMTYPE_TEXT, "поле7", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-01-12T18-14-04");
newNode1.text = "Default value 1";
newRootNode.appendChild(newNode1);
IXMLDOMNode newNode2 = this.thisXDocument.DOM.createNode((object)XMLELEM_TYPE.XMLELEMTYPE_TEXT, "поле8", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-01-12T18-14-04");
newNode2.text = "Default value 2";
newRootNode.appendChild(newNode2);
IXMLDOMNode newNode3 = this.thisXDocument.DOM.createNode((object)XMLELEM_TYPE.XMLELEMTYPE_TEXT, "поле9", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-01-12T18-14-04");
newNode3.text = "Default value 3";
newRootNode.appendChild(newNode3);
e.XDocument.DOM.selectNodes("/my:myFields/my:группа5")[0].appendChild(newRootNode);
break;
case"Delete row":
e.XDocument.DOM.selectNodes("/my:myFields/my:группа5")[0].removeChild(nodeList[nodeList.length - 1]);
break;
case"Fill table":
foreach(IXMLDOMNode each in nodeList)
{
IXMLDOMNode col1 = each.selectSingleNode("my:поле7");
if(col1 != null && col1.text == string.Empty)
{
col1.text = "Default value 1";
}
if(col1 == null)
{
IXMLDOMNode newNode = this.thisXDocument.DOM.createNode((object)XMLELEM_TYPE.XMLELEMTYPE_TEXT, "поле7", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-01-12T18-14-04");
newNode.text = "Default value 1";
each.appendChild(newNode);
}
IXMLDOMNode col2 = each.selectSingleNode("my:поле8");
if(col2 != null && col2.text == string.Empty)
{
col2.text = "Default value 2";
}
if(col2 == null)
{
IXMLDOMNode newNode = this.thisXDocument.DOM.createNode((object)XMLELEM_TYPE.XMLELEMTYPE_TEXT, "поле8", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-01-12T18-14-04");
newNode.text = "Default value 2";
each.appendChild(newNode);
}
IXMLDOMNode col3 = each.selectSingleNode("my:поле9");
if(col3 != null && col3.text == string.Empty)
{
col3.text = "Default value 3";
}
if(col3 == null)
{
IXMLDOMNode newNode = this.thisXDocument.DOM.createNode((object)XMLELEM_TYPE.XMLELEMTYPE_TEXT, "поле9", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-01-12T18-14-04");
newNode.text = "Default value 3";
each.appendChild(newNode);
}
}
break;
}
flag = true;
}
else
{
flag = false;
}
}
Здравствуйте, barabashka, Вы писали:
B> но возникает вопрос как его закрыть, он остается висеть в процесах ("невидимый") для пользователя.
WordApp.Selection.Find.Replacement.Text = " Found ";
Нельзя так обращаться с COM-объектами, для каждого COM-объекта, полученного через свойства, методы другого COM-объекта, вы должны после использования этого объекта вызвать метод Release (исп-я Marshal.ReleaseComObject).
Мне казалось COM Wrapper-ы в .NET сами вызывают Release когда это нужно? По крайней мере так в MSDN пишут да и с точки зрения работы .NET это вполне реально выглядит