2012-10-21 19 views
6

Microsoft Word 14.0 Object Libraryを使用して.docファイルを作成し、段落を追加して保存するC#のプログラムで作業しています。説明されたアクションを行うボタンが付いた小さなフォームがあります(下のコードを参照)。この部分は問題ありません。Wordオートメーションを使用して段落に下付き文字を追加する方法は?

問題:作成したWordファイルで

現在のテキストは、次のことになります。私は達成するために必要なもの

をいくつかのテキストbeff = 3.0

は、内部の文字を添字た段落を、作成しています。(手紙上の段落で "EFF" 添字されなければならない):Fiの

enter image description here

上記のような行が約100行含まれていて、異なる文字が添え​​字になっています。

私は、行と段落全体を添字する方法を発見し

paragraph1.Range.Font.Subscript = 1; 

が、別の文字の上にそれを実装する方法を発見しました。

私は使用できるUnicodeの添え字と数字があることも知っていますが、残念ながら、Unicodeは添字形式のフルアルファベットを持っていません。

質問:ゴールを達成し、新たに作成されたWord文書の段落の下付き文字に「eff」のようなものを挿入する方法はありますか?

サンプルコード:Wordで

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

答えて

4

は、Word文書を作成し、subscipt /上付き文字テキストを追加し、それはあなたが下付き/上付きを含むテキストが別々の実行要素に配置されていることがわかりますXMLコンテンツです検討するの.docxを解凍します。これを達成するための

一つの方法は、OpenXML SDK .Onceであるあなたは、次のコードを使用することができます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; 
     } 
    } 
} 

EDIT:

そして、ここでは、相互運用ソリューションです:

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

したいプロセスをシミュレートしたWordのマクロを作成します。完了したら、それを作成するVBAコードを見てください。そのコードは、呼び出される必要のあるinteropsの作業について、どのように/どのようにするのでしょうか。

3

範囲の開始点と終了点を使って遊んで、そのジョブを完了させたり、オフセット。

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

希望します。

関連する問題