zoukankan      html  css  js  c++  java
  • 访问Excel的几种方式

    1、通过OLEDB方式
    Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Sample.xlsx;Extended Properties=Excel 8.0;
    Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Sample.xlsx;Extended Properties=Excel 12.0
    两者区别:第一个可以访问 Office 97-2003;第二个既可以访问既可以访问 Office 2007,也可以访问 Office 97-2003
    如果使用第二个,需要安装AccessDatabaseEngine.exe,可以从微软官网下载。
    如果是使用64位操作系统,则插件AccessDatabaseEngine.exe应该为64位
    如果是使用32位操作系统,则插件AccessDatabaseEngine.exe应该为32位
    如果是使用64位操作系统,并且插件AccessDatabaseEngine.exe是32位,需要将应用程序池设置为“启用32位应用程序”,或者sln编译时,选择x86而不是anyCPU和x64
    2、通过Microsoft.Office.Interop.Excel访问
    问题:如果打开Excel后,会弹出提示框,如请激活等,都会失去Excel的控制,这时候访问Excel都会报错。
    处理方法:激活Excel,new完Excel对象,设置excel.Interactive = false;完成后excel.Interactive = true;
    3、访问Excel会有权限限制。需要给DcomExcel赋权限:(1、交互式用户2、两个everyone 全部权限)
    问题:64位操作系统通过dcomcnfg.exe看不到32位的Excel DCOM,需要使用另一个命令
    命令行中输入:mmc comexp.msc /32
    找到DCOM中的Excel
    标识页签里,设置为:交互式用户
    安全页签里,设置“启动和激活权限”为自定义,添加everyone所有权限
    设置“访问权限”为自定义,添加everyone所有权限
    4、Excel访问完成后,需要杀掉对应进程。
    方法1:遍历所有进程,只要是Excel进程就杀掉。这个比较暴力,如果别人也在用会出现问题
    方法2:1、winform,console项目有效
     IntPtr t = new IntPtr(app.Hwnd);
             int k = 0;
             GetWindowThreadProcessId(t, out k);   //得到本进程唯一标志k
             if (k != 0)
                {
                    System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);   //得到对进程k的引用
                    p.Kill();     //关闭进程k
                }
           2、web、webservices无效,GetWindowThreadProcessId(t, out k);执行完后,取不到进程Id,Id使用为0。网上说可能是权限不足,
     需要通过下边方式提升权限
                TokPriv1Luid tp;
                IntPtr hproc = GetCurrentProcess();
                IntPtr htok = IntPtr.Zero;
                if (OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok))
                {
                    //MessageBox.Show("OpenProcessToken="+htok.ToString()); 
                }
                tp.Count = 1;
                tp.Luid = 0;
                tp.Attr = SE_PRIVILEGE_ENABLED;
    
                if (LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tp.Luid))
                {
                    //MessageBox.Show("LookupPrivilegeValue="+tp.Luid.ToString()); 
                }
    
                if (AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero))
                {
                    //MessageBox.Show("AdjustTokenPrivileges成功" + tp.Luid.ToString() +" ---"+tp.Count.ToString() + "---"+tp.Attr.ToString()); 
                }
           3、目前采用的是这种方式,也是可以杀掉该进程的
                excel.Quit();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);                
                    excel = null;
    
    


     

  • 相关阅读:
    ACM-超级楼梯
    clientt.c
    call.c
    answer.c
    aa.c
    client.c
    service.c
    自己动手开发jQuery插件
    apache-commons-net Ftp 进行文件、文件夹的上传下载及日志的输出
    在Eclipse中制作SSH配置文件提示插件
  • 原文地址:https://www.cnblogs.com/bbsno1/p/3278171.html
Copyright © 2011-2022 走看看