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

使用Microsoft.Office.Interop.Word的Documents.Open()方法打开含#字符文件时相对路径报错问题

这个问题我之前也碰到过,本质是Word Interop对相对路径的解析逻辑在遇到特殊字符时触发了URI解析规则,导致文件路径被截断,让我给你详细拆解并给出解决方案:

问题根源

Microsoft.Office.Interop.Word的Documents.Open()方法在处理相对路径时,会默认采用类似URI(统一资源标识符)的解析规则。而#在URI中是锚点标记,会被视为路径的结束符——这就导致Word只会解析#之前的路径部分(也就是你报错信息里的C:\aaa\AzureTest_),完全忽略了#后面的文件名内容,自然找不到目标文件。

而使用绝对路径时,Word会明确识别这是本地文件系统路径,采用文件系统的解析规则,不会触发URI解析逻辑,所以能正常定位到包含#的文件。

解决方案

这里给你两种可行的解决办法,优先推荐第一种:

方法一:将相对路径转换为绝对路径(最稳妥)

在调用Documents.Open()之前,先把相对路径转换为绝对路径,彻底绕开URI解析的问题。可以使用System.IO.Path.GetFullPath()方法来实现:

using System.IO; // 需要添加这个命名空间

public void OpenDocument(string targetFileName)
{
    try
    {
        // 把相对路径转换为绝对路径
        string absoluteFilePath = Path.GetFullPath(targetFileName);
        object location = absoluteFilePath;
        docObject = appObject.Documents.Open(ref location, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
    }
    catch (COMException e)
    {
        Console.WriteLine(e.Message);
    }
    finally
    {
        // 别忘了释放Word对象,避免后台进程残留
        if (docObject != null)
        {
            docObject.Close();
            Marshal.ReleaseComObject(docObject);
        }
        if (appObject != null)
        {
            appObject.Quit();
            Marshal.ReleaseComObject(appObject);
        }
    }
}

方法二:对路径中的#进行URL编码(备选方案)

把路径中的#替换为URL编码值%23,让Word的URI解析逻辑能识别完整路径。不过这种方式依赖Word的解析兼容性,稳定性不如转绝对路径:

public void OpenDocument(string targetFileName)
{
    try
    {
        // 对#进行URL编码
        string encodedPath = targetFileName.Replace("#", "%23");
        object location = encodedPath;
        docObject = appObject.Documents.Open(ref location, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
    }
    catch (COMException e)
    {
        Console.WriteLine(e.Message);
    }
}

额外提醒

使用Office Interop时,一定要记得在操作完成后释放COM对象并退出Word进程,否则会导致Word后台进程残留,占用系统资源。

内容的提问来源于stack exchange,提问作者Zhouping Wang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:52:04