#c_sharp #com #ms_word
Обновление: вопрос закрыт. К черту всё это. В ТЗ нет чётких указаний, поэтому заместо
таблицы вставлю текстовый список.
Имеется таблица в виде объекта DataTable. Нужно вставить её на место определённого
набора символов в документе-шаблоне.
Замену текст-на-текст можно выполнить так (куча missingObj нужан для обхода багов):
using Word = Microsoft.Office.Interop.Word;
Word._Application application;
Word._Document document;
Object missingObj = System.Reflection.Missing.Value;
Object trueObj = true;
Object falseObj = false;
private void create_button1_Click(object sender, EventArgs e) {
application = new Word.Application();
Object templatePathObj;
templatePathObj = "template.dot";
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;
}
object strToFindObj = "%метка%";
object replaceStrObj = "текст для вставки";
Word.Range wordRange;
object replaceTypeObj;
replaceTypeObj = Word.WdReplace.wdReplaceAll;
for (int i = 1; i <= document.Sections.Count; i++) {
wordRange = document.Sections[i].Range;
Word.Find wordFindObj = wordRange.Find;
object[] wordFindParameters = new object[15] { strToFindObj, missingObj,
missingObj, missingObj, missingObj, missingObj, missingObj, missingObj,
missingObj, replaceStrObj, replaceTypeObj, missingObj, missingObj,
missingObj, missingObj };
wordFindObj.GetType().InvokeMember("Execute", BindingFlags.InvokeMethod,
null, wordFindObj, wordFindParameters);
}
application.Visible = true;
}
Как следует скорректировать этот код, чтобы он принимал на вход таблицу и вносил
её в нужное место в документе?
В этом примере замена происходит внутри объекта Range, который представляет собой
фрагмент документа, который может полноценно описывать содержимое документа Word (таблицы,
форматирование).
UPD: Внесу ясность. В моей программе формируется объект DataTable, содержащий таблицу.
Нужно внутри документа Word вставить эту таблицу на место набора символов %метка%.
Ответы
Ответ 1
Начиная с .Net 4.0 улучшена поддержка COM и теперь все вызовы можно писать короче (без missingObj и ref): using Word = Microsoft.Office.Interop.Word; using System.Data; var dataTable = new DataTable(); // создаем и заполняем таблицу Word._Application wordApplication = new Word.Application(); Word._Document wordDocument = null; wordApplication.Visible = true; var templatePathObj = @"template.dot"; try { wordDocument = wordApplication.Documents.Add(templatePathObj); } catch (Exception exception) { if (wordDocument != null) { wordDocument.Close(false); wordDocument = null; } wordApplication.Quit(); wordApplication = null; throw; } wordApplication.Selection.Find.Execute("%метка%"); Word.Range wordRange = wordApplication.Selection.Range; var wordTable = wordDocument.Tables.Add(wordRange, dataTable.Rows.Count, dataTable.Columns.Count); for (var j = 0; j < dataTable.Rows.Count; j++) { for (var k = 0; k < dataTable.Columns.Count; k++) { wordTable.Cell(j + 1, k + 1).Range.Text = dataTable.Rows[j][k].ToString(); } }Ответ 2
Исходная задача не решается с помощью слияния данных MS Excel и MS Word?
Комментариев нет:
Отправить комментарий