2015-11-06 35 views
1

我想列出在Word文檔中使用的所有字體顏色,將它們顯示爲彩色的ListViewItems。解析Word文檔中使用的顏色,用作ListViewItem的背景色 - 錯誤的顏色

我可以解析文檔並獲取所有獨特的字體顏色。

什麼不行? - 以正確的顏色獲取ListViewItems。 Grey35顯示爲黃色,綠色爲深綠色。

下面是該

var maxnum = doc.Words.Count; 
var ind = 0; 
foreach (Word.Range wd in doc.Content.Words) 
{ 
    if (!string.IsNullOrEmpty(wd.Text.Trim('\r', '\n', ' '))) 
    { 
     ind++; 
     bkwParseColors.ReportProgress(100*ind/maxnum, wd.Font.Color); 
    } 
} 

我有源代碼段和這裏就是我用它做:

private void bkwParseColors_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar1.Value = e.ProgressPercentage; 
    var color = (Word.WdColor)e.UserState; 
    var drin = lstColors.FindItemWithText(color.GetHashCode().ToString()); 
    if(drin==null) 
    { 
     var li = new ListViewItem(color.GetHashCode().ToString()); 
     li.BackColor = ColorTranslator.FromOle((int) color); 
     lstColors.Items.Add(li); 
    } 
} 

唉,而不是灰色的,我得到黃色,而不是Word的綠色,我得到一個黑色,全綠色,而不是淺灰色,我得到一個黑暗的50%灰色(至少非常黑暗)。唯一正確的顏色是黑色。

在調試過程中,我還發現第一個灰色,在ListView中轉換爲黃色,被列爲wdWhite。 : - ?

它幾乎看起來像我只獲得「全綵」與一些價值(亮度)失蹤。 有人能告訴我如何獲得正確的顏色?

使用Word 2010,VS社區2013,框架4.0。

編輯:我似乎越來越接近!

==>根據我是否使用點擊文本顏色時直接出現的「主題顏色」,或者是否單擊「更多顏色」,然後從色輪中選取一個,我的行爲是否有所不同?如果我從色輪着色文本,我似乎獲得了正確的值,包括灰色。如果我使用首先出現的默認調色板中的灰色,則將灰色表示爲「白色,背景1,較深的xx%」,這將解釋wdWhite。

不幸的是,這意味着文檔已經包含彩色文本,並且着色不在我的控制之下。所以我需要一種將「主題顏色」包含進去的方法。

EDIT2:看起來好像在回答我的問題就出在這裏:Office 2007 [and higher] interop: retrieve RGB-color 或者基本上在頁面鏈接有:http://www.wordarticles.com/Articles/Colours/2007.php#UIConsiderations

我會努力自己通過這個希望是越來越正確的顏色值從主題顏色。

+1

嘗試:Font.TextColor.RGB –

+0

@CindyMeister無差異存在。不適用於主題顏色。而我發現的VBA代碼是一個很難篩選的問題。 – LocEngineer

+1

有趣的是,對我來說,它挑選了「色輪」和主題顏色...無論如何,很高興你找到了解決方案,它看起來不錯:-) –

回答

2

現在得到滿意的結果。 我首先做的是

  1. 由pkuderov使用RgbColorRetriever類如 接受的答案,這個線程鏈接:Office 2007 [and higher] interop: retrieve RGB-color
  2. 由於導致系統顏色比字的顏色略深,我還應用了因爲在這個線程(第二個答案,而不是接受一個)提出帕維爾Vladov祛斑效果:C#: Create a lighter/darker color based on a system color

編輯唉,這似乎並不爲某些主題的灰色工作。不過,我需要它也與這些工作。

因此:替代的解決方案使用Open XML SDK

private void bkwParseColors_DoWork(object sender, DoWorkEventArgs e) 
{ 
    var docItem = (string) e.Argument; 
    using (var docx = WordprocessingDocument.Open(docItem, false)) 
    { 
     var ind = 0; 
     var maxnum = docx.MainDocumentPart.Document.Descendants<Run>().Count(); 
     foreach (Run rText in docx.MainDocumentPart.Document.Descendants<Run>()) 
     { 
      if (rText.RunProperties != null) 
      { 
       if (rText.RunProperties.Color != null) 
       { 
        ind++; 
        bkwParseColors.ReportProgress(100*ind/maxnum, rText.RunProperties.Color); 
       } 
      } 
     } 
    } 
} 

在正確的顏色創建的ListViewItem和存儲字的顏色值以及主題顏色進展變化的方法:

private void bkwParseColors_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar1.Value = e.ProgressPercentage; 

    var color = (DocumentFormat.OpenXml.Wordprocessing.Color)e.UserState; 
    var thema = ""; 
    if (color.ThemeColor!=null) 
     thema = color.ThemeColor.Value.ToString(); 

    var farbe = color.Val.Value; //hex RGB 
    var drin = lstColors.FindItemWithText(farbe); 
    if(drin==null) 
    { 
     var li = new myListItem 
     { 
      Design = thema, 
      Farbe = farbe, 
      Text = farbe, 
      BackColor = ColorTranslator.FromHtml("#" + farbe) 
     }; 
     lstColors.Items.Add(li); 
    } 
} 

一些附加的信息:我需要所有這一切,因爲我需要隱藏/取消隱藏某種顏色的文本,但該顏色從來不是確定的,即取決於客戶的興致和/或文檔中已經使用的顏色...

所以完井的緣故,這裏是我如何隱藏文檔中的所有文本,除了在選擇彩色文本:

private void bkwEinblenden_DoWork(object sender, DoWorkEventArgs e) 
{ 
    var args = (List<object>) e.Argument; 
    var pfad = (string) args[0]; 
    var color = (myListItem) args[1]; 
    using (var docx = WordprocessingDocument.Open(pfad, true)) 
    { 
     var ind = 0; 
     var maxnum = docx.MainDocumentPart.Document.Descendants<Run>().Count(); 
     foreach (Run rText in docx.MainDocumentPart.Document.Descendants<Run>()) 
     { 
      bkwEinblenden.ReportProgress(100*ind/maxnum); 
      var vanish = new Vanish() { Val = OnOffValue.FromBoolean(true) }; 
      if (rText.RunProperties == null) 
      { 
       var runProp = new RunProperties {Vanish = vanish}; 
       rText.RunProperties = runProp; 
      } 
      else 
      { 
       if (rText.RunProperties.Vanish == null) 
        rText.RunProperties.Vanish = vanish; 
       else 
       { 
        rText.RunProperties.Vanish.Val = OnOffValue.FromBoolean(true); 
       } 
      } 
      if (rText.RunProperties.Color != null) 
      { 
       if (rText.RunProperties.Color.Val == color.Farbe) 
       { 
        if (!string.IsNullOrEmpty(color.Design)) 
        { 
         if (rText.RunProperties.Color.ThemeColor.Value.ToString() == color.Design) 
         { 
          rText.RunProperties.Vanish.Val = OnOffValue.FromBoolean(false); 
         } 
        } 
        else 
        { 
         rText.RunProperties.Vanish.Val = OnOffValue.FromBoolean(false); 
        } 
       } 
      } 
     } 
    } 
} 
+0

@CindyMeister感謝您的想法。我想我會更好地嘗試使用Open XML SDK的新方法。我將更容易訪問使用的主題,並使用自定義的ListViewItem類來存儲所有必需的值。畢竟我需要用彩色物品做點什麼,而且我仍然遇到主題灰色的麻煩,因爲他們頑固地拒絕在以後的文檔中找到它。 Grrrr ... :) – LocEngineer