使用带有 QlikView 的 For 循环加载多个 Excel 工作表

Load multiple Excel sheets using For loop with QlikView

我想从两个不同的 Excel 文件加载数据,并在 QlikView 的同一个 table 中使用它们。

我有两个文件(DIVISION.xls 和 REGION.xls),我正在使用以下代码:

let tt = 'DIVISION$' and 'REGION$';

FOR Each db_schema in 'DIVISION.xls','REGION.xls'
    FOR Each v_db in $(tt)
        div_reg_table:
        LOAD *
        FROM $(db_schema) 
        (biff, embedded labels, table is $(v_db));
    NEXT
NEXT

这段代码工作正常,没有显示任何错误,但我没有得到任何数据,也没有看到我的新 table (div_reg_table)。

你能帮帮我吗?

您的代码未加载任何数据的主要原因是 tt 变量的形式。

当您的内部循环执行时,它计算 tt(表示为 $(tt)),然后计算结果为:

'DIVISION$' AND 'REGION$'

结果为空,因为它们只是两个字符串。

如果您稍微更改语句,从 LETSET 并删除 AND,则内部循环将起作用。例如:

SET tt = 'DIVISION$', 'REGION$';

但是,这现在也意味着您的内部循环将针对 both 工作簿的 tt 中的每个值执行。这意味着除非您的 DIVISION 工作簿中有 REGION sheet,否则加载将失败。

为避免这种情况,您可能希望稍微重组脚本,以便拥有一个控制 table 来详细说明要加载的文件和 table。我准备的例子如下所示:

FileList:
LOAD * INLINE [
    FileName, TableName
    REGION.XLS, REGION$
    DIVISION.XLS, DIVISION$
];


FOR i = 0 TO NoOfRows('FileList') - 1

    LET FileName = peek('FileName', i, 'FileList'); 
    LET TableName = peek('TableName', i, 'FileList'); 

    div_reg_table:
    LOAD
        *
    FROM '$(FileName)'
    (biff, embedded labels, table is '$(TableName)');

NEXT

如果您只有两个文件 DIVISION.XLSREGION.XLS 那么可能值得一个接一个地使用两个单独的加载,并完全删除 for 循环。例如:

div_reg_table:
LOAD
    *
FROM [DIVISION.XLS]
(biff, embedded labels, table is DIVISION$)
WHERE DivisionName = 'AA';

LOAD
    *
FROM [REGION.XLS]
(biff, embedded labels, table is REGION$)
WHERE RegionName = 'BB';

难道你不需要让 noofrows('Filelist') 测试比答案少 1。

noofrows('filelist') 将评估为 2,因此您将获得 0,1 和 2 的循环步骤。因此 2 将 return 为 null,这将导致它失败。

我是这样做的:

文件列表: 加载 * 内联 [ 文件名、表名 REGION.XLS,区域 DIVISION.XLS,除法 ];

让 vNo=NoOfRows('FileList')-1;

对于 i = 0 到 $(vNo)

LET FileName = peek('FileName', i, 'FileList'); 
LET TableName = peek('TableName', i, 'FileList'); 

div_reg_table:
LOAD
    *,
    $(i) as I,
    FileBaseName() as SOURCE
FROM '$(FileName)'
(biff, embedded labels, table is '$(TableName)');

下一个