0

我正在尝试使用 c#、DataSet 和 OpenXML 自动化邮件合并过程。在本地运行时,我有一个完整的工作示例。然而,当发布到我们的网络服务器时,我收到了拒绝访问错误,尽管我什至可以在任何地方授予完全控制权。

这是导致错误消息的代码:

        try
        {
            var strTemplateTestFile = strMergeBuildingLocation.Replace(".docx", "_Test.docx");

            // Don't continue if the template file name is not found
            if (!File.Exists(strTemplateFileName))
                throw new Exception("TemplateFileName (" + strTemplateFileName + ") does not exist");

            foreach (var dr in dsData.Tables[0].Rows)
            {

                    string strFileName;

                if (doesDestinationExist(strMergeBuildingLocation))
                {
                    File.Copy(strTemplateFileName, strTemplateTestFile, true);
                    strFileName = strTemplateTestFile;
                }
                else
                {
                    File.Copy(strTemplateFileName, strMergeBuildingLocation, true);
                    strFileName = strMergeBuildingLocation;
                }

                var pkg = Package.Open(strFileName, FileMode.Open, FileAccess.ReadWrite);
                using (var docGenerated = WordprocessingDocument.Open(pkg))

尝试打开 docGenerated 时,问题属于最后一行。

我收到的错误消息是:

拒绝访问路径“docx 路径”。

该文件按预期复制,并且可以手动打开和修改。文件夹中没有任何内容会限制对文件的访问。有没有人对问题可能有任何想法?

4

1 回答 1

0

我认为问题出在这一行。

var pkg = Package.Open(strFileName, FileMode.Open, FileAccess.ReadWrite);
            using (var docGenerated = WordprocessingDocument.Open(pkg))

在这里,您尝试打开文档两次。

尝试这个,

/* Open WordProcessing document package based on filename */
    //------------------------------------------------------------------------------------------------Start
    public static WordprocessingDocument OpenPackage(WordprocessingDocument package, string inputFileName, bool editable)
    {
        bool copied = false;
        while (!copied)
        {
            try
            {
                package = WordprocessingDocument.Open(inputFileName, editable);
                copied = true;
            }
            catch (Exception e)
            {
                if (e is FileFormatException)
                {
                    package = null;
                    break;
                }
                if (e is IOException)
                {
                    copied = false;
                }
                if (e is ZipException)
                {
                    package = null;
                    break;
                }
            }
        }

        return package;
    }

这将为您提供 WordprocessingDocument 包(如果存在且可用)。如果文件不存在,则返回null。如果文件被锁定,则在文件释放时打开包。希望这可以帮助。!谢谢!

于 2014-01-08T19:49:47.170 回答