.NET中使用OpenXML(WML)读取Word特殊符号显示异常的代码求助
解决OpenXML读取Word中Symbol字体符号显示错误的问题
问题根源在于Symbol字体的特殊字符映射机制:Word里使用Symbol字体的字符,是用普通ASCII字符(比如'a')通过字体映射渲染为特殊符号(比如α),直接读取<w:t>节点的文本只会拿到原始ASCII字符,而非显示的符号。要正确读取,需根据Symbol字体的映射规则转换字符。
核心转换逻辑
先定义Symbol字体到Unicode符号的映射字典(覆盖常用符号,可按需扩展):
private static readonly Dictionary<char, char> SymbolFontMapping = new Dictionary<char, char> { {'a', '\u03B1'}, // α {'b', '\u03B2'}, // β {'g', '\u03B3'}, // γ {'d', '\u03B4'}, // δ {'e', '\u03B5'}, // ε {'z', '\u03B6'}, // ζ {'h', '\u03B7'}, // η {'q', '\u03B8'}, // θ {'i', '\u03B9'}, // ι {'k', '\u03BA'}, // κ {'l', '\u03BB'}, // λ {'m', '\u03BC'}, // μ {'n', '\u03BD'}, // ν {'x', '\u03BE'}, // ξ {'o', '\u03BF'}, // ο {'p', '\u03C0'}, // π {'r', '\u03C1'}, // ρ {'s', '\u03C3'}, // σ {'t', '\u03C4'}, // τ {'u', '\u03C5'}, // υ {'f', '\u03C6'}, // φ {'c', '\u03C7'}, // χ {'y', '\u03C8'}, // ψ {'w', '\u03C9'}, // ω {'>', '\u003E'} // 大于号 };
完整读取代码
使用OpenXML SDK遍历文档段落,检查每个Run的字体样式,若为Symbol则转换字符:
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using System.Collections.Generic; using System.Text; using System.Linq; public static string ReadWordDocumentWithSymbolFont(string filePath) { StringBuilder contentBuilder = new StringBuilder(); using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, false)) { MainDocumentPart mainPart = doc.MainDocumentPart; if (mainPart == null) return string.Empty; foreach (Paragraph para in mainPart.Document.Body.Elements<Paragraph>()) { foreach (Run run in para.Elements<Run>()) { RunProperties runProps = run.RunProperties; bool isSymbolFont = false; // 检查Run是否应用了Symbol样式或直接设置了Symbol字体 if (runProps != null) { RunStyle runStyle = runProps.Elements<RunStyle>().FirstOrDefault(); if (runStyle != null && runStyle.Val.Value.Equals("Symbol", StringComparison.OrdinalIgnoreCase)) { isSymbolFont = true; } else { RunFonts runFonts = runProps.Elements<RunFonts>().FirstOrDefault(); if (runFonts != null && runFonts.Ascii.Value.Equals("Symbol", StringComparison.OrdinalIgnoreCase)) { isSymbolFont = true; } } } Text text = run.Elements<Text>().FirstOrDefault(); if (text != null) { string runText = text.Text; if (isSymbolFont) { StringBuilder convertedText = new StringBuilder(); foreach (char c in runText) { convertedText.Append(SymbolFontMapping.TryGetValue(c, out char mappedChar) ? mappedChar : c); } contentBuilder.Append(convertedText.ToString()); } else { contentBuilder.Append(runText); } } } contentBuilder.AppendLine(); } } return contentBuilder.ToString(); }
使用说明
- 确保项目已安装
DocumentFormat.OpenXmlNuGet包(版本2.0及以上均可) - 调用
ReadWordDocumentWithSymbolFont方法传入Word文档路径,即可得到正确转换后的文本,比如示例中的criteria of α>.70.会被正确读取。
内容的提问来源于stack exchange,提问作者Abul Hasan
相关产品推荐
相关产品推荐

