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

时间:2015-05-06 14:29:24

标签: qlikview

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

我有两个文件(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

此代码工作正常,并且没有显示任何错误,但我没有获得任何数据,也没有看到我的新表(div_reg_table)。

你能帮助我吗?

2 个答案:

答案 0 :(得分:3)

您的代码未加载任何数据的主要原因是public class QSort { public static List<Integer> qsort(List<Integer> list) { if (list.isEmpty()) { return list; } else { return merge( qsort(lesser (head(list), tail(list))), head(list), qsort(greater( head(list), tail(list))) ); } } private static Integer head(List<Integer> list) { return list.get(0); } private static List<Integer> tail(List<Integer> list) { return list.subList(1, list.size()); } private static List<Integer> lesser(Integer p, List<Integer> list) { return list.stream().filter(i -> i < p).collect(toList()); } private static List<Integer> greater(Integer p, List<Integer> list) { return list.stream().filter(i -> i >= p).collect(toList()); } private static List<Integer> merge(List<Integer> lesser, Integer p, List<Integer> greater) { ArrayList list = new ArrayList(lesser); list.add(p); list.addAll(greater); return list; } public static void main(String[] args) { System.out.println(qsort(asList(7, 1, 2, 3, -1, 8, 4, 5, 6))); } } 变量的形式。

当你的内循环执行时,它会评估tt(由tt表示),然后评估:

$(tt)

结果为null,因为这些只是两个字符串。

如果您稍微更改语句,从'DIVISION$' AND 'REGION$' 更改为LET并删除SET,则内部循环将起作用。例如:

AND

但是,现在这也意味着将为{em>两个工作簿的SET tt = 'DIVISION$', 'REGION$'; 中的每个值执行内部循环。这意味着除非您的tt工作簿中有REGION表,否则加载将失败。

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

DIVISION

如果您只有两个文件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.XLS,则可能值得一个接一个地使用两个单独的加载,并完全删除for循环。例如:

REGION.XLS

答案 1 :(得分:0)

不要让noofrows(&#39; Filelist&#39;)测试比答案少1。

noofrows(&#39; filelist&#39;)将评估为2,因此您将获得0,1和2的循环步骤。因此2将返回null,这将导致它失败。

我是这样做的:

文件清单: LOAD * INLINE [     FileName,TableName     REGION.XLS,REGION     DIVISION.XLS,DIVISION ];

让vNo = NoOfRows(&#39; FileList&#39;) - 1;

FOR i = 0 TO $(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)');

NEXT