我无法在c#中使用Interop从单词中获取μ(alt + 230,U + 00B5)符号。
当我试图获得像document.characters[1].text
这样的文字时,这会显示“(”代替μ符号。
试图执行此操作:
for (var i = 1; i <= Document.Characters.Count; i++)
{
var chr = Document.Characters[i];
var ascii = (int) chr.Text[0];
Console.WriteLine(chr.Text);
}
如果有人知道,请帮助。
由于
答案 0 :(得分:1)
据我所知并且已经能够研究,不可能从插入符号对话框插入的字符中获取实际值,如解释here所示。
我怀疑互操作路由会给你这个字符我实现了XML路由(更好的是在这个阶段使用OpenXML,但我只是使用了我已经拥有的互操作)。
此代码示例为您处理的节点提供了文档中的文本,在本例中为<w:t>
和w:sym
节点。
var app = new Microsoft.Office.Interop.Word.Application();
var doc = app.Documents.Open(FileName: @"C:\Users\rschrieken\Downloads\character-safe.docx", Encoding: MsoEncoding.msoEncodingUSASCII);
// forget Interop, hello XML
var cd = XDocument.Parse(doc.WordOpenXML);
var w = (XNamespace)"http://schemas.openxmlformats.org/wordprocessingml/2006/main";
var sb = new StringBuilder();
foreach (var para in cd.Descendants(w + "p"))
{
foreach (var node in para.Descendants())
{
if (node.Name.LocalName == "t")
{
Console.Write(node.Value);
sb.Append(node.Value);
}
if (node.Name.LocalName == "sym")
{
var sym = node.Attribute(w + "char").Value;
// this will convert the hex value
var val = Convert.ToInt32(sym, 16);
// depending on your requirements, you might have to re-map this
// but I simply assume here that hex value is an valid Unicode char
Console.Write((char)val);
sb.Append((char) val);
}
}
Console.WriteLine();
sb.AppendLine();
}
// sb.ToString() gives you the text from the document
您不会在此处看到mu字符,因为Console使用的字体没有为该char值定义的字形。