2016-12-14 4 views
0

У меня есть код VBA, который выполняет итерацию через документ для удаления таблиц из документа. Следующий код работает отлично в VBA:Итерации через документ Microsoft Word для поиска и замены таблиц

Set wrdDoc = ThisDocument 
With wrdDoc 
    For Each tbl In wrdDoc.Tables 
     tbl.Select 
     Selection.Delete 
    Next tbl 
End With 

К сожалению, я не могу легко перевести этот код на C#, предположительно потому, что существует новый метод Range.Find. Вот три вещи, которые я пробовал, каждая неудача.

Первая попытка (переписана кода VBA):

foreach (var item in doc.Tables) 
{ 
    item.Delete; //NOPE! No "Delete" function. 
} 

Я попытался это:

doc = app.Documents.Open(sourceFolderAndFile); //sourceFolderAndFile opens a standard word document. 
var rng = doc.Tables; 
foreach(var item in rng) 
{ 
    item.Delete; //NOPE! No "Delete" function. 
} 

Я также попытался это:

doc = app.Documents.Open(sourceFolderAndFile); //sourceFolderAndFile opens a standard word document. 
var rng = doc.Tables; 
Range.Find.Execute(... //NOPE! No Range.Find available for the table collection. 
... 

Может кто-то пожалуйста, помогите я понимаю, как я могу использовать C# и Word Interop (Word 2013 и 2016) для итерации по документу, поиска таблицы, а затем за формировать функцию, например, выбирать ее, удалять или заменять?

Спасибо!

ответ

0

Мне потребовалось некоторое время, чтобы понять этот ответ. Со всеми примерами кода в Интернете я пропустил необходимость создания приложения. Для потомков, вот как я решил проблему.

  1. Убедитесь, что вы есть с помощью заявления, как это:

    с использованием MSWord = Microsoft.Office.Interop.Word;

  2. Открыть документ, а затем работать с новой ссылкой msWord, диапазоном и таблицей. Я обеспечить основной пример ниже:

     //open the document. 
         doc = app.Documents.Open(sourceFolderAndFile, ReadOnly: true, ConfirmConversions: false); 
    
         //iterate through the tables and delete them. 
         foreach (MsWord.Table table in doc.Tables) 
         { 
          //select the area where the table is located and delete it. 
          MsWord.Range rng = table.Range; 
          rng.SetRange(table.Range.End, table.Range.End); 
          table.Delete(); 
         } 
    
         //don't forget doc.close and app.quit to clean up memory. 
    

Вы можете использовать диапазон (ГСЧ), чтобы заменить таблицу с другими элементами, как текст, изображения и т.д.

+0

Может быть, вы должны использовать в обратном направлении для цикл? Это то, что вы обычно делаете, когда хотите удалить элементы из коллекции. Почему вы используете SetRange? – Jbjstam

+0

Насколько я могу судить, нет необходимости делать обратный цикл, поскольку все таблицы находятся от начала до конца. Что касается SetRange, это лучший способ (насколько я могу судить) выбрать таблицу, а затем удалить ее. Если у вас есть лучший вариант, я все уши :) – Bill

 Смежные вопросы

  • Нет связанных вопросов^_^