2012-10-21 87 views
6

我正在使用C#中的一個程序,它使用Microsoft Word 14.0 Object Library創建一個.doc文件,爲它添加段落並保存它。有一個帶有按鈕的小表單,用於描述操作(請參閱下面的代碼)。這部分沒有問題。如何使用Word Automation在段落中添加下標字符?

問題:

中創建的Word文件中當前的文本將是以下幾點:

一些文本貝夫= 3.0

我需要完成,正在創造一個段落,這裏面標字符是什麼(在上面的段落字母 「EFF」 應當被下標):

enter image description here

的音響nal文檔將包含大約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(); 
    } 

回答

4

創建一個Word文檔,並與subscipt /標添加文字和解壓的.docx檢查它的XML內容,你會發現含標/上標文本放在一個單獨的運行元素。實現這一

一種方法是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

在Word中創建一個Word宏來模擬你想要的過程。完成後查看它創建的VBA代碼。這段代碼將會告訴你需要調用哪些interop的工作。

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

希望它有幫助。

相關問題