Выделите часть строки / диапазона в каждой строке, используя Microsoft.Office.Interop.Word - PullRequest
0 голосов
/ 27 октября 2018

Я видел несколько кодов для выделения части диапазона, но они характерны для этих примеров. В моем случае я записываю значения datagridview в word, используя Microsoft.Office.Interop.Word. Я хочу выделить определенное значение жирным шрифтом / курсивом. Я использую следующий код.

        Microsoft.Office.Interop.Word.Application objword = new Microsoft.Office.Interop.Word.Application();
        objword.WindowState = Microsoft.Office.Interop.Word.WdWindowState.wdWindowStateNormal;
        Microsoft.Office.Interop.Word.Document objDoc = objword.Documents.Add();

        Microsoft.Office.Interop.Word.Paragraph para1;
        para1 = objDoc.Paragraphs.Add();
        String text = "";
        for (int r = 0; r < dgvlib.RowCount; r++)
        {
            text = text + dgvlib.Rows[r].Cells[1].Value.ToString();
            if (dgvlib.Rows[r].Cells[11].Value.ToString()!="")
                text = text +  " Comments:" + dgvlib.Rows[r].Cells[11].Value.ToString() + " ";
            if (dgvlib.Rows[r].Cells[10].Value.ToString() != "")
                text = text +  " ( Bold Text:" + dgvlib.Rows[r].Cells[10].Value.ToString() + ")";
            text = text + "\n";
        }
        para1.Range.Font.Size = 9;
        para1.Range.Font.Name = "Arial";
        para1.Range.Text = text;
        para1.Range.Paragraphs.Add();
        objDoc.SaveAs2(fNameExportWord);
        objword.Visible = true;

Я хочу выделить только этот текст dgvlib.Rows [r] .Cells [10] .Value.ToString () (второе условие if). Если я использую разные диапазоны или параграфы, тогда создаются новые абзацы.

Фактически, в виде таблицы данных строки dgblib записываются построчно, поэтому в каждой новой строке значение, выделенное жирным шрифтом, является динамическим. Пример для записи приведен ниже (если строк 3).

это строка для записи в слово. Комментарии: это комментарии. (Текст, выделенный жирным шрифтом: 456 )

это строка 2, которую нужно записать в слово. Комментарии: это комментарии. (Текст, выделенный жирным шрифтом: 789 )

это строка 3, которая должна быть записана в слово. Комментарии: это комментарии. (Текст, выделенный жирным шрифтом: 123 )

1 Ответ

0 голосов
/ 28 октября 2018

Как всегда, есть несколько способов решить проблему с вставкой и форматированием текста. Один из способов - сохранить или пометить значения, которые должны быть отформатированы по-разному, и, после их вставки, использовать Find, чтобы найти их и применить это форматирование.

Другой способ, который демонстрирует приведенный ниже пример кода, в основном заключается в том, что пытается сделать код в вопросе: форматировать при вставке текста. Однако это не позволяет вставлять весь текст в виде строки. Текст должен быть разбит на части: каждый раздел, требующий различного форматирования, должен быть вставлен индивидуально.

Для этого необходимо работать с Range объектами. В примере кода используются два объекта Range: один для всего нового содержимого и один для вставки фрагментов текста. При добавлении нового контента в Range, если с ним ничего не нужно делать, можно использовать метод InsertAfter.

Как только новым контентом нужно каким-то образом манипулировать, необходимо сначала «свернуть» Range до «точки», а затем добавить новый контент. На этом этапе Range содержит только новое содержимое, поэтому любое примененное форматирование влияет только на новое содержимое.

В примере кода я старался максимально приблизиться к оригиналу, чтобы было легче понять и понять его относительно оригинала - чтобы он не был оптимизирован ...

    Microsoft.Office.Interop.Word.Application objword = new Microsoft.Office.Interop.Word.Application();
    objword.WindowState = Microsoft.Office.Interop.Word.WdWindowState.wdWindowStateNormal;
    Microsoft.Office.Interop.Word.Document objDoc = objword.Documents.Add();

    Microsoft.Office.Interop.Word.Range rngFull = objDoc.Content;
    Microsoft.Office.Interop.Word.Range rngTarget = rngFull.Duplicate;
    rngTarget.InsertAfter("\n");
    object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;
    rngTarget.Collapse(ref oCollapseEnd);

    String text = "";
    for (int r = 0; r < dgvlib.RowCount; r++)
    {
        text = text + dgvlib.Rows[r].Cells[1].Value.ToString();
        if (dgvlib.Rows[r].Cells[11].Value.ToString()!="")
        {
            text = text +  " Comments:" + dgvlib.Rows[r].Cells[11].Value.ToString() + " ";
            rngTarget.InsertAfter(text);
            text = "";
            rngTarget.Collapse(ref oCollapseEnd);
        }
        else if (dgvlib.Rows[r].Cells[10].Value.ToString() != "")
        {
            text = text +  " ( Bold Text:";
            rngTarget.InsertAfter(text);
            text = "";
            rngTarget.Collapse(ref oCollapseEnd);
            rngTarget.Text = dgvlib.Rows[r].Cells[10].Value.ToString();
            rngTarget.Font.Bold = -1;
            rngTarget.Collapse(ref oCollapseEnd);
            rngTarget.InsertAfter(")");
            rngTarget.Font.Bold = 0;
        }
        text = text + "\n";
    }
    rngFull.Font.Size = 9;
    rngFull.Font.Name = "Arial";
    //para1.Range.Text = text;
    //rngFull.Paragraphs.Add();
    objDoc.SaveAs2(fNameExportWord);
    objword.Visible = true;
...