Как добавить элементы по одному в новую строку в текстовом документе, используя взаимодействие слов
Я пытаюсь добавить эти три типа контента в слово док. Вот как я пытаюсь сделать это сейчас. Тем не менее, каждый элемент заменяет последний. Добавление изображений всегда добавляет в начало страницы. У меня есть цикл, который вызывает функцию для создания заголовков и таблиц, а затем добавляет изображения после. Я думаю, что проблема заключается в диапазонах. Я использую начальный диапазон объекта start = 0;
Как я могу получить их, чтобы добавить по одному к новой строке в документе?
foreach (var category in observedColumns)
{
CreateHeadersAndTables();
createPictures();
}
Добавление заголовков:
object start = 0;
Word.Range rng = doc.Range(ref start , Missing.Value);
Word.Paragraph heading;
heading = doc.Content.Paragraphs.Add(Missing.Value);
heading.Range.Text = category;
heading.Range.InsertParagraphAfter();
Добавление таблиц:
Word.Table table;
table = doc.Content.Tables.Add(rng, 1, 5);
Добавление картинок:
doc.Application.Selection.InlineShapes.AddPicture(@path);
1 ответ
Простой подход будет использовать абзацы для обработки Range
объекты и просто вставить новый абзац по одному.
Просмотр документации API показывает, что Paragraphs
реализует Add
метод, который:
Возвращает объект Paragraph, который представляет новый пустой абзац, добавленный в документ. (...) Если Range не указан, новый абзац добавляется после выделения, диапазона или в конце документа.
Таким образом, становится проще добавлять новый контент в документ.
Для полноты я включил пример, который показывает, как решение может работать. Образец проходит через for
цикл, и для каждой итерации он вставляет:
- Новая строка текста
- Стол
- Картинка
Пример реализован как консольное приложение C# с использованием:
- .NET 4.5
- Библиотека объектов Microsoft Office версии 15.0 и
- Библиотека объектов Microsoft Word версии 15.0
... то есть MS Word Interop API, который поставляется с MS Office 2013.
using System;
using System.IO;
using Microsoft.Office.Interop.Word;
using Application = Microsoft.Office.Interop.Word.Application;
namespace StackruWordInterop
{
class Program
{
static void Main()
{
// Open word and a docx file
var wordApplication = new Application() { Visible = true };
var document = wordApplication.Documents.Open(@"C:\Users\myUserName\Documents\document.docx", Visible: true);
// "10" is chosen by random - select a value that fits your purpose
for (var i = 0; i < 10; i++)
{
// Insert text
var pText = document.Paragraphs.Add();
pText.Format.SpaceAfter = 10f;
pText.Range.Text = String.Format("This is line #{0}", i);
pText.Range.InsertParagraphAfter();
// Insert table
var pTable = document.Paragraphs.Add();
pTable.Format.SpaceAfter = 10f;
var table = document.Tables.Add(pTable.Range, 2, 3, WdDefaultTableBehavior.wdWord9TableBehavior);
for (var r = 1; r <= table.Rows.Count; r++)
for (var c = 1; c <= table.Columns.Count; c++)
table.Cell(r, c).Range.Text = String.Format("This is cell {0} in table #{1}", String.Format("({0},{1})", r,c) , i);
// Insert picture
var pPicture = document.Paragraphs.Add();
pPicture.Format.SpaceAfter = 10f;
document.InlineShapes.AddPicture(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "img_1.png"), Range: pPicture.Range);
}
// Some console ascii-UI
Console.WriteLine("Press any key to save document and close word..");
Console.ReadLine();
// Save settings
document.Save();
// Close word
wordApplication.Quit();
}
}
}