Страницы

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

вторник, 10 декабря 2019 г.

Как вставить таблицу в документ Word на место текстовой метки?

#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?

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

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