C#读excel出现异常 (异常来自 HRESULT:0x80010105 (RPC_E_SERVERFAULT))

C#操作excel出错:(异常来自 HRESULT:0x80010105 (RPC_E_SERVERFAULT))A03EC

 private void OpenExcel(string strFileName)
        {
            object missing = System.Reflection.Missing.Value;
            Application excel = new Application();

            if (excel == null)
            {
                Response.Write("<script>alert('Can't access excel')</script>");
            }
            else
            {
                excel.Visible = false;
                excel.UserControl = true;
                // 以只读的形式打开EXCEL文件
                    Workbook wb = excel.Application.Workbooks.Open(strFileName, missing, true, missing, missing, missing,
                     missing, missing, missing, true, missing, missing, missing, missing, missing);


                //取得第一个工作薄
                Worksheet ws = (Worksheet)wb.Worksheets.get_Item(1);
                //取得总记录行数   (包括标题列)
                int rowsint = ws.UsedRange.Cells.Rows.Count; //得到行数
                //int columnsint = mySheet.UsedRange.Cells.Columns.Count;//得到列数
                //取得数据范围区域 (不包括标题列)
                Range rng1 = ws.Cells.get_Range("A1", "A" + rowsint);   //item
                Range rng2 = ws.Cells.get_Range("B1", "B" + rowsint); //Customer
                object[,] arryItem = (object[,])rng1.Value2;   //get range's value
                object[,] arryCus = (object[,])rng2.Value2;
                //将新值赋给一个数组
                string[] arryA = new string[rowsint];
                string[] arryB = new string[rowsint];
                for (int i = 1; i <= rowsint; i++)
                {
                    //Item_Code列
                    arryA[i - 1] = arryItem[i, 1].ToString();
                    //Customer_Name列
                    arryB[i - 1] = arryCus[i, 1].ToString();
                }
                //Response.Write(arry[0, 0] + " / " + arry[0, 1] + "#" + arry[rowsint - 2, 0] + " / " + arry[rowsint - 2, 1]);

            }
            excel.Quit(); excel = null;
            Process[] procs = Process.GetProcessesByName("excel");
            foreach (Process pro in procs)
            {
                pro.Kill();//没有更好的方法,只有杀掉进程
            }
            GC.Collect();
        }

当 excel,visible = true 时可以正常运行,求解决。每次弹出来一个excel表接受不了呀=。=

3个回答

最好用NPOI来读取excel。关于npoi读取excel

jehovahx
jehovahx 我就想知道为什么visible= false为什么就会报错。以前我用过这个代码。就是设置为不可见的
2 年多之前 回复

如何读取?封装一些常用的方法

jehovahx
jehovahx 啊?不是很理解你的意思
2 年多之前 回复

但是我保存完Excel之后每个excel进程关闭时没问题的,现在不明白的是为什么要设为true才可以。
关闭excel进程 加上这些代码就可以。

        int Hwnd = excel.Hwnd;
        workbook.Close(false, mMissing, mMissing);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
        workbook = null;
        excel.Workbooks.Close();
        excel.Quit();
        System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
        KillSpecialExcel(Hwnd);
        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
        GC.WaitForPendingFinalizers();
        excel = null;
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!