解析 Word 文档中使用的颜色,用作 ListViewItem 的背景色 - 颜色错误
Parse colors used in Word document, use as backcolor for ListViewItem - wrong color
我正在尝试列出 Word 文档中使用的所有字体颜色,并将它们显示为彩色 ListViewItems。
我可以解析文档并获得所有独特的字体颜色。
什么不起作用? - 以正确的颜色获取 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。 :-??
看起来我只得到 "full colors",但缺少一些值(亮度)。
谁能告诉我如何获得正确的颜色?
使用 Word 2010、VS Community 2013、Framework 4.0。
编辑:我好像越来越近了!
==> 行为会有所不同,具体取决于我是使用 "theme colors" 为文本着色(在单击文本颜色时直接出现),还是单击 "More colors" 然后从色轮!如果我用色轮给文本上色,我似乎得到了正确的值,包括灰色。如果我使用首先出现的默认调色板中的灰色,则灰色表示为 "White, Background 1, darker xx%",这将解释 wdWhite。
不幸的是,这适用于已经包含彩色文本并且颜色不受我控制的文档。所以我需要一种方法将 "theme colors" 包含在其中。
Edit2: 看来我的问题的答案就在这里:Office 2007 [and higher] interop: retrieve RGB-color
或者基本上在链接的页面中:http://www.wordarticles.com/Articles/Colours/2007.php#UIConsiderations
我会自己解决这个问题,希望能从主题颜色中获得正确的颜色值。
现在得到了满意的结果。
我首先做的是
- 使用链接在 pkuderov 的 RgbColorRetriever class
此线程的已接受答案:Office 2007 [and higher] interop: retrieve RGB-color
- 由于生成的系统颜色比 Word 颜色稍暗,我额外应用了 Pavel 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并存储Word颜色值和主题颜色的进度更改方法:
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);
}
}
一些附加信息:我需要所有这些,因为我需要 hide/unhide 某种颜色的文本,但这种颜色永远不确定,即取决于客户的想法 and/or 颜色已在文档中使用...
所以为了完成,下面是我如何隐藏文档中除了选定颜色的文本之外的所有文本:
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);
}
}
}
}
}
}
我正在尝试列出 Word 文档中使用的所有字体颜色,并将它们显示为彩色 ListViewItems。
我可以解析文档并获得所有独特的字体颜色。
什么不起作用? - 以正确的颜色获取 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。 :-??
看起来我只得到 "full colors",但缺少一些值(亮度)。 谁能告诉我如何获得正确的颜色?
使用 Word 2010、VS Community 2013、Framework 4.0。
编辑:我好像越来越近了!
==> 行为会有所不同,具体取决于我是使用 "theme colors" 为文本着色(在单击文本颜色时直接出现),还是单击 "More colors" 然后从色轮!如果我用色轮给文本上色,我似乎得到了正确的值,包括灰色。如果我使用首先出现的默认调色板中的灰色,则灰色表示为 "White, Background 1, darker xx%",这将解释 wdWhite。
不幸的是,这适用于已经包含彩色文本并且颜色不受我控制的文档。所以我需要一种方法将 "theme colors" 包含在其中。
Edit2: 看来我的问题的答案就在这里:Office 2007 [and higher] interop: retrieve RGB-color 或者基本上在链接的页面中:http://www.wordarticles.com/Articles/Colours/2007.php#UIConsiderations
我会自己解决这个问题,希望能从主题颜色中获得正确的颜色值。
现在得到了满意的结果。 我首先做的是
- 使用链接在 pkuderov 的 RgbColorRetriever class 此线程的已接受答案:Office 2007 [and higher] interop: retrieve RGB-color
- 由于生成的系统颜色比 Word 颜色稍暗,我额外应用了 Pavel 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并存储Word颜色值和主题颜色的进度更改方法:
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);
}
}
一些附加信息:我需要所有这些,因为我需要 hide/unhide 某种颜色的文本,但这种颜色永远不确定,即取决于客户的想法 and/or 颜色已在文档中使用...
所以为了完成,下面是我如何隐藏文档中除了选定颜色的文本之外的所有文本:
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);
}
}
}
}
}
}