Страницы

Поиск по вопросам

вторник, 16 октября 2018 г.

Как вставить таблицу в документ 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 вставить эту таблицу на место набора символов %метка%


Ответ

Начиная с .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(); } }

Комментариев нет:

Отправить комментарий