Pentaho读取设置访问密码的Excel变通方法

最近有个需求变化。原先读取的Excel原文件进行了访问密码设置。在之前的Pentaho Kettle中是不支持读取设置访问密码的Excel文件。可能从9.0之后,在Excel Input中有了password这个选项。但是在该选项中,只能输入密码。如果Excel访问密码保持不变。这倒也简单。这个Password中输入该密码即可读取Excel中数据。但是这次需求是Excel访问密码是变化的,需要从Excel文件名中读取,并且还需要拼接一个字符串。也就是说在password这个选项中需要支持动态的密码。Excel Input Password如下图所示。

Pentaho Kettle在各个组件中可以传递值或者变量。Excel访问密码从Excel文件名读取然后再拼接一个字符串生成一个有效的访问密码,这不是难事。问题在于无法将生成的密码值作用到Password里面。从组件界面上看,Password这个文本框中只有两种操作,一个是输入密码,另一个是引用变量。前者肯定不行,不能满足动态的密码。后者我进行了尝试。我尝试在另一个transformation中将拼接成的访问密码放入到变量中。由于设置变量这组件中的变量值无法直接作用在本transformation中,因此需要另外建一个transformation,然后将两个transformation通过job串起来使用。在job中率先调用拼接密码并保存在变量中的transformation,然后在后续transformation的Excel Input Password中引用该密码变量。但是问题又来了。在password中引用变量后,这个文本框都是….,不是明文。尝试过复制黏贴和盲打。但是job运行起来后,都报密码错误,打不开Excel。我尝试将Excel密码值设置为一个Pentaho的自带系统变量值,并在Password中引用该系统变量。也没有成功。在设置变量中,尝试过变量作用的范围。也没有成功。这些方法灵感来源于有些朋友需要在DB connect中密码使用变量值。他们在这个场景中成功了。但是在Excel Input中Password,我没有尝试成功。所以我怀疑Excel Input Password这里引用变量是无效的。有成功的朋友,麻烦告知。

在上述最理想的方式尝试失败后。我考虑使用脚本将Excel的访问密码去除。然后让Pentaho Kettle读取没有密码的Excel。这样肯定没有问题。所以有了本文所谓的变通方法。即用Python脚本将Excel访问密码去除,然后在Pentaho Job中调用该python脚本。核心脚本如下:

def Remove_password_xlsx(filename, pw_str):
    xcl = win32com.client.Dispatch("Excel.Application")
    wb = xcl.Workbooks.Open(filename, False, False, None, pw_str)
    xcl.DisplayAlerts = False
    wb.SaveAs(filename, None, '', '')
    xcl.Quit()

上述脚本原文地址:https://stackoverflow.com/questions/27556751/unprotect-an-excel-file-programmatically

在Pentaho Job中使用shell脚本即可调用python。但需要注意,系统默认打开python脚本是python,而不是其他Python IDE。

 

 

发表回复

您的电子邮箱地址不会被公开。