Обновление: вопрос закрыт. К черту всё это. В ТЗ нет чётких указаний, поэтому заместо таблицы вставлю текстовый список.
Имеется таблица в виде объекта 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();
}
}
Комментариев нет:
Отправить комментарий