[转]Win7、Windows Server 2008下无法在Windows Service中打开一个已经存在的Excel 2007文件问题的解决方案
2012-07-17 17:40
881 查看
引用地址:http://www.cnblogs.com/linyechengwei/archive/2011/03/25.html
昨天,组里一个小朋友告诉我,他写的报表生成服务中无法打开一个已经存在的Excel 2007文件,他的开发环境是Win7、Visual Studio .Net 2008(Windows Server 2008下同样存在此问题)。比较奇怪的是,Excel Automation对象是可以实例化的,但是在执行Workbooks.Open时抛出异常如下:
Microsoft Office Excel 不能访问文件“a.xls”。 可能的原因有:
• 文件名称或路径不存在。
• 文件正被其他程序使用。
• 您正要保存的工作簿与当前打开的工作簿同名。_Microsoft Office Excel_ 在 TemplateExcelFileExporter.Create(DataSet ds, String fullName) 位置 E:\Demos\ExportService\ExportService\Class1.cs:行号 263
在 ExportService.Service1.OnStart(String[] args) 位置 E:\Demos\ExportService\ExportService\Service1.cs:行号 30
事实上,a.xls文件是存在的,而同样的代码在非Service程序是正常的,且Service部署到Windows Server 2003上运行正常。我不得不怀疑是权限问题,服务是以Local System运行的,在给工作目录加上了相应的权限后发现问题依旧。无奈,上网去转了一圈,找到了一个解决方案,以下是其中关键的部分:
This solution is ...
・Windows 2008 Server x64
Please make this folder.
C:\Windows\SysWOW64\config\systemprofile\Desktop
・Windows 2008 Server x86
Please make this folder.
C:\Windows\System32\config\systemprofile\Desktop
...instead of dcomcnfg.exe.
This operation took away office automation problems in my system.
A Desktop folder seems to be necessary in the systemprofile folder to open file by Excel.
It disappears from Windows2008, Windows2003 had the folder,
and I think it cause this error.
虽然问题解决了,但是为什么在X:\Windows\System32\config\systemprofile目录下创建名为Desktop目录即可解决问题,这个还不是很清楚。继续查了一些资料,应该还是权限的问题,因为无论Windows Service运行在哪个帐号下,它所创建的文件的Owner都是Administrator,因此Excel无法打开此文件。但为啥一定要建一个空的Desktop目录,仍未找到答案。如果哪位高价知道,请不吝赐教。
源文地址:/article/5295286.html
posted @ 2011-03-25 18:47 凡夫·俗子 阅读(357) 评论(0) 编辑
The 'Microsoft.ACE.OLEDB.14.0' provider is not registered on
the local machine
在网站中使用了Excel组件,网站发布部署后,在所有使用到Excel组件的相关功能点上,都出现了如下错误:
The 'Microsoft.ACE.OLEDB.14.0' provider is not registered on the local machine.
在网上查找了资料后,得到了解决.
基本的解决就是:
1、在服务器上要安装office组件
2、要安装office的数据连接组件(AccessDatabaseEngine)
说明:我安装了office2010的数据链接组件后,还是没有解决这个问题,但我网站中引用了的Excel组件版本的确是14.0,最终是把
Microsoft.ACE.OLEDB.14.0 修改成了 Microsoft.ACE.OLEDB.12.0
才终于解决了这个问题,具体原因自己也不太清楚。
=====================================================================================
查找到的相关资料如下:
http://social.msdn.microsoft.com/Forums/zh-CN/whatforum/thread/7c6d2c4a-feff-4517-af63-c1509ddae3f4
/article/6987643.html
在windows 2008 r2 x64版本的操作系统中通过oledb提供程序连接访问Excel2010/2007时,程序会报如下错误:
System.InvalidOperationException: The 'Microsoft.ACE.OLEDB.14.0' provider is not registered on the local machine.
此查找资料认为产生此种错误的原因有两种:
1、在Windows2008r2 x64 OS,在没有装Office2010客户端时,或没有安装“数据连接组件”
2、当前Web应用程序的应用程序池是64位的,而提供连接Excel的provider不支持当前64版本的操作系统
解决方法:
1方案:
安装MS的数据连接组件AccessDatabaseEngine(或安装office 2010客户端),并将当前承载通过oledb提供程序去访问Excel2010的Web
application对应的应用程序池“启用兼容32位应用程序”,
在对应的 IIS 应用程序池中,“设置应用程序池默认属性”右击/“高级设置”/"启用32位应用程序",设置为 true。
2方案:
安装AccessDatabaseEngine_64版并且要安装64位版的office 2010客户端
下载地址:http://www.microsoft.com/downloads/en/details.aspx?displaylang=en&FamilyID=c06b8369-60dd-4b64-a44b-84b371ede16d
3方案:
若目标应用程序不能将应用程序池"启用兼容32位应用程序",只能在64位应用程序池下运行,且又想有上传Excel的功能,可按如下方式:
a、创建Asp.net WebService application 程序,并通过WebService来连接访问Excel。
b、将此webservice application的应用程序池按方案1方式设置“启用兼容32位应用程序”。
c、在目标应用程序中添加此webservice。
posted @ 2011-03-25 14:56 凡夫·俗子 阅读(333) 评论(0) 编辑
Asp.net中Word文件转换成HTML
最近在项目中使用到了一个Word转换为HTML的功能,于是自己写了一个示例,关键代码如下:
//存放word文件的完整路径
string wordPath = Server.MapPath("/word/test.doc");
//存放html文件的完整路径
string htmlPath = Server.MapPath("/html/test.html");
//上传word文件, 由于只是做示例,在这里不多做文件类型、大小、格式以及是否存在的判断
FileUpload1.SaveAs(wordPath);
#region 文件格式转换
//请引用Microsoft.Office.Interop.Word
ApplicationClass word = new ApplicationClass();
Type wordType = word.GetType();
Documents docs = word.Documents;
// 打开文件
Type docsType = docs.GetType();
object fileName = wordPath; //"f:\\cc.doc";
Document doc = (Document)docsType.InvokeMember("Open", BindingFlags.InvokeMethod, null, (object)docs, new Object[] { fileName, true, true });
//判断与文件转换相关的文件是否存在,存在则删除。(这里,最好还判断一下存放文件的目录是否存在,不存在则创建)
if (File.Exists(htmlPath)) { File.Delete(htmlPath); }
//每一个html文件,有一个对应的存放html相关元素的文件夹(html文件名.files)
if (Directory.Exists(htmlPath.Replace(".html", ".files")))
{
Directory.Delete(htmlPath.Replace(".html", ".files"), true);
};
//转换格式,调用word的“另存为”方法
Type docType = doc.GetType();
object saveFileName = htmlPath; //"f:\\aaa.html";
docType.InvokeMember("SaveAs", BindingFlags.InvokeMethod, null, doc, new object[] { saveFileName, WdSaveFormat.wdFormatHTML });
// 退出 Word
wordType.InvokeMember("Quit", BindingFlags.InvokeMethod, null, word, null);
#endregion
以上代码,在.net framework4.0 中,可能会出一编译错误:
无法嵌入互操作类型“……”,请改用适用的接口。
查阅资料,找到解决方案,记录如下:
选中项目中引入word的dll,鼠标右键,选择属性,把“嵌入互操作类型”设置为False。
下载源码:/Files/linyechengwei/WordToHTML.rar
昨天,组里一个小朋友告诉我,他写的报表生成服务中无法打开一个已经存在的Excel 2007文件,他的开发环境是Win7、Visual Studio .Net 2008(Windows Server 2008下同样存在此问题)。比较奇怪的是,Excel Automation对象是可以实例化的,但是在执行Workbooks.Open时抛出异常如下:
Microsoft Office Excel 不能访问文件“a.xls”。 可能的原因有:
• 文件名称或路径不存在。
• 文件正被其他程序使用。
• 您正要保存的工作簿与当前打开的工作簿同名。_Microsoft Office Excel_ 在 TemplateExcelFileExporter.Create(DataSet ds, String fullName) 位置 E:\Demos\ExportService\ExportService\Class1.cs:行号 263
在 ExportService.Service1.OnStart(String[] args) 位置 E:\Demos\ExportService\ExportService\Service1.cs:行号 30
事实上,a.xls文件是存在的,而同样的代码在非Service程序是正常的,且Service部署到Windows Server 2003上运行正常。我不得不怀疑是权限问题,服务是以Local System运行的,在给工作目录加上了相应的权限后发现问题依旧。无奈,上网去转了一圈,找到了一个解决方案,以下是其中关键的部分:
This solution is ...
・Windows 2008 Server x64
Please make this folder.
C:\Windows\SysWOW64\config\systemprofile\Desktop
・Windows 2008 Server x86
Please make this folder.
C:\Windows\System32\config\systemprofile\Desktop
...instead of dcomcnfg.exe.
This operation took away office automation problems in my system.
A Desktop folder seems to be necessary in the systemprofile folder to open file by Excel.
It disappears from Windows2008, Windows2003 had the folder,
and I think it cause this error.
虽然问题解决了,但是为什么在X:\Windows\System32\config\systemprofile目录下创建名为Desktop目录即可解决问题,这个还不是很清楚。继续查了一些资料,应该还是权限的问题,因为无论Windows Service运行在哪个帐号下,它所创建的文件的Owner都是Administrator,因此Excel无法打开此文件。但为啥一定要建一个空的Desktop目录,仍未找到答案。如果哪位高价知道,请不吝赐教。
源文地址:/article/5295286.html
posted @ 2011-03-25 18:47 凡夫·俗子 阅读(357) 评论(0) 编辑
The 'Microsoft.ACE.OLEDB.14.0' provider is not registered on
the local machine
在网站中使用了Excel组件,网站发布部署后,在所有使用到Excel组件的相关功能点上,都出现了如下错误:
The 'Microsoft.ACE.OLEDB.14.0' provider is not registered on the local machine.
在网上查找了资料后,得到了解决.
基本的解决就是:
1、在服务器上要安装office组件
2、要安装office的数据连接组件(AccessDatabaseEngine)
说明:我安装了office2010的数据链接组件后,还是没有解决这个问题,但我网站中引用了的Excel组件版本的确是14.0,最终是把
Microsoft.ACE.OLEDB.14.0 修改成了 Microsoft.ACE.OLEDB.12.0
才终于解决了这个问题,具体原因自己也不太清楚。
=====================================================================================
查找到的相关资料如下:
http://social.msdn.microsoft.com/Forums/zh-CN/whatforum/thread/7c6d2c4a-feff-4517-af63-c1509ddae3f4
/article/6987643.html
在windows 2008 r2 x64版本的操作系统中通过oledb提供程序连接访问Excel2010/2007时,程序会报如下错误:
System.InvalidOperationException: The 'Microsoft.ACE.OLEDB.14.0' provider is not registered on the local machine.
此查找资料认为产生此种错误的原因有两种:
1、在Windows2008r2 x64 OS,在没有装Office2010客户端时,或没有安装“数据连接组件”
2、当前Web应用程序的应用程序池是64位的,而提供连接Excel的provider不支持当前64版本的操作系统
解决方法:
1方案:
安装MS的数据连接组件AccessDatabaseEngine(或安装office 2010客户端),并将当前承载通过oledb提供程序去访问Excel2010的Web
application对应的应用程序池“启用兼容32位应用程序”,
在对应的 IIS 应用程序池中,“设置应用程序池默认属性”右击/“高级设置”/"启用32位应用程序",设置为 true。
2方案:
安装AccessDatabaseEngine_64版并且要安装64位版的office 2010客户端
下载地址:http://www.microsoft.com/downloads/en/details.aspx?displaylang=en&FamilyID=c06b8369-60dd-4b64-a44b-84b371ede16d
3方案:
若目标应用程序不能将应用程序池"启用兼容32位应用程序",只能在64位应用程序池下运行,且又想有上传Excel的功能,可按如下方式:
a、创建Asp.net WebService application 程序,并通过WebService来连接访问Excel。
b、将此webservice application的应用程序池按方案1方式设置“启用兼容32位应用程序”。
c、在目标应用程序中添加此webservice。
posted @ 2011-03-25 14:56 凡夫·俗子 阅读(333) 评论(0) 编辑
Asp.net中Word文件转换成HTML
最近在项目中使用到了一个Word转换为HTML的功能,于是自己写了一个示例,关键代码如下:
//存放word文件的完整路径
string wordPath = Server.MapPath("/word/test.doc");
//存放html文件的完整路径
string htmlPath = Server.MapPath("/html/test.html");
//上传word文件, 由于只是做示例,在这里不多做文件类型、大小、格式以及是否存在的判断
FileUpload1.SaveAs(wordPath);
#region 文件格式转换
//请引用Microsoft.Office.Interop.Word
ApplicationClass word = new ApplicationClass();
Type wordType = word.GetType();
Documents docs = word.Documents;
// 打开文件
Type docsType = docs.GetType();
object fileName = wordPath; //"f:\\cc.doc";
Document doc = (Document)docsType.InvokeMember("Open", BindingFlags.InvokeMethod, null, (object)docs, new Object[] { fileName, true, true });
//判断与文件转换相关的文件是否存在,存在则删除。(这里,最好还判断一下存放文件的目录是否存在,不存在则创建)
if (File.Exists(htmlPath)) { File.Delete(htmlPath); }
//每一个html文件,有一个对应的存放html相关元素的文件夹(html文件名.files)
if (Directory.Exists(htmlPath.Replace(".html", ".files")))
{
Directory.Delete(htmlPath.Replace(".html", ".files"), true);
};
//转换格式,调用word的“另存为”方法
Type docType = doc.GetType();
object saveFileName = htmlPath; //"f:\\aaa.html";
docType.InvokeMember("SaveAs", BindingFlags.InvokeMethod, null, doc, new object[] { saveFileName, WdSaveFormat.wdFormatHTML });
// 退出 Word
wordType.InvokeMember("Quit", BindingFlags.InvokeMethod, null, word, null);
#endregion
以上代码,在.net framework4.0 中,可能会出一编译错误:
无法嵌入互操作类型“……”,请改用适用的接口。
查阅资料,找到解决方案,记录如下:
选中项目中引入word的dll,鼠标右键,选择属性,把“嵌入互操作类型”设置为False。
下载源码:/Files/linyechengwei/WordToHTML.rar
相关文章推荐
- Win7、Windows Server 2008下无法在Windows Service中打开一个已经存在的Excel 2007文件问题的解决方案
- Win7、Windows Server 2008下无法在Windows Service中打开一个已经存在的Excel 2007文件问题的解决方案
- [转]Win7、Windows Server 2008下无法在Windows Service中打开一个已经存在的Excel 2007文件问题的解决方案
- Win7、Windows Server 2008下无法在Windows Service中打开一个已经存在的Excel 2007文件问题的解决方案
- Win7、Windows Server 2008下无法在Windows Service中打开一个已经存在的Excel 2007文件问题的解决方案
- Win7、Windows Server 2008下无法在Windows Service中打开一个已经存在的Excel 2007文件问题的解决方案
- [转]Win7、Windows Server 2008下无法在Windows Service中打开一个已经存在的Excel 2007文件问题的解决方案
- Win7、Windows Server 2008下无法在Windows Service中打开一个已经存在的Excel 2007文件问题的解决方案
- [转]Win7、Windows Server 2008下无法在Windows Service中打开一个已经存在的Excel 2007文件问题的解决方案
- C#技巧【调用线程无法访问此对象,因为另一个线程拥有该对象的问题的解决办法】【C#读写EXCEL源码提示“office检测到此文件存在一个问题。为帮助保护您的计算机,不能打开此文件”的解决】
- windows server 2008下无法用程序打开一个xls文件问题
- C#读写EXCEL源码提示“office检测到此文件存在一个问题。为帮助保护您的计算机,不能打开此文件。 ”的解决
- 64位word2013、Excel 2013提示内存不足,PowerPoint 2013无法打开文件的一个解决方案
- 64位word2013、Excel 2013、提示内存不足,PowerPoint 2013无法打开文件的一个解决方案
- 文件无法拷贝到Windows 7,Windows Server 2008 系统虚拟目录的问题
- .xlsx文件总是默认用2007 Microsoft Office component 打开,且无法更改用EXCEL打开的解决方法
- windows 7 (win7) help 帮助文件(.hlp)无法打开的解决
- Qt creator工程项目移植时因环境变换造成qmake错误的解决方案 1.问题描述:移植从他机上的qt工程项目,打开时提示: Qt Creator找到了一个由其他开发环境创建的设置文件,或许
- win7打开jar文件的问题,双击无法运行
- Win7下chm文件无法打开问题解决方法