调用office com 引起的奇怪问题!

时间:2021-06-24 00:28:43
最近有一个需求是这样的!将某一目录中的office文件。excel,ppt,doc 三种类型的office文件。通过服务转换为html格式。
在本地测试中没有发现任何问题。可以完美执行。当部署到服务器上之后,发现只有excel格式可以实现转换。另外两种格式都出现 未将对象引用实例的错误。百思不得其解,望高手给予指导!

服务器环境:
1、已安装office
2、GAC里面看到有相应的office dll存在
3、服务所在目录和文件所在目录均为G盘。G盘为共享磁盘

采用过的处理办法:
1、怀疑是com组件权限问题,在管理工具--组件服务里面。均对excel,ppt,doc组件设置了。everyone权限。故障依旧
2、怀疑是共享磁盘引起的问题,将服务以及文件都放置D盘(D盘不是共享目录)。故障依旧

附上程序代码:

using System;
using System.Collections.Generic;
using System.Text;
using SXT.Common.Win;
//引用office Com组件
using Microsoft.Office.Core;
using Microsoft.Office.Interop.Excel;
using Microsoft.Office.Interop.PowerPoint;
using Microsoft.Office.Interop.Word;

namespace ExperienceCenter
{
    /// <summary>
    /// Office文档转换类,通过文件上传方式得到上传的文档后,调用此方法生成Html静态Office文件
    /// </summary>
    public class OfficeHtmlConvert
    {

        /// <summary>
        /// 将PPT文件转换成HTML格式
        /// </summary>
        /// <param name="PptFilePath">PPT文件路径</param>
        public static void PptToHtmlFile(string PptFilePath, string targetPath)
        {
            Microsoft.Office.Interop.PowerPoint.Application ppt = new Microsoft.Office.Interop.PowerPoint.Application();
            Microsoft.Office.Interop.PowerPoint.Presentation pptFile = null;
            try
            {
                //获得html文件名
                string htmlFileName = targetPath;
                //打开一个ppt文件
                pptFile = ppt.Presentations.Open(PptFilePath, Microsoft.Office.Core.MsoTriState.msoTrue,
                    Microsoft.Office.Core.MsoTriState.msoCTrue, Microsoft.Office.Core.MsoTriState.msoFalse);
                //转换成html格式
                pptFile.SaveAs(htmlFileName, Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsHTML,
                    Microsoft.Office.Core.MsoTriState.msoCTrue);
            }
            finally
            {
                if (pptFile != null)
                {
                    pptFile.Close();
                }
                ppt.Quit();
                GC.Collect();
            }
        }


        /// <summary>
        /// 将Excel文件转换成HTML格式
        /// </summary>
        /// <param name="ExcelFilePath">Excel文件路径</param>
        public static void ExcelToHtmlFile(string ExcelFilePath, string targetPath)
        {
            Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbook oBook = null;
            // 缺省参数 
            object Unknown = Type.Missing;
            try
            {
                //目标html文件路径
                object Target = targetPath;
                //为了保险,只读方式打开 
                object readOnly = true;
                // 指定另存为格式(html) 
                object format = Microsoft.Office.Interop.Excel.XlFileFormat.xlHtml;

                //打开Excel文件
                oBook = excelApp.Workbooks.Open(ExcelFilePath, Unknown, readOnly,
                    Unknown, Unknown, Unknown, Unknown, Unknown, Unknown,
                    Unknown, Unknown, Unknown, Unknown, Unknown, Unknown);

                // 转换格式 
                oBook.SaveAs(Target, format, Unknown, Unknown, Unknown, Unknown,
                     Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
                     Unknown, Unknown, Unknown, Unknown, Unknown);
            }
            finally
            {
                if (oBook != null)
                {
                    oBook.Close(false, Unknown, Unknown);
                }
                excelApp.Quit();
                GC.Collect();
            }
        }

