Как: добавление нескольких таблиц в Word с помощью .net - PullRequest
2 голосов
/ 09 августа 2011

Я пытаюсь добавить несколько таблиц в текстовый документ, используя c #

// Tables is a list of items which I want to present each in a table
foreach (List<string[]> ClassTable in Tables)
        {
            // tbl is a "Microsoft.Office.Interop.Word.Table"
            // myRange is like MyDoc.Range(ref missing, ref missing)
            tbl = MyDoc.Tables.Add(myRange, ClassTable.Count(), 3, missing, missing);
            tbl.Borders.Enable = 1;
            RowCounter = 1;
            foreach (string[] item in TableContent)
            {
                ColumnCounter = 1;
                foreach (string str in item)
                {
                    tbl.Cell(RowCounter, ColumnCounter).Range.Text = str;
                    ColumnCounter++;
                }
                RowCounter++;
            }
        }

этот код добавляет только одну таблицу, всякий раз, когда во втором цикле я должен создать другую таблицу и добавить значения следующих элементов в

Я пытаюсь изменить Range с помощью myRange.start или myRange.setRange () ... и т. Д. Все они терпят неудачу, только одна таблица добавляется в событие документа, если создается много строк в одной таблице, но не в нескольких таблицах

1 Ответ

5 голосов
/ 09 августа 2011

Линия

tbl = MyDoc.Tables.Add(myRange, ClassTable.Count(), 3, missing, missing); 

выдает исключение во второй раз, когда выполняется с сообщением «Диапазон не может быть удален». Word исключает это исключение, но останавливает дальнейшее выполнение. Добавление в try / catch и установка breakboint помогли бы вам.

Я изменил ваш код следующим образом, чтобы воспроизвести и найти возникшее исключение:

    var myRange = Globals.ThisAddIn.Application.ActiveDocument.Range();
    foreach (List<List<string>> ClassTable in new List<List<List<string>>> { new List<List<string>> { new List<string> { "A" }, new List<string> { "B" } }, new List<List<string>> { new List<string> { "C" }, new List<string> { "D" } } })
    {
        // tbl is a "Microsoft.Office.Interop.Word.Table"            
        // myRange is like MyDoc.Range(ref missing, ref missing)            
        Microsoft.Office.Interop.Word.Table tbl = null;
        try
        {
            tbl = Globals.ThisAddIn.Application.ActiveDocument.Tables.Add(myRange, ClassTable.Count(), 3);

            tbl.Borders.Enable = 1;
            int RowCounter = 1;
            foreach (var item in ClassTable)
            {
                int ColumnCounter = 1;
                foreach (string str in item)
                {
                    tbl.Cell(RowCounter, ColumnCounter).Range.Text = str;
                    ColumnCounter++;
                }
                RowCounter++;
            }
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine(ex.Message);
        }
 }

документы в состоянии MSDN :

Обязательный объект Range. Диапазон, в котором вы хотите, чтобы таблица появилась. Таблица заменяет диапазон, если диапазон не свернут.

Что оказывается необходимым, так это то, что вы «двигаетесь» до конца диапазона, свернув его. Если вы это сделаете, вы столкнетесь с проблемой другого слова: если у вас есть 2 таблицы сразу после каждого другого слова в документе, они автоматически объединятся в 1 таблицу. Ваш фиксированный код в конечном итоге будет добавлять все больше строк в 1 таблицу и постоянно перезаписывать первые несколько строк значениями. Все это приводит к следующему коду, который должен решить вашу проблему:

    var myRange = Globals.ThisAddIn.Application.ActiveDocument.Range();
    foreach (List<List<string>> ClassTable in new List<List<List<string>>> { new List<List<string>> { new List<string> { "A" }, new List<string> { "B" } }, new List<List<string>> { new List<string> { "C" }, new List<string> { "D" } } })
    {
        // tbl is a "Microsoft.Office.Interop.Word.Table"            
        // myRange is like MyDoc.Range(ref missing, ref missing)            

        Microsoft.Office.Interop.Word.Table tbl = null;
        try
        {
            tbl = Globals.ThisAddIn.Application.ActiveDocument.Tables.Add(myRange, ClassTable.Count(), 3);

            tbl.Borders.Enable = 1;
            int RowCounter = 1;
            foreach (var item in ClassTable)
            {
                int ColumnCounter = 1;
                foreach (string str in item)
                {
                    tbl.Cell(RowCounter, ColumnCounter).Range.Text = str;
                    ColumnCounter++;
                }
                RowCounter++;
            }

            // Move to the end
            myRange.Collapse(Microsoft.Office.Interop.Word.WdCollapseDirection.wdCollapseEnd);
            // Now add something behind the table to prevent word from joining tables into one
            myRange.InsertParagraphAfter();
            // gosh need to move to the end again
            myRange.Collapse(Microsoft.Office.Interop.Word.WdCollapseDirection.wdCollapseEnd);

        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine(ex.Message);
        }

    }

Последнее предупреждение: первая строка в этом сегменте гласит:

var myRange = Globals.ThisAddIn.Application.ActiveDocument.Range();

Добавление таблицы в этот диапазон будет работать, если документ пустой, в противном случае будет выдано то же исключение, поскольку в этом случае мы не находимся в конце. .Collapse () также разрешит его там.

...