2012-10-21 32 views
6

Tôi đang làm việc trên một chương trình trong C# sử dụng Thư viện đối tượng Microsoft Word 14.0 để tạo tệp .doc, thêm đoạn văn vào nó và lưu nó. Có một hình thức nhỏ với một nút mà không mô tả hành động (xem mã dưới đây). Phần này không có vấn đề gì.Làm cách nào để thêm ký tự subscript trong các đoạn văn bằng Word Automation?

Vấn đề:

văn bản hiện tại trong file word tạo ra sẽ như sau:

Một số văn bản beff = 3,0

Những gì tôi cần phải hoàn thành, đang tạo ra một đoạn, mà đã subscript ký tự bên trong . (ở đoạn trên chữ "eff" nên được subscripted):

enter image description here

Các fi tài liệu nal sẽ chứa khoảng 100 dòng như trên, với các ký tự khác nhau được chỉ định.

Tôi tìm thấy một cách subscript toàn bộ đoạn với dòng,

paragraph1.Range.Font.Subscript = 1; 

nhưng thấy không có cách nào để thực hiện nó trên nhân vật riêng biệt.

Tôi cũng biết rằng có các chữ cái con số và số trong Unicode mà tôi có thể sử dụng, nhưng thật không may, Unicode không có bảng chữ cái đầy đủ ở định dạng chỉ số, do đó cũng không phải là một tùy chọn.

Câu hỏi: Có cách nào để tôi hoàn thành Mục tiêu và chèn thứ gì đó như "eff" vào chỉ số bên trong một đoạn trong Tài liệu Word mới được tạo không?

Mẫu mã:

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

Trả lời

4

Tạo tài liệu Word và thêm văn bản với subscipt/superscript và giải nén .docx để kiểm tra nội dung XML của bạn, bạn sẽ thấy rằng văn bản có chứa chỉ số/superscript được đặt trong phần tử chạy riêng biệt.

Một cách để đạt được điều này là OpenXML SDK .Sau khi bạn đã tải về và cài đặt SDK bạn có thể sử dụng đoạn mã sau:

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:

Và đây là một giải pháp Interop:

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

Trong Word tạo một Word Macro mô phỏng quá trình bạn muốn. Khi thực hiện xem xét mã VBA nó tạo ra. Mã đó sẽ cung cấp cho bạn những gì/như thế nào về công việc của các interops cần được gọi.

3

Bạn có thể chơi xung quanh với điểm bắt đầu và điểm kết thúc của phạm vi để hoàn thành công việc đó và thậm chí tìm thấy bù lại.

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

Hy vọng điều đó sẽ hữu ích.

Các vấn đề liên quan