2011-04-11 17 views
6

böyle C# interop.word kullanarak aynı paragrafta içine 2 farklı biçimlerini eklemek anlamaya çalışıyorum:farklı biçim Interop.word

merhaba gezegen earth burada ne var Ben size belge oDoc olarak tanımlanan varsayarsak

cevap

5

yapmak istiyorum, aşağıdaki kod size istenen sonucu almak gerekir:

Word.Paragraph oPara = oDoc.Content.Paragraphs.Add(ref oMissing); 
oPara.Range.Text = "hello planet earth here's what I want to do"; 
object oStart = oPara.Range.Start + 13; 
object oEnd = oPara.Range.Start + 18; 

Word.Range rBold = oDoc.Range(ref oStart, ref oEnd); 
rBold.Bold = 1; 
+0

+1 işe yarayacak gibi görünüyor, ancak stil stili yapmak için bir yol olmalı ve ardından stilleri uygulamak zorunda kalmadan karakterleri ekleyin. – Rup

+0

Bana göre +1 Dennis –

4

benim için işe gitmek için biraz Dennis'in cevabını değiştirmek zorunda kaldı .

Ne yaptığımı tamamen otomatik, bu yüzden yalnızca değişkenlerle çalışmak zorundayım.

private void InsertMultiFormatParagraph(string text, int size, int spaceAfter = 10) { 
    var para = docWord.Content.Paragraphs.Add(ref objMissing); 

    para.Range.Text  = text; 
    // Explicitly set this to "not bold" 
    para.Range.Font.Bold = 0; 
    para.Range.Font.Size = size; 
    para.Format.SpaceAfter = spaceAfter; 

    var start = para.Range.Start; 
    var end = para.Range.Start + text.IndexOf(":"); 

    var rngBold = docWord.Range(ref objStart, ref objEnd); 
    rngBold.Bold = 1; 

    para.Range.InsertParagraphAfter(); 
} 

beni bu yazı yazmak istemiyordum yapılan temel fark

yazı değiştirilir SONRA Paragraf ekleneceği olmasıydı. İlk düşüncem, SpaceAfter özelliğini ayarladıktan sonra eklemek oldu, ancak objStart ve objEnd değerleri "OutOfRange" Özel Durumlarını atıyordu. Biraz karşı sezgisel, bu yüzden herkesin bildiğinden emin olmak istedim.

+0

“Cevabını henüz yorumlayamıyorum” IMO yeni bir kod öneriyor veya önemsiz olmayan bir değişiklik yapıyorsa, yeni bir cevap yine de bunu yapmak için doğru yoldur. Yine de '.Bold' değerleri için kullanılacak doğru/yanlış sabitler olduğundan şüpheleniyorum. – Rup

+0

Aynı şeyleri de düşünüyordum, Bold (Italic, Underline, vb.) Hariç hepsi DataType int'nin Özellikleridir. 1 "true", 0 "false" olur. Varsayılan değeri -1'e, yani üçüncü bir "unset" seçeneği var. Office Interops ile olan her şey gibi, bunun nasıl çalışacağını nasıl karşılayacağınız konusunda da sezgisel. Tüm eski kodlar, yeni başlayanlar için (benim gibi) çalışmayı biraz zorlaştırıyor. – krillgar

2

Aşağıdaki kod, paragraf içindeki belirli bir seçimi biçimlendirirken en iyi şekilde çalışmış görünmektedir. Bir seçim yapmak için Word'ün "bul" işlevinde yerleşik, daha sonra yalnızca seçilen metni biçimlendirmek. Bu yaklaşım, yalnızca seçilecek metin, belgenin içinde benzersiz bir dize olduğunda iyi çalışır. Fakat çoğu durumda karşılaştığım için bu işe yarıyor. Eğer bir paragrafın içine düşüyorsa metin dizesi bir veritabanı, bir switch ifadesi, ya da başka bir yöntemle geliyorsa

 oWord.Selection.Find.Text = Variable_Containing_Text_to_Select; 
     oWord.Selection.Find.Execute(); 
     oWord.Selection.Font.Bold = 1; 

, o zaman sadece bir değişken dize içine metni bırakın ve find yürütmek için kullanabilirsiniz işlevi.

Bu birinin işe yaramasını umarız!

1

Bu gönderinin eski olduğunu biliyorum, ancak neredeyse tüm aramalarımda çıktı. Aşağıdaki cevap, benim gibi birinin, bir cümlede birden fazla kelime için bunu yapmak istemesidir. Bu durumda, dizeleri içeren ve kalın o metni değiştirmek değişkenlerin bir dize dizisi ile ben döngü - Yani, değişken ile temsil her dize kalın olacak joshman1019

string[] makeBold = new string[4] {a, b, c, d}; 

foreach (string s in makeBold) 
{ 
    wApp.Selection.Find.Text = s; //changes with each iteration 
    wApp.Selection.Find.Execute(); 
    wApp.Selection.Font.Bold = 1; 
    wApp.Selection.Collapse(); //used to 'clear' the selection 
    wApp.Selection.Find.ClearFormatting(); 
} 

@ oynamamıza. Yani, a = "hello world", Hello World Word belgesinde kalın yazılır. Umarım birileri zaman kaybeder.

0

Bu eski bir ileti dizisi olduğunu biliyorum, ancak yine de Google'a (benim yaptığım gibi) rastlayanlar için buraya posta gönderebileceğimi düşündüm. Krillgar'ın yaklaşımıyla bir çözüme ulaşmanın çoğunu buldum, ancak bazı metinlerim yeni satırlar içerdiğinden sorun yaşadım. Buna göre, bu değişiklik benim için en iyi çalıştı:

private void WriteText(string text) 
    { 
     var para = doc.Content.Paragraphs.Add(); 
     var start = para.Range.Start; 
     var end = para.Range.Start + text.IndexOf(":"); 
     para.Range.Text = text; 
     para.Range.Font.Bold = 0; 
     para.Range.InsertParagraphAfter(); 

     if(text.Contains(":")){ 
      var rngBold = doc.Range(start, end); 
      rngBold.Bold = 1; 
     } 
    } 

önemli fark ben başlangıç ​​ve önceki işlevinde sonunu hesaplamak olmasıdır. Parmağımı üzerine koyamıyorum ama sanırım yeni metninizde yeni satırlar varsa, daha sonra başlangıç ​​/ bitiş hesaplaması bir şeyleri karıştırıyor.

Ve açıkçası benim çözüm biçimi ile metin için tasarlanmıştır:

Etiket: Veri

Etiket kalın edilecektir.

0

Parametre olarak Microsoft.Office.Interop.Word.WdCollapseDirection.wdCollapseEnd ile Range.Collapse kullanımını düşünün. Bu, bir sonraki metnin önceki metinden farklı biçimlendirmeye sahip olmasını sağlar (ve sonraki metin biçimlendirmesi, bir önceki'un biçimlendirmesini etkilemez).