访问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;

(0)

相关推荐

  • 访问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,也可以访问 O

  • C++ STL array容器访问元素的几种方式

    当 array 容器创建完成之后,最常做的操作就是获取其中的元素,甚至有时还会通过循环结构获取多个元素.本节就对获取容器中元素的方法做个汇总. 访问array容器中单个元素 首先,可以通过容器名[]的方式直接访问和使用容器中的元素,这和 C++ 标准数组访问元素的方式相同,例如: values[4] = values[3] + 2.O*values[1]; 此行代码中,第 5 个元素的值被赋值为右边表达式的值.需要注意的是,使用如上这样方式,由于没有做任何边界检查,所以即便使用越界的索引值去访问

  • 详解C++ STL vector容器访问元素的几种方式

    学会如何创建并初始化 vector 容器之后,本节继续来学习如何获取(甚至修改)容器中存储的元素. 访问vector容器中单个元素 首先,vector 容器可以向普通数组那样访问存储的元素,甚至对指定下标处的元素进行修改,比如: #include <iostream> #include <vector> using namespace std; int main() { vector<int> values{1,2,3,4,5}; //获取容器中首个元素 cout &l

  • 详解Springboot下载Excel的三种方式

    汇总一下浏览器下载和代码本地下载实现的3种方式. (其实一般都是在代码生成excel,然后上传到oss,然后传链接给前台,但是我好像没有实现过直接点击就能在浏览器下载的功能,所以这次一起汇总一下3种实现方式.)

  • C++获取文件大小数值的三种方式介绍

    目录 方式一 方式二 方式三 总结 方式一 推荐使用此方式获得文件大小! C/C++.Window.Linux 环境都可以使用! 通过结构体struct stat获得. 需要包含头文件:#include <sys/stat.h> // struct stat // 通过stat结构体 获得文件大小,单位字节 size_t getFileSize1(const char *fileName) { if (fileName == NULL) { return 0; } // 这是一个存储文件(夹)

  • 详解Spring Boot 访问Redis的三种方式

    目录 前言 开始准备 RedisTemplate JPA Repository Cache 总结 前言 最近在极客时间上面学习丁雪丰老师的<玩转 Spring 全家桶>,其中讲到访问Redis的方式,我专门把他们抽出来,在一起对比下,体验一下三种方式开发上面的不同, 分别是这三种方式 RedisTemplate JPA Repository Cache 开始准备 开始之前我们需要有Redis安装,我们采用本机Docker运行Redis, 主要命令如下 docker pull redis doc

  • jQuery绑定事件的四种方式介绍

    jQuery提供了多种绑定事件的方式,每种方式各有其特点,明白了它们之间的异同点,有助于我们在写代码的时候进行正确的选择,从而写出优雅而容易维护的代码.下面我们来看下jQuery中绑定事件的方式都有哪些. jQuery中提供了四种事件监听方式,分别是bind.live.delegate.on,对应的解除监听的函数分别是unbind.die.undelegate.off.在开始看他们之前 一:bind(type,[data],function(eventObject)) bind是使用频率较高的一

  • Java FineReport报表工具导出EXCEL的四种方式

    在实际的应用中会经常需要将数据导出成excel,导出的方式除原样导出还有分页导出.分页分sheet导出和大数据量导出.对于excel2003版,限制了每个sheet的最大行数和列数,大数据量导出时会默认时分多个sheet,而excel2007不会出现这样的问题.这些导出方式在JAVA程序中分别有不同的接口来实现: 1. 原样导出 原样导出就是不预览直接导出excel 其程序接口代码如下: outputStream = new FileOutputStream(new File("E:\\Exce

  • Linux开机自启动服务两种方式介绍

    目录 rc.local方式 chkconfig方式 rc.local方式 1首先创建一个要自启动的脚本 vi /etc/scripts/createFile.sh #!/bin/bash #开机创建一个文件夹 mkdir /opt/ccc 2.给予执行权限 chmod 777 createFile.sh 3.在/etc/rc.d/rc.local文件中添加脚本的绝对路径 4.给与rc.local执行权限 chmod 777 rc.local 重启服务,发现已经在opt路径下创建了一个ccc的文件

  • Python中引用传参四种方式介绍

    目录 引用传参一: ​引用传参二: ​​引用传参三: ​​引用传参四: 总结 引用传参一: ​​>>> a = 100 #这里的a是不可变类型 >>> def test(a): ... a+=a #这个式子有两层含义:1.这里可能是重新定义一个新的变量a,2.也有可能是修改a的值,但由于全局 #变量a不能修改,所以此处是重新定义了一个a: ... print("函数内:%d"%a) ... >>> test(a) 函数内:200 &

随机推荐