无法使用c#从word文件中读取符号

时间:2017-03-15 14:10:23

标签: c# interop

Word document

我无法在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);
}

如果有人知道,请帮助。

由于

1 个答案:

答案 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

enter image description here

您不会在此处看到mu字符,因为Console使用的字体没有为该char值定义的字形。