使用格式生成文档文本

时间:2014-05-28 10:43:59

标签: c# visual-studio-2013 vsto word-2010

更新后的尝试:

我已根据klugerama的回答尝试了以下内容,但它似乎并不适合我:

var entries = new List<string>();
entries.Add("some text here, ");
entries.Add("some more text here, ");
entries.Add("and even more text here. ");

foreach (var entry in entries)
{

    object newRangeStart = Globals.ThisDocument.bmkStart.Range.End;
    Globals.ThisDocument.bmkStart.Range.InsertAfter(entry);
    object newRangeEnd = Globals.ThisDocument.bmkStart.Range.End;
    var newRange = Globals.ThisDocument.Range(ref newRangeStart, ref newRangeEnd);

    if (entry == "some more text here, ")
    {
        newRange.Bold = -1;
    }
}

第一个问题是它向后插入文本,即:

  

以及更多文字。这里有一些文字,这里有一些文字,

而不是:

  

这里有一些文字,这里有更多文字,还有更多文字。

第二个问题是原始问题,因为没有添加粗体。我试图让输出成为:

  

这里有一些文字,这里有更多文字,还有更多文字。


原始问题:

我正在尝试创建一个操作窗格,为用户提供了许多选项。根据选定的选项,特定文本将插入到文档中。我能够非常快速,轻松地创建操作窗格部分和文本插入部分。但插入的文本没有任何格式。

插入文本的正确方法是什么,这样可以轻松地将文本格式添加到文本中(以编程方式)将插入到文档中?

目前,我正在做这样的事情来生成文本并将其插入到文档中,这使得难以应用格式:

if (CheckBox1.Checked == true)
{
    stMainText.Append("some text here, ");
}

if (CheckBox2.Checked == true)
{
    stMainText.Append("some more text here, ");
}

if (CheckBox3.Checked == true)
{
    stMainText.Append("and even more text here. ");
}

Globals.ThisDocument.bmkStart.Text = TheText.ToString();

如果选中了所有3个复选框,则输出类似于:

  

这里有一些文字,这里有更多文字,还有更多文字。

让我们说我希望插入文本如下(注意粗体):

  

这里有一些文字,这里有更多文字,还有更多文字。

我该怎么做?

我正在使用VS2013创建word文档级应用程序。

5 个答案:

答案 0 :(得分:2)

问题:插入文字的正确方法是什么,这样可以轻松地将文字格式添加到文本中(以编程方式),这些格式会插入到文档中?

答案:您需要提取范围附加文字和样式的范围。这可以通过下面提供的函数的out参数来解决。

/// <summary>
/// Appends text to a range
/// </summary>
/// <param name="range">The range to append text to.</param>
/// <param name="appendText">The text to append.</param>
/// <param name="appendedRange">The range of the appended text</param>
/// <returns>
/// The range of the combined old text and the appended text
/// </returns>
private Word.Range AppendToRange(Word.Range range, string appendText, out Word.Range appendedRange)
{
    // Fetch indexes
    object oldStartPosition = range.Start;           
    object oldEndPosition = range.End;
    object newEndPosition = (int)oldEndPosition + appendText.Length;

    // Append the text
    range.InsertAfter(appendText);

    // Define the range of the appended text
    appendedRange = Range(ref oldEndPosition, ref newEndPosition);

    // Return the range of the new combined range
    return Range(ref oldStartPosition, ref newEndPosition);
}

以下代码将在文档末尾附加文本,并允许样式化文本插入的多个部分:

object startCharacter = 0;
object endCharacter = Globals.ThisDocument.Characters.Count;
Word.Range textRange = Range(ref startCharacter, ref endCharacter);
Word.Range styleRange;

textRange = AppendToRange(textRange , "some text here, ", out styleRange);
styleRange.Bold = 0;
styleRange.Font.Name = "Verdana";
styleRange.Font.Size = 10.0F;

textRange = AppendToRange(textRange , "some more text here, ", out styleRange);
styleRange.Bold = -1;
styleRange.Font.Name = "Times New Roman";
styleRange.Font.Size = 10.0F;

