You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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();
}

使用说明

  1. 确保项目已安装DocumentFormat.OpenXml NuGet包(版本2.0及以上均可)
  2. 调用ReadWordDocumentWithSymbolFont方法传入Word文档路径,即可得到正确转换后的文本,比如示例中的criteria of α>.70.会被正确读取。

内容的提问来源于stack exchange,提问作者Abul Hasan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 12:02:38