正在生成具有格式的文档文本

本文关键字:文档 文本 有格式 | 更新日期: 2023-09-27 18:05:44

更新尝试:

我尝试了以下基于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文档级应用程序。

正在生成具有格式的文档文本

问题:插入文本的正确方法是什么?它可以方便地为将插入文档的文本添加格式(按语法(?

答案:您需要提取附加文本的范围并设置该范围的样式。这可以通过下面提供的函数的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
}

试试这个

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

您需要定义一个不同的Range对象,并为每个插入将Bold属性设置为True。由于书签不会自动展开,因此必须选择插入的文本,然后创建一个同名的书签,并将所选文本添加到书签对象中。看看这个。

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;
}

尝试使用html以符合语法的方式构建文本,然后用html文件创建一个word文档。

标记附加要加粗的内容。

请参考以下关于从html文档中创建单词的帖子将HTML转换为Word文档

下面是示例。试试这个:

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

这里是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;
    }   
}

输出:

此处有一些文本,此处还有一些文本,甚至此处还有更多文本。