我不(也不能)在需要访问Excel工作表的系统上安装Excel . 根据我的阅读,将其作为数据库访问速度要快得多 .
我实际上已经在我正在开发的系统上安装了Office 2012;我知道我需要在运行此脚本的任何系统上安装Office 2007数据访问组件 .
我在网上发现了相互矛盾的信息(令人震惊!),我想知道我是否遗漏了一些明显的东西 . 代码很简单:
$strFileName = "C:\Users\[my directory]PWS20130821.xlsx"
$strProvider = "Provider = Microsoft.ACE.OLEDB.12.0"
$strDataSource = "Data Source = $strFileName"
$strExtend = 'Extended Properties = "Excel 12.0 Xml;IMEX=1;HDR=No"'
$passwd = get-ssp
$strPass = "Jet OLEDB:Database Password = $passwd"
$strConn = "$strProvider;$strDataSource;$strExtend;$strPass"
$objConn = New-Object System.Data.OleDb.OleDbConnection($strConn)
$objConn.open()
这给了我“外部表不符合预期的格式” . 调用$ objConn时我的连接字符串是
Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\ Users [my directory] \ PWS20130821.xlsx; Extended Properties =“Excel 12.0 Xml; IMEX = 1; HDR = No”; Jet OLEDB:Database Password = [删除,但正确]
删除IMEX和HDR没有任何影响 . 将密码放在引号中(没有空格或特殊字符)没有任何影响 .
我确实发现:“我很害怕 . 除非您已经在Excel中手动打开了电子表格,否则无法打开与受密码保护的电子表格的连接 . 所描述的错误与Excel ODBC提供程序有关,但行为在Jet 4.0 OLE DB提供程序 . 您的另一个选择是从电子表格中删除密码,并依赖其他一些安全机制(如限制文件所在文件夹的权限)来控制访问 . “
这仍然准确吗?
1 回答
看起来当前的Excel ADO驱动程序不支持您描述的情况:
From: http://support.microsoft.com/kb/211378
知识库文章中提出的解决方案建议在执行脚本或删除密码之前删除密码或在Excel中打开密码(并且可能是不受保护的) . 其他信息也可以从这篇知识库文章中获得:http://support.microsoft.com/kb/257819
Security Consideration: 保护.XLSX文件中的工作簿/工作表只需添加一个可轻松从文件中删除的
workbookProtection
或sheetProtection
标记 . 换句话说,它可以防止对文件进行随意阅读/修改,但实际上无法对文档进行整体加密和保护,并且很容易被绕过 . 考虑到这一点,无论如何,拥有密码保护的文件是正确的答案吗?也许首先删除密码并存储在安全的位置进行处理?References:
Hack into a protected Excel 2007 Sheet
Hack into a protected Excel 2007 or 2010 Workbook