C# 操作Excel相關問題

3 篇文章 0 订阅

問題1.

引用 Microsoft.Office.Interop.Excel

無法使用 mySheet = (Worksheet)myBook.Worksheets[1];

生成時

 One or more types required to compile a dynamic expression cannot be found. Are you missing a reference?  

解決方案:

引用Microsoft.Office.Interop.Excel 右擊屬性將 Embed interop type 改成false才可以

問題2 異常信息

異常1.(0x80040154): 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80040154 没有注册类

異常2.未能加载文件或程序集“office, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c”或它的某一个依赖项。系统找不到指定的文件。文件名:“office, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c”

解決方案是安裝Office excel

(採用WPS的方法只裝了WPS時,也出現這個異常,乾脆就直接裝了Office excel)

採用時WPS,引用etapi.dll,wppapi.dll,wpsapi.dll 三個DLL 方法同Office的一樣,只需using不同的dll即可

問題3 打開 Office 的excel時,提示stdole32.tlb丢失或损坏的解决方法

重裝Office,從別的地方拷貝到system32下都不起作用(之前system32下面原來就有一個)

方案1.(未解決-有緩解-有自動更新框)找到excel的安裝目錄,修改excel.exe的兼容性,如下圖,問題並沒有解決,只是打開excel,提示信息變了,變成直接重新更新安裝了(跟之前提示"stdole32.tlb丢失或损坏的解决方法"對話框,關掉后的效果一樣)

方案2.(未解決-有緩解-直接打開)修改WPS的兼容性,如下圖, (之後打開excel正常,但是感覺問題還是沒有修復,後面的問題會再提到這個問題,暫時認為解決了)

問題4

检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问。

採用WInform程式,可以正常操作,網站操作失敗提示以上信息

方案1.(未解決-異常變化)在網站的web.Config文件里添加 <identity impersonate="true" userName="administrator" password="XXXX"/>

異常變成 System.Runtime.InteropServices.COMException (0x800A03EC): 异常来自 HRESULT:0x800A03EC

此異常 問題5可以解決

方案2(未解決) 調整IIS 應用池高級屬性調整 標示  networkService 異常提示 依然是{00024500-0000-0000-C000-000000000046}

方案3(解決-成功)  做如下設置

控制面板-》管理工具-》组件服务-》计算机-》我的电脑-》DCom配置-》Microsoft Excel应用程序 -》屬性

如果不成功,可以將 "Microsoft Excel应用程序" 刪掉 重新添加后重新設置(添加方法見問題5)

刪除方法如下 打開註冊表,找到如下 HKEY_CLASSES_ROOT/Appid/{00020812-0000-0000-C000-000000000046}

問題5 DCom配置里找不到Microsoft Excel应用程序

方案1.

運行 "mmc -32" 打開 控制臺->檔案->新增或移除嵌入式管理單元->原件服務->新增,點擊確定之後重新打開 "dcomcnfg.exe"打開元件服務就可以了


 

方案2:

需要重新註冊 Excel (Word,PPT同理)

找到Excel的安裝目錄"C: \Program Files\Microsoft Office\OFFICE11\EXCEL.exe"

win+R (運行)  "C: \Program Files\Microsoft Office\OFFICE11\EXCEL.exe" /regserver

執行這個命令時 問題3的提示"stdole32.tlb丢失或损坏的解决方法"又彈出來,註冊命令依然能執行完畢

問題6 出现如下的错误

Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 8000401a 因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码。 (Exception from HRESULT: 0x8000401A).

方案1

打开组件服务—— 计算机——我的电脑——DCOM配置 中找到Microsoft Excel应用程序,右击“属性”

选择“安全”选项卡,将 启动和激活权限、访问权限以及配置权限中添加 IIS_IUSER,IUSER

選擇"標示"選項卡,選擇"啟動用戶" ---網上都是改成交互用戶 本例用 啟動用戶時,成功

 

以下是關於操作Excel的相關代碼

修改Excel里的單元格值

Application myExcel = null;//引用Excel Application类別
        Workbook myBook = null;//引用活页簿类別
        Worksheet mySheet = null;//引用工作表类別            
        Range myRange = null;//引用Range类別
        string excelPath = "";

        public ExcelModify(string filePath)
        {
            excelPath = filePath;
            try
            {

                myExcel = new Application();//实例化Excel Application
                myBook = myExcel.Workbooks._Open(excelPath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                myExcel.DisplayAlerts = false;//停用警告
                myExcel.Visible = false;      //Excel 不可见              
                // Microsoft.Office.Interop.Excel 引用的屬性 Embed interop type 改成false才可以
                mySheet = (Worksheet)myBook.Worksheets[1];//Excel文件打开工作簿的第一个文件
            }
            catch (Exception ex)
            {
                this.Close();
                throw ex;
            }
        }

        public void Modify(int rowindex, int columnIndex, string sValue)
        {            
            try
            {
                // Microsoft.Office.Interop.Excel 引用的屬性 Embed interop type 改成false才可以
                //修改单元格
                myRange = (Range)mySheet.Cells[rowindex + 1, columnIndex + 1];
                    myRange.Value = sValue;//把坐标是[1,2]的单元格值修改成12
                
                //{//修改单元格引用函数=Sum(A1:A3)
                //    myRange = mySheet.Cells[rowindex, columnIndex];
                //    string strColName1 = getExcelColumnLabel(cindex + 1);
                //    myRange.Formula = string.Format("=SUM({0}:{1})", strColName1 + (rindex - 3), strColName1 + (rindex - 1));
                //}
            }
            catch (Exception ex)
            {
                this.Close();
                throw ex;
            }
        }

xml轉化xls

public void xmlToxls(string xmlPath, string xlsPath)
        {
            try
            {
                
            Application _appliation;
            Workbook _workbook;
            _appliation = new Application();
            Object missing = System.Reflection.Missing.Value;
            if (_appliation == null)
                _appliation = new Application();
            _workbook = (Workbook)_appliation.Workbooks.Open(xmlPath, missing, missing, missing, missing, missing, missing, missing,
                                                                       missing, missing, missing, missing, missing, missing, missing);
            _workbook.SaveAs(xlsPath, XlFileFormat.xlExcel9795);
            //關掉當前sheet
            _workbook.Close(missing, missing, missing);
            //關掉excel
            _appliation.Workbooks.Close();
            //退出程序
            _appliation.Quit();
            }
            catch (Exception ex)
            {  
                throw ex;
            }
        }

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值