使用Microsoft.Office.Interop.Word在每行中加粗一部分字符串/范围

时间:2018-10-27 18:29:55

标签: c# .net winforms office-interop

我看到很少有代码将范围的一部分加粗,但是这些代码是特定于这些示例的。就我而言,我正在使用Microsoft.Office.Interop.Word将datagridview值写入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()(如果有条件,则第二个)。如果我使用其他范围或段,则会创建新的段落。

事实上datagrid视图dgblib行是逐行写入的,因此在每一行中,加粗的值都是动态的。下面是要编写的示例(如果行为3)。

这是要写入单词的行。评论:这些是评论。 (粗体字: 456

这是要写入该单词的第2行。评论:这些是评论。 (粗体字: 789

这是第3行要写入的单词。评论:这些是评论。 (粗体字: 123

1 个答案:

答案 0 :(得分:3)

和往常一样,有多种方法可以解决文本插入和格式设置问题。一种方法是存储或标记需要用不同格式设置的值,并在插入值后使用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;