【问题标题】:How to add subscript characters in paragraphs using Word Automation?如何使用 Word Automation 在段落中添加下标字符?
【发布时间】:2012-10-11 09:57:50
【问题描述】:

我正在使用 C# 编写一个程序,该程序使用 Microsoft Word 14.0 对象库来创建一个 .doc 文件,向其中添加段落并保存它。有一个带有按钮的小表单,可以执行所描述的操作(参见下面的代码)。这部分没有问题。

问题:

创建的word文件中的当前文本如下:

一些文本 beff = 3.0

我需要完成的是创建一个段落,里面有下标字符。(在上面的段落中,字母“eff”应该是下标):

最终的文档将包含大约 100 行与上述类似的行,并带有不同的下标字符。

我找到了一种用行为整个段落下标的方法,

paragraph1.Range.Font.Subscript = 1;

但没有办法在单独的字符上实现它。

我也知道我可以使用 Unicode 中的下标字母和数字,但不幸的是,Unicode 没有下标格式的完整字母,所以这也不是一个选择。

问题: 有没有办法让我完成目标并在新创建的 Word 文档的段落内的下标中插入类似“eff”的内容?

示例代码:

private void btnReport_Click(object sender, EventArgs e)
    {

        Word._Application oWord;
        Word._Document oDoc;
        oWord = new Word.Application();
        oDoc = oWord.Documents.Add();


        var paragraph1 = oDoc.Content.Paragraphs.Add();
        paragraph1.Range.Text = "Some text   beff = 3.0";

        SaveFileDialog saveFileDialog1 = new SaveFileDialog();
        saveFileDialog1.Filter = "Word document|*.doc";
        saveFileDialog1.Title = "Save the Word Document";
        if (DialogResult.OK == saveFileDialog1.ShowDialog())
        {
            string docName = saveFileDialog1.FileName;
            if (docName.Length > 0)
            {
                object oDocName = (object)docName;
                oDoc.SaveAs(ref oDocName);
            }
        }
        oWord.Quit();
    }

【问题讨论】:

    标签: c# ms-word automation paragraph subscript


    【解决方案1】:

    创建一个 Word 文档并添加带有下标/上标的文本并解压缩 .docx 以检查其 XML 内容,您会注意到包含下标/上标的文本被放置在单独的 run 元素中。

    实现此目的的一种方法是OpenXML SDK。下载并安装 SDK 后,您可以使用以下代码:

    using System;
    using DocumentFormat.OpenXml;
    using DocumentFormat.OpenXml.Packaging;
    using DocumentFormat.OpenXml.Wordprocessing;
    
    namespace OpenXML
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (var doc = WordprocessingDocument.Create("C:\\Subscript.docx", WordprocessingDocumentType.Document))
                {
                    MainDocumentPart mainPart = doc.AddMainDocumentPart();
    
                    mainPart.Document = new Document();
                    Body body = mainPart.Document.AppendChild(new Body());
                    Paragraph p = body.AppendChild(new Paragraph());
    
                    p.AppendChild(AddRun(false, "Some text   b "));
                    p.AppendChild(AddRun(true, "eff"));
                    p.AppendChild(AddRun(false, "= 3.0"));
                }
    
                Console.WriteLine("Done...");
                Console.ReadLine();
            }
    
            public static Run AddRun(bool isSubscript, string text)
            {
                Run run = new Run();
                if (isSubscript)
                {
                    var props = new RunProperties();
                    var fontSize = new FontSizeComplexScript() { Val = "20" };
                    var vAlignment = new VerticalTextAlignment() { Val = VerticalPositionValues.Subscript };
    
                    props.Append(fontSize);
                    props.Append(vAlignment);
                    run.Append(props);
                }
                run.Append(new Text(text));
                return run;
            }
        }
    }
    

    编辑:

    这是一个互操作解决方案:

        using WordNS = Microsoft.Office.Interop.Word;
    
        WordNS.Document doc = _application.ActiveDocument;
        WordNS.Paragraph p = doc.Paragraphs.Add();
        p.Range.Text = "Some text   beff = 3.0";
    
        int start = p.Range.Text.IndexOf("eff");
        int end = p.Range.Text.IndexOf("=");
    
        WordNS.Range range = doc.Range(start, end);
        range.Select();
    
        WordNS.Selection currentSelection = _application.Selection;
        currentSelection.Font.Subscript = 1;
    
        doc.SaveAs2("C:\\SubscriptInterop.docx");
    

    【讨论】:

      【解决方案2】:

      您可以使用范围的起点和终点来完成这项工作,甚至可以找到偏移量。

      Range range = paragraph1.Range;
      range.Text = "Some text   beff = 3.0";
      if (range.Text.Contains("eff ="))
      {
         range.Start = range.Start + range.Text.IndexOf("eff =");
         range.End = range.Start + 3;
         range.Font.Subscript = 1;
      }
      

      希望对你有帮助。

      【讨论】:

        【解决方案3】:

        在 Word 中创建一个 Word 宏来模拟您想要的过程。完成后查看它创建的 VBA 代码。该代码将为您提供需要调用的互操作的工作内容/方式。

        【讨论】:

          猜你喜欢
          • 2021-09-20
          • 1970-01-01
          • 1970-01-01
          • 2014-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-11
          相关资源
          最近更新 更多