        /// <summary>
        /// 将Word文档转换成HTML格式
        /// </summary>
        /// <param name="WordFilePath">Word文档格式</param>
        public static void WordToHtmlFile(string WordFilePath, string targetPath)
        {
            Microsoft.Office.Interop.Word.Application newApp = new Microsoft.Office.Interop.Word.Application();
            Microsoft.Office.Interop.Word.Document doc = null;
            // 缺省参数 
            object Unknown = Type.Missing;
            try
            {
                // 指定原文件和目标文件 
                object Source = WordFilePath;
                object Target = targetPath;
                //为了保险,只读方式打开 
                object readOnly = true;
                // 指定另存为格式(html) 
                object format = Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatHTML;

                // 打开doc文件 
                doc = newApp.Documents.Open(ref Source, ref Unknown, ref readOnly,
                    ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown,
                    ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown);

                // 转换格式 
                doc.SaveAs(ref Target, ref format,
                    ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown,
                    ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown);
            }
            finally
            {
                if (doc != null)
                {
                    // 关闭文档和Word程序 
                    doc.Close(ref Unknown, ref Unknown, ref Unknown);
                }
                newApp.Quit(ref Unknown, ref Unknown, ref Unknown);
                GC.Collect();
            }
        }

        /// <summary>
        /// 生成文件对应的HTML版本(没有考虑HTML文件已经存在的处理)
        /// </summary>
        /// <param name="fileFullName">文件路径</param>
        /// <returns>如果生成了对应的HTML文件,返回true,如果不需要生成HTML文件,返回flase</returns>
        public static bool ConvertFileToHtml(string fileFullName, string targetPath)
        {
            System.IO.FileInfo file = new System.IO.FileInfo(fileFullName);
            if (file.Exists)
            {
                string strExt = file.Extension.Substring(1).ToLower();

                switch (strExt)
                {
                    case "doc":
                    case "docx":
                        WordToHtmlFile(fileFullName, targetPath);
                        return true;
                    case "xls":
                    case "xlsx":
                        ExcelToHtmlFile(fileFullName, targetPath);
                        return true;
                    case "ppt":
                    case "pptx":
                        PptToHtmlFile(fileFullName, targetPath);
                        return true;
                    default:
                        return false;
                }
            }
            return false;
        }
    }
}



望高手指导!万分感谢!

9 个解决方案

#1


同样的问题 我的是在本机可以 到其他测试机就不行
错误信息为:
************** Exception Text **************
System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' or one of its dependencies. The system cannot find the file specified.

网上说的是excel版本不对,但是这也太不人性化了 都是office 2007 不知道为什么就是不行
我也在等待答案.

#2


我本地都是没问题的。本地测试,2003的格式和2007的都没有问题

#3


本地都没问题阿 就是一换机子就出问题了. 好像OutLook2007 API也是这种问题 还是txt好用

#4


现在问题是 有的机子行有的不行 真烦死了 估计还是office 2007版本要一样吧 

#5


我尝试装一下

#6


在服务器端 安装OFFICE 把你需要的都装上。

#7


上边的问题是没有找到office的类库导致的。

#8


我的错误比较奇怪。我的是excel可以转换。word和ppt就不行

#9


问题已经解决了。还是要感谢vssvss的提醒。主要是两个原因导致的
1、com 组件的DLL跟服务器的版本不对应
2、通过组件服务更改了默认的权限设置。

谢谢各位的帮忙了!

#1


同样的问题 我的是在本机可以 到其他测试机就不行
错误信息为:
************** Exception Text **************
System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' or one of its dependencies. The system cannot find the file specified.

网上说的是excel版本不对,但是这也太不人性化了 都是office 2007 不知道为什么就是不行
我也在等待答案.

#2


我本地都是没问题的。本地测试,2003的格式和2007的都没有问题

#3


本地都没问题阿 就是一换机子就出问题了. 好像OutLook2007 API也是这种问题 还是txt好用

#4


现在问题是 有的机子行有的不行 真烦死了 估计还是office 2007版本要一样吧 

#5


我尝试装一下

#6


在服务器端 安装OFFICE 把你需要的都装上。

#7


上边的问题是没有找到office的类库导致的。

#8


我的错误比较奇怪。我的是excel可以转换。word和ppt就不行

#9


问题已经解决了。还是要感谢vssvss的提醒。主要是两个原因导致的
1、com 组件的DLL跟服务器的版本不对应
2、通过组件服务更改了默认的权限设置。

谢谢各位的帮忙了!