2012-10-21 12 views
6

Ich arbeite an einem Programm in C#, das Microsoft Word 14.0-Objektbibliothek verwendet, um eine DOC-Datei zu erstellen, Absätze hinzuzufügen und zu speichern. Es gibt ein kleines Formular mit einer Schaltfläche, die Aktionen beschreibt (siehe Code unten). Dieser Teil hat keine Probleme.Wie fügen Sie tiefgestellte Zeichen in Absätzen mithilfe von Word Automation hinzu?

Problem:

Gültiger Text in erstellt Word-Datei wird die folgende:

Einige Text beff = 3,0

Was ich erreichen muss, einen Absatz zu schaffen, die Zeichen in Tiefstellung hat .

enter image description here

Der fi: (in Absatz oben Buchstaben "eff" sollte indexiert werden) Das letzte Dokument würde etwa 100 Zeilen wie oben enthalten, mit unterschiedlichen Zeichen, die indiziert sind.

ich einen Weg, den ganzen Absatz mit Linie SUBSCRIPT gefunden,

paragraph1.Range.Font.Subscript = 1; 

fand aber keinen Weg, um es auf separaten Zeichen zu implementieren.

Ich bin mir auch bewusst, dass es tiefgestellte Buchstaben und Zahlen in Unicode gibt, die ich verwenden könnte, aber leider hat Unicode nicht volles Alphabet im Indexformat, also ist das auch keine Option.

Frage: Gibt es eine Möglichkeit für mich, das Ziel zu erreichen und etwas wie "eff" in einen Absatz in einem frisch erstellten Word-Dokument einzufügen?

Beispielcode:

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

Antwort

4

erstellen Word-Dokument und fügen Sie Text mit subscipt/Exponent und entpacken Sie die DOCX es ist XML-Inhalt zu untersuchen, werden Sie feststellen, dass der Text der Index/Exponent enthält, in einem separaten Lauf Element platziert wird.

Eine Möglichkeit, dies zu erreichen, ist OpenXML SDK .Sobald Sie heruntergeladen und installiert haben das SDK Sie den folgenden Code verwenden:

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:

Und hier ist ein Interop Lösung:

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

In Word ein Word-Makro erstellen, die den Prozess simuliert Sie wollen. Wenn Sie fertig sind, schauen Sie sich den erstellten VBA-Code an. Dieser Code gibt Ihnen das Was/Wie bei der Arbeit der Interops, die aufgerufen werden müssen.

3

Sie können mit dem Start- und Endpunkt des Bereichs spielen, um diese Aufgabe zu erledigen, und sogar die finden Offset.

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

Ich hoffe, es hilft.