2012-10-21 41 views
6

Sto lavorando a un programma in C# che utilizza Microsoft Word 14.0 Object Library per creare un file .doc, aggiungere paragrafi e salvarlo. C'è una piccola forma con un pulsante che descrive le azioni (vedi il codice sotto). Questa parte non ha problemi.Come aggiungere caratteri pedice in paragrafi utilizzando Word Automation?

Problema:

testo attuale nel file di parola creata sarà il seguente:

Alcuni testo beff = 3.0

Che cosa ho bisogno per raggiungere, è la creazione di un paragrafo, che ha pedice caratteri all'interno . (nel paragrafo sopra lettere "eff" dovrebbe essere pedice):

enter image description here

L'fi il documento nal conterrebbe circa 100 righe come sopra, con caratteri diversi che sono iscritti.

ho trovato un modo per pedice l'intero paragrafo con la linea,

paragraph1.Range.Font.Subscript = 1; 

ma non ha trovato modo di attuarla su personaggi separati.

Sono anche consapevole del fatto che ci sono lettere e numeri di pedice in Unicode che potrei usare, ma, sfortunatamente, Unicode non ha alfabeto completo nel formato pedice, quindi non è nemmeno un'opzione.

Domanda: C'è un modo per raggiungere l'obiettivo e inserire qualcosa come "eff" in subscript all'interno di un paragrafo in un documento di Word appena creato?

codice di esempio:

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

risposta

4

Creare un documento Word e aggiungere del testo con subscipt/apice e decomprimere il .docx di esaminare il suo contenuto XML si noterà che il testo che contiene il pedice/apice è collocato in una separata corsa elemento.

Un modo per raggiungere questo obiettivo è OpenXML SDK .Una volta che avete scaricato e installato l'SDK è possibile utilizzare il seguente codice:

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:

Ed ecco una soluzione di interoperabilità:

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 creare una macro di Word, che simula il processo che si desidera. Al termine, guarda il codice VBA che crea. Quel codice ti darà il/le cosa sul funzionamento degli intervalli che devono essere chiamati.

3

È possibile giocare con il punto iniziale e finale dell'intervallo per fare quel lavoro, e persino trovare il compensare.

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

Spero che sia d'aiuto.

Problemi correlati