supernatik Ответов: 2

Создайте таблицу MS word, используя C#.


Привет,

У меня есть документ word, который содержит формы текстовых полей.
Я пытаюсь создать таблицу MS Word внутри одной из этих форм текстового поля.
Но у меня возникли проблемы с настройками диапазона.
(Microsoft.Офис.- Взаимодействия.Слово.WordRange диапазон = wordDoc.Shapes[wordShapeIndexes[id]].TextFrame.ContainingRange;
бросает exeption - индекс в указанную коллекцию выходит за рамки.), может кто-нибудь мне помочь, пожалуйста ?

Вот моя функция:
public void setWordShapeDataTask(int id, DataGridView data)
      {
          int tableRowNumber = data.RowCount + 1;
          Microsoft.Office.Interop.Word.Table wordTable;
          Microsoft.Office.Interop.Word.Range wordRange =  wordDoc.Shapes[wordShapeIndexes[id]].TextFrame.ContainingRange;

          wordTable = wordDoc.Tables.Add(wordRange, tableRowNumber, 5);

          wordTable.Cell(0, 0).Range.Text = "Num";
          wordTable.Cell(0, 1).Range.Text = "Task";
          wordTable.Cell(0, 2).Range.Text = "Recipiens";
          wordTable.Cell(0, 3).Range.Text = "Time";
          wordTable.Cell(0, 4).Range.Text = "Status";

          for (int i = 1, j = 0; i < tableRowNumber; i++, j++)
          {
              wordTable.Cell(i, 0).Range.Text = i.ToString();
              wordTable.Cell(i, 1).Range.Text = data.Rows[j].Cells["TaskBody"].Value.ToString();
              wordTable.Cell(i, 2).Range.Text = data.Rows[j].Cells["Recipiens"].Value.ToString();
              wordTable.Cell(i, 3).Range.Text = data.Rows[j].Cells["DueDate"].Value.ToString();
              wordTable.Cell(i, 4).Range.Text = data.Rows[j].Cells["Status"].Value.ToString();
          }
      }

2 Ответов

Рейтинг:
16

supernatik

public void setWordShapeDataTask(int id, DataGridView data)
        {
            try
            {
                int tableRowNumber = data.RowCount + 1;
                Microsoft.Office.Interop.Word.Table wordTable;
                foreach (Microsoft.Office.Interop.Word.Shape shape in wordDoc.Shapes)
                    if (shape.ID == wordShapeIndexes[id])
                    {
                        Microsoft.Office.Interop.Word.Range wordRange = shape.TextFrame.ContainingRange;

                        wordTable = wordDoc.Tables.Add(wordRange, tableRowNumber, 5);
                        //wordTable = wordDoc.Tables.Add(wordRange, 4, 5);
                        wordTable.Range.Font.Size = 8;
                        wordTable.set_Style("Table Grid 8");

                        wordTable.Cell(1, 1).Range.Text = "Num";
                        wordTable.Cell(1, 2).Range.Text = "Task";
                        wordTable.Cell(1, 3).Range.Text = "Recipiens";
                        wordTable.Cell(1, 4).Range.Text = "Time";
                        wordTable.Cell(1, 5).Range.Text = "Status";

                        for (int i = 2, j = 0; i <= tableRowNumber; i++, j++)
                        {
                            wordTable.Cell(i, 1).Range.Text = (i-1).ToString();
                            wordTable.Cell(i, 2).Range.Text = data.Rows[j].Cells["TaskBody"].Value.ToString();
                            wordTable.Cell(i, 3).Range.Text = data.Rows[j].Cells["Recipiens"].Value.ToString();
                            wordTable.Cell(i, 4).Range.Text = data.Rows[j].Cells["DueDate"].Value.ToString();
                            wordTable.Cell(i, 5).Range.Text = data.Rows[j].Cells["Status"].Value.ToString();
                        }
                    }
            }
            catch (Exception)
            {
            }

        }


Рейтинг:
1

Sandeep Mewara

Похоже, вы переходите от индекса 1 к tableRowNumber для строк данных. Он должен начинаться с 0 до rowCount.
Попробуй:

// with int tableRowNumber = data.RowCount + 1;
for (int i = 0; i < tableRowNumber-1; i++)


Sandeep Mewara

Даже тогда следующее вызовет ошибку индекса:
данные.Строки[i].Ячейки, когда i=tableRowNumber наибольшее значение.
As tableRowNumber = rowCount+1 ... таким образом, вы пытаетесь получить доступ к строке в индексе, который не существует.

Начните с 1 для i, но идите до 1 меньше tableRowNumber. Экс:
for (int i = 1; i < tableRowNumber-1; i++)

supernatik

Спасибо за ваш ответ, я исправил проблему i = 0, добавил j.
Но моя первоначальная проблема заключается в создании таблицы внутри формы текстового поля.
У меня есть эксепция с диапазоном.

Microsoft.Офис.- Взаимодействия.Слово.WordRange диапазон = wordDoc.Shapes[wordShapeIndexes[id]].TextFrame.ContainingRange;