#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?
Комментариев нет:
Отправить комментарий