textRange = AppendToRange(textRange , "and even more text here.", out styleRange);
styleRange.Bold = 0;
styleRange.Font.Name = "Verdana";
styleRange.Font.Size = 20.0F;

或者使用原始问题中的代码示例:

// Assumes stMainText is of type Word.Range
Word.Range styleRange;

if (CheckBox1.Checked == true)
{
    stMainText = AppendToRange(stMainText, "some text here, ", out styleRange);
    // Example styling of the inserted text below
    styleRange.Bold = 0;
    styleRange.Font.Name = "Verdana";
    styleRange.Font.Size = 20.0F;
}

if (CheckBox2.Checked == true)
{
    stMainText = AppendToRange(stMainText, "some more text here, ", out styleRange);
    // Example styling of the inserted text below
    styleRange.Bold = -1;
    styleRange.Font.Name = "Times New Roman";
    styleRange.Font.Size = 10.0F;
}

if (CheckBox3.Checked == true)
{
    stMainText = AppendToRange(stMainText, "and even more text here. ", out styleRange);
    // Add necessary styling here
}

答案 1 :(得分:0)

试试这个

sbMainText.Append("<b>some more text here</b>");

答案 2 :(得分:0)

这是Example。试试这个:

Globals.ThisDocument.bmkStart.Bold =  Globals.ThisDocument.WordTrue; 

为了使文本的一部分变为粗体,请example on MSDN

来自MSDN的代码:

private void BookmarkFormattedText()
{
     int WordTrue = 1;
     this.Paragraphs[1].Range.InsertParagraphBefore();
     this.Paragraphs[1].Range.InsertParagraphBefore();
     this.Paragraphs[1].Range.Text = "This is text in the " + "first paragraph.";
     this.Paragraphs[1].Range.Words[3].Bold = WordTrue;
     Microsoft.Office.Tools.Word.Bookmark bookmark1 =
               this.Controls.AddBookmark(this.Paragraphs[2].Range, "bookmark1");
     bookmark1.FormattedText = this.Paragraphs[1].Range.Words[3];
}

更新:我修改了klugerama answer,如下所示:

void FormatText()
{
   var entries = new List<string>();
   entries.Add("some text here, ");
   entries.Add("some more text here, ");
   entries.Add("and even more text here. ");

   foreach (var entry in entries)
   {
        object newRangeStart = Globals.ThisDocument.Paragraphs[1].Range.End-1;
        Globals.ThisDocument.Paragraphs[1].Range.InsertAfter(entry);
        object newRangeEnd = Globals.ThisDocument.Paragraphs[1].Range.End;
        var newRange = Globals.ThisDocument.Range(ref newRangeStart, ref newRangeEnd);

        if (entry == "some more text here, ")
        {                
             newRange.Bold = 1;
             //bookmark this range
             Microsoft.Office.Tools.Word.Bookmark bmkStart;
             bmkStart = this.Controls.AddBookmark(newRange, "RangeBookMark");
        }                
        else
             newRange.Bold = 0;
    }   
}

输出:

  

此处有一些文字,此处有更多文字,此处还有更多文字。

答案 3 :(得分:0)

您需要定义不同的Range对象,并为每个插入设置Bold属性为True。由于书签不会自动展开,因此您必须选择插入的文本,并创建具有相同名称的 new 书签,并将所选文本添加到该书签对象。请参阅this

object True = -1;
foreach (var entry in YourCollectionOfEntries)
{
    var bmkRange = Globals.ThisDocument.bmkStart.Range;
    object newRangeStart = bmkRange.End;
    bmkRange.InsertAfter(entry);
    bmkRange.Select();
    bmkRange = Globals.ThisDocument.Bookmarks.Add(Globals.ThisDocument.bmkStart.Name, Selection.Range);
    object newRangeEnd = bmkRange.End; 
    var newRange = Globals.ThisDocument.Range(ref newRangeStart, ref newRangeEnd);
    if (isBoldForThisEntry)
        newRange.Bold = True;
}

答案 4 :(得分:0)

尝试使用html以编程方式构建您想要的文本方式,然后从html文件中创建word文档。

使用 标记附加您想要加粗的内容。

请在html文档中创建单词时参考以下主题 Convert HTML To Word Document