【问题标题】:How do I write bold text to a Word document programmatically without bolding the entire document?如何在不加粗整个文档的情况下以编程方式将粗体文本写入 Word 文档?
【发布时间】:2020-03-08 03:32:20
【问题描述】:

我的程序需要以 Office .doc 格式(非 XML)生成高度简单的报告,并且文档的某些部分需要加粗。我一直在查看defining ranges 的文档,这部分是我的代码目前派生出来的。 This 文档的一部分并没有真正给我足够的细节来在我的文档中实现这一点。到目前为止,这是我的代码:

object miss = System.Reflection.Missing.Value;
object Visible = true;
object start = 0;

Microsoft.Office.Interop.Word.Application WordApp = new Microsoft.Office.Interop.Word.Application();
Document report = WordApp.Documents.Add(ref miss, ref miss, ref miss, ref miss);

String header = "Bold Header: ";
Range headerRange = report.Range(ref start, ref miss);
headerRange.Text = header;
headerRange.Font.Bold = -1;

String data = "Information underneath the header";
Range dataRange = report.Range();
dataRange.Text = data;
dataRange.Font.Bold = 1;

object filename = "test.doc";

report.SaveAs(ref filename, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss);
object saveChanges = Microsoft.Office.Interop.Word.WdSaveOptions.wdPromptToSaveChanges;
object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdWordDocument;
object routeDocument = true;
WordApp.Visible = true;

这将生成一个仅包含文本 **Information underneath the header** 的 word 文档。这是一个简单的例子。

我的文档不会比这更复杂,但我希望生成基于可变数据量的 Word 文档,粗体文本和非粗体文本分散在各处。

【问题讨论】:

  • 我想你想要这个:msdn.microsoft.com/en-us/library/… 这是一个Selection 对象,而不是一个范围。
  • 除了this,还有其他文档或示例吗?再一次,这些例子并不是那么好。

标签: c# ms-word


【解决方案1】:

Here 是我想出的答案,它允许您在同一字符串中使用粗体和常规字符串的一部分。

我所做的是自动化的,但如果您知道自己在做什么,这同样适用。还要记住,粗体只是一个 int,没有布尔值 true/false(出于某种原因)。

根据里卡多的观点,我也会在这里发布代码:

private void InsertMultiFormatParagraph(string psText, int piSize, int piSpaceAfter = 10) {
    Word.Paragraph para = mdocWord.Content.Paragraphs.Add(ref mobjMissing);

    para.Range.Text = psText;
    // Explicitly set this to "not bold"
    para.Range.Font.Bold = 0;
    para.Range.Font.Size = piSize;
    para.Format.SpaceAfter = piSpaceAfter;

    object objStart = para.Range.Start;
    object objEnd = para.Range.Start + psText.IndexOf(":");

    Word.Range rngBold = mdocWord.Range(ref objStart, ref objEnd);
    rngBold.Bold = 1;

    para.Range.InsertParagraphAfter();
}

显然,如果您想进一步抽象这一点,您可以为charstring 添加一个参数,这样您就可以更改用于设置粗体开始/停止的参数。

在另一个线程的 cmets 中讨论过的一件值得注意的事情是,由于某种原因,Bold 只是一个 int。没有用于设置的布尔值。这很奇怪,我知道。

【讨论】:

  • 如果您愿意,请在此处将该答案中的代码发布到您的答案中,以便我们以与该问题相关的方式进行讨论。
  • 不用担心。我目前正在尝试将此代码用于测试应用程序,但我会在接下来的几天内发布它的工作原理。
  • 我接受了您的回答,因为它确实符合我在原始问题中提出的要求。我相信我的需求实际上会非常复杂,因此可能需要更复杂的方法,相对于 Interop.Word 中存在的复杂程度,但到目前为止,您的想法是我所拥有的最好的。
  • 当我不得不实现它时,我正在从 XML 生成的数据结构生成报告。我一次最多只写几行,尤其是通过这种方法。祝你好运!
  • 谢谢你帮了我很多!
【解决方案2】:

您可以简单地使用段落对象来自定义不同文本块的格式。示例代码如下:

object DocumentEndIndex = "\\endofdoc";
object endDocument = wordDocument.Bookmarks.get_Item(ref DocumentEndIndex).Range;
Paragraph para = wordDocument.Content.Paragraphs.Add(ref endDocument);
para.Range.Text = text;
para.Range.set_Style(ref headingLevel);
// do format the text with para.Range object as you want
para.Range.InsertParagraphAfter();

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    这是一个老问题,但由于我遇到了同样的问题,这并没有帮助我修改页眉或页脚,但帮助我弄清楚了如何去做,这是我的解决方案:

    Word.Paragraph p = c2.Range.Paragraphs.Add(ref missing);
    p.Range.Text = "your trip at " + sejour.Location;
    SetTextColor(p.Range, Word.WdColor.wdColorWhite,0, p.Range.Text.Length - 1);
    SetTextSize(p.Range, (float)14, 0, p.Range.Text.Length - 1);
    SetTextSize(p.Range, (float)16, p.Range.Text.Length - 2 - sejour.Location.Length, sejour.Location.Length);
    
    public void SetTextColor( Word.Range range, Microsoft.Office.Interop.Word.WdColor color, int start, int length)
    {
        Word.Range rng = range;
        rng.Start = range.Start + start;
        rng.End = range.Start + start + length;
        rng.Font.Color = color;
    }
    
    public void SetTextSize(Word.Range range, float size, int start, int length)
    {
        Word.Range rng = range;
        rng.Start = range.Start + start;
        rng.End = range.Start + start + length;
        rng.Font.Size = size;
    }
    

    【讨论】:

    • 您确定此代码会将文档文本加粗吗?因为看起来字体大小更改功能和粗体不一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2010-10-08
    相关资源
    最近更新 更多