none
asp调用excel.dll打开excel,文件权限问题 RRS feed

  • 问题

  • 我用asp创建网页,引用EXCEL.dll 打开excel

    在调试的时候是可以打开的,发布之后就出现问题,我配置了dcom添加了用户,网站文件目录也添加了用户给了完全控制权限,但是还是打不开

    刚开始是,com错误,是因为DCOM没配置好,配置之后就是“该文件为只读或加密”这个错误

    然后我用<identity impersonate="true"
                       userName="Administrator"
                       password="123456"  />

    模拟用户登录,现在不报错了,但是没有反应

    请教一下,下一步我该怎么做能解决这个问题

    2013年9月11日 2:41

答案

  • 还有在部署的时候应该确保你本地没有Excel进行打开,很多文章也介绍了在服务器端自动化Excel的出现的问题,具体缺点可以参考下面的文章介绍:

    http://www.cnblogs.com/garfield211/archive/2011/09/28/2194908.html

    所以你实现的方式即使可以了,可能后面还是会出现很多奇怪的问题,所以不建议在服务端调用Excel.interop.dll来对Office 文件进行自动化


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    • 已标记为答案 Mclovin 2013年9月18日 8:15
    2013年9月18日 6:48

全部回复

  • 如果在服务器上不建议使用Excel互操作程序集,你可以使用NOPI第三方类库来对Excel进行操作,如果使用Excel.dll的时候,其实VS会帮我们生成Exce.Interop.dll的互操作程序集,你可以把嵌入互操作程序集设置为false,这样部署的时候就需要拷贝bin目录下的互操作程序集,不过这样也要求服务器上安装Office的。更多的解决方案你也可以参考下面的文章:

    http://www.cnblogs.com/xuanhun/archive/2010/04/29/1724500.html

    http://www.cnblogs.com/HappyLazyGarField/archive/2012/04/18/2455871.html

    http://www.cnblogs.com/Mainz/archive/2009/11/11/microsoft_office_interop_excel.html


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    • 已标记为答案 Mclovin 2013年9月18日 0:31
    • 取消答案标记 Mclovin 2013年9月18日 0:39
    2013年9月11日 3:00
  • 你好:

    请尝试一下这篇文章里面的方法设置一下权限:

    http://blog.csdn.net/wang8712/article/details/357393

    首先是确保文件的可访问性,然后再配置dcom,最后在你的代码里面应该把打开的Excel的Visible属性设置为true才行吧。可能你的情况是实际上excel文件已经打开了,但是是不可见的。你把进程打开看看是不是已经有Excel进程了。

    请参考以下代码:

    object missing = Missing.Value;
                Microsoft.Office.Interop.Excel.Application appExcel = null;
                appExcel = new Microsoft.Office.Interop.Excel.Application();
                appExcel.DisplayAlerts = false;
                Microsoft.Office.Interop.Excel.Workbook workbook = appExcel.Workbooks.Open("E:\\aaa.xlsx",
                    Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Type.Missing);
                appExcel.Visible = true;


    Caillen
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    • 已标记为答案 Mclovin 2013年9月18日 0:31
    • 取消答案标记 Mclovin 2013年9月18日 0:39
    2013年9月12日 11:26
    版主
  • 我代码里有

    把EXCEL的Visible设为true的语句

    检查进程确实有EXCEL进程,但是不显示excel

    • 已编辑 Mclovin 2013年9月18日 0:39 问题
    2013年9月18日 0:32
  • protected void Button1_Click(object sender, EventArgs e)
        {
            //Page.ClientScript.RegisterStartupScript(this.Page.GetType(), "", @"s();", true);
            Excel.Workbooks wb = null;
            Excel.Application excelKccx = null;
            try
            {
                excelKccx = new Excel.Application();
                excelKccx.DisplayAlerts = false;
                object rmiss = System.Reflection.Missing.Value;
                wb = excelKccx.Workbooks;
                string te = Server.MapPath("test.xls");
                wb.Open(Server.MapPath("test.xls"), rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss);
                excelKccx.Visible = true;//使excel可见*/
                excelKccx.Visible = true;//使excel可见*/
                excelKccx.Save(@"c:/1.xls");
            }
            catch (Exception err)
            {
                string error = err.Message;
                Page.ClientScript.RegisterStartupScript(this.Page.GetType(), "", @"alert('"+ error +"');", true);
            }
            finally
            {
                //excelKccx.Quit();
                //wb.Close();
            }
        }

    我是这样写的,调试的时候可以正常打开excel,发布之后,不报错,任务管理器有excel进程,但是不显示
    2013年9月18日 1:05
  • excelKccx = new Excel.Application();
    
                //excelKccx.DisplayAlerts = false;
                object rmiss = System.Reflection.Missing.Value;
                wb = excelKccx.Workbooks;
                string te = Server.MapPath("test.xls");
                wb.Open(Server.MapPath("test.xls"), rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss);
               

    你不是打开之后再设置Excel是否可见,而是在创建了Excel.Application对象就设置是否可见的,你可以试试上面的代码看看,更多的可以参考下面的文章的介绍:

    http://www.cnblogs.com/zhili/archive/2013/03/18/OfficeAutomation.html

    关于Excel的自动化可以参考MSDN中文章:http://msdn.microsoft.com/zh-cn/library/bb386107(v=vs.100).aspx


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample


    2013年9月18日 2:01
  • 还是不能显示,每次运行都能启动EXCEL进程,但是不显示EXCEL应用程序

    调试的时候可以正确打开,调试和发布有哪个地方会影响么?

    还是说跟EXCEL版本有关?我是2003的office,XP的系统,VS2008,net framework3.5

    2013年9月18日 3:07
  • 试试下面代码:

    // 这里定义Workbook类型,不要定义Workbooks类型
    // 并且不要调用close和Quit代码
            Excel.Workbook wb = null;
            Excel.Application excelKccx = null;
            try
            {
                excelKccx = new Excel.Application();
                 excelKccx.Visible = true;//使excel可见*/
                object rmiss = System.Reflection.Missing.Value;
                wb=excelKccx.Workbooks.Open(Server.MapPath("test.xls"), rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss, rmiss);
               wb.Activate(); //激活打开的工作表
               // 去掉save代码。
            }
           
           }

    更多内容可以参考下面的帖子:http://stackoverflow.com/questions/1748105/c-sharp-create-excel-done-then-show-open-it-help


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    2013年9月18日 3:24
  • 还是一样的效果,没显示

    wb.Activate()有这样一个警告

    2013年9月18日 3:43
  • 这个没关系的,你修改成推荐的就好了 ,  你修改下代码试试,插入点内容试试,看下是否会保存插入的内容,如果没有的话,确认下打开服务器上的代码路径是否正确, 你可以判定下wb这个对象是否为null,   而且在服务器上运行没有报任何错误?

    如果实在不行,你可以用VS中的远程调试跟踪下服务器上的代码。不知道VS2008是否有远程调试功能的,如果没有你就按照我上面的步骤去试试(指的是插入文件内容看看在服务器上是否保存了相应的内容,如果没有应该可能就是文件路径的问题了)

    同时你还可以参考下下面的这个帖子看看:http://stackoverflow.com/questions/17530797/cannot-open-excel-file-in-c-sharp


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample


    2013年9月18日 3:53
  • 之前路径好像确实有问题

    我重新创建虚拟目录,用修改后的代码发布的,但是还是不显示,问题是一样的。

    然后,我把wb对象转化成string输出是这样的

    这应该是成功打开了EXCEL了,但是就是不显示

    2013年9月18日 5:43
  • 从弹出框来看是打开了Excel文件并成功返回了Excel.Workbook对象的,这样可以确定代码是没有任何问题了,那就是环境的问题,你发布的服务器的具体环境是怎样的?

    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample


    2013年9月18日 5:44
  • 我现在就是在本机测试,服务器就是我自己电脑

    XP sp3系统,vs2008,net framework3.5,office2003

    我为了解决,打开服务器EXCEL文件权限,用了模拟用户配置

    <identity impersonate="true" userName="Administrator" password="123456" />

    • 已编辑 Mclovin 2013年9月18日 5:56 补充
    2013年9月18日 5:49
  • 那你的配置是否都正确了,是否在Dcom配置中选择以交互式用户,还有微软不建议你用这种方式去打开Excel文件,因为你实际部署的时候就要求客户端安装Office,以及进行退出的问题的。

    具体内容参考下面文章:

    http://support.microsoft.com/kb/257757/zh-cn

    http://support.microsoft.com/kb/169321


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    2013年9月18日 6:34
  • 还有在部署的时候应该确保你本地没有Excel进行打开,很多文章也介绍了在服务器端自动化Excel的出现的问题,具体缺点可以参考下面的文章介绍:

    http://www.cnblogs.com/garfield211/archive/2011/09/28/2194908.html

    所以你实现的方式即使可以了,可能后面还是会出现很多奇怪的问题,所以不建议在服务端调用Excel.interop.dll来对Office 文件进行自动化


    If my post is helpful,please help to vote as helpful, if my post solve your question, please help to make it as answer. My sample

    • 已标记为答案 Mclovin 2013年9月18日 8:15
    2013年9月18日 6:48
  • 恩,好的,谢谢你耐心的解答

    2013年9月18日 8:15