【问题标题】:Excel can't read File written by Java process when running as Windows service作为 Windows 服务运行时,Excel 无法读取 Java 进程写入的文件
【发布时间】:2013-05-24 08:51:12
【问题描述】:

一句话概括问题不容易……

我有一个使用 Java 6 在 tomcat 7 上运行的 Web 应用程序。该应用程序使用 JACOB 访问 Excel 工作表,它使用 JNI 和 COM,启动一个单独的 Excel 进程。为确保 Excel 工作表是可变的,我的 Java 进程使用 File.createTempFile() 创建原始 XLS 的副本并将临时文件传递给 Excel 进程。

操作系统是 Windows Server 2008。Excel 版本来自 Office 2010。

我的问题:只要从命令行或 IDE 以交互方式启动 Tomcat,一切正常。如果我将 Tomcat 作为服务启动(使用默认用户 SYSTEM),Excel 无法打开临时文件:

com.jacob.com.ComFailException: Invoke of: Open
Source: Microsoft Excel
Description: Microsoft Excel kann auf die Datei 'C:\Program Files\apache-tomcat\temp\Entwickl-Auftr-Bez-n-Maß 54-131 215-2 Optimierung 210-0    210-3.xlsx6119727457676255726.clone' nicht zugreifen. Dies kann mehrere Gründe haben:

• Der Name des Dokuments oder der Pfad ist nicht vorhanden.
• Das Dokument wird von einem anderen Programm verwendet.
• Der Name der Arbeitsmappe, die gespeichert werden soll, ist identisch zu dem Namen eines  anderen Dokuments, welches schreibgeschützt ist.

    com.jacob.com.Dispatch.invokev(Native Method)
    com.jacob.com.Dispatch.invokev(Unknown Source)
    com.jacob.com.Dispatch.callN(Unknown Source)
    com.jacob.com.Dispatch.call(Unknown Source)
    de.insites.ms.com.xls.Workbook.<init>(Unknown Source)
    de.insites.ms.com.xls.Excel.openWorkbook(Unknown Source)
    de.harti.harticalc.excel.MahanoExcel.<init>(Unknown Source)
    de.harti.harticalc.excel.MahanoExcel.create(Unknown Source)    
    de.harti.harticalc.excel.ExcelProcessor.getExcel(Unknown Source)
    de.harti.harticalc.excel.ExcelProcessor.calculatePosition(Unknown Source)
    de.harti.mahano.service.PositionServlet.doGet(Unknown Source)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    de.harti.mahano.service.AbstractMahanoWsServlet.service(Unknown Source)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    de.harti.mahano.service.CharsetFilter.doFilter(Unknown Source)

德语消息表示 Excel 无法访问该文件,因为该文件不存在、被另一个进程锁定或以某种方式被写锁定。

我确认该文件存在并且它是可读的 Excel 文档(我可以使用 Excel 交互方式打开它)。

我的猜测是,Windows 拒绝 EXCEL 子进程访问我的文件,因为它是由它不信任的 java 进程创建的。

当 Tomcat 作为 Windows 服务运行时,如何让 Excel 访问该文件?

编辑: 英文版的异常信息

ERROR - Invoke of: Open
Source: Microsoft Office Excel
Description: Microsoft Office Excel cannot access the file 'c:\marchena\marchena10\work\marchena\batch_58288\input\content_1.xlsx'. There are several possible reasons:

    ? The file name or path does not exist.
    ? The file is being used by another program.
    ? The workbook you are trying to save has the same name as a currently open workbook.

解决方案 在这里找到解决方案link。我必须创建文件夹

    C:\Windows\SysWOW64\config\systemprofile\Desktop

手动。似乎在 Windows Server 2008 上,Excel 在以 SYSTEM 身份运行时需要此文件夹,但如果缺少则不会创建。

感谢您的提示。

【问题讨论】:

  • 通常建议您不要从非交互式服务运行 Excel。有一个关于它的旧 Microsoft KB。你可以使用图书馆吗,例如Apache POI 而不是?
  • KB 257757: “虽然这样的程序化开发可以相对容易地在客户端系统上实现,但如果自动化从服务器端代码(例如... NT 服务。”
  • 这是一个英语网站,我建议您用英语而不是德语发布例外情况。
  • @Rup 是的,对不起,没看懂,我一定是瞎了。
  • 感谢您的提示。我预料到了问题并解决了大部分问题。希望这个也是。我已经实现了一些 POI 应用程序,但是在这种情况下,POI 是不够的。我的客户有一些更深入的 Excel 知识,这使他能够自己在 Excel 中实现一些次要的业务逻辑。我的应用程序只是使用他的表格进行计算。该应用程序自 2010 年以来已经使用 Open Office 的 UNO 桥运行。不幸的是,Excel 和 Calc 之间存在一些轻微但令人讨厌的兼容性问题,这使我们决定迁移应用程序。

标签: java windows excel jacob


【解决方案1】:

在这里找到解决方案link。我必须创建文件夹

C:\Windows\SysWOW64\config\systemprofile\Desktop

手动。似乎在 Windows Server 2008 上,Excel 在以 SYSTEM 身份运行时需要此文件夹,但如果缺少则不会创建它。

感谢您的提示。

【讨论】:

  • 有同样的问题。这有帮助!非常感谢
猜你喜欢
  • 1970-01-01
  • 2011-06-07
  • 2014-06-21
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多