Как перебрать листы в книге Excel - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь изучить Python и пытаюсь сгенерировать файл .sql из сопоставления, предоставленного мне в файле excel.Но я могу просматривать строки и столбцы первого листа, но не могу перейти к следующим листам.Я использую Python 3.7.Каждый лист будет содержать два столбца

Вот как выглядят столбцы листа Excel:

TABLE1                      TABLE2
-----------------------------------
VERSION                      NULL
VALID_FROM                   USG_DT
USERNAME                     MIG
UD_GEPART_ID                 NULL
UD_SEPART_ID                 NULL

В одной книге может быть несколько листов.

Ниже приведен примерпытался до сих пор.Пожалуйста, кто-нибудь может указать мне, где я ошибаюсь в коде, поскольку я не могу перейти к следующему листу:

wb = xl.load_workbook("C:\\New folder\\MAPPING.xlsx")
ws = wb.sheetnames

sheets = [wb.sheetnames]
statement_a = "INSERT /*+ APPEND */ INTO "
statement_b = "SELECT /*+ PARALLEL(64) */ "


for i, ws in enumerate(sheets):
    stat_c = statement_b 
    stat_d = statement_b + ws[1+i] + " ( "

for sh in wb.worksheets:
    sh = wb.active 
    for col_cells in sh.iter_cols(min_row= 2, min_col= 1, max_col=2):
        for cell in col_cells:
            stat_c = stat_c + str(cell.value) + ", "
    stat_c = stat_c.rstrip(", ")  +" FROM " + ws[1+i] + ";"
    print(stat_c)
    print("-------------------------------------------------")
    for col_cellr in sh.iter_cols(max_row = 1,min_col= 2, max_col =2):
        for cell in col_cellr:
            stat_a = statement_a + cell.value + " ( "
    for col_celli in sh.iter_cols(min_row= 2, min_col= 1, max_col=1):
        for cell in col_celli:
            stat_a = stat_a + str(cell.value) + ", "
    stat_a = stat_a.rstrip(", ") + " )"
    print("\n")
    print(stat_a)

Это не дает мне правильный вывод.Например, оно включает имя второго листа в качестве имени таблицы в операторе выбора столбцов первого листа.Пожалуйста, кто-нибудь может мне помочь, указав на мою ошибку.

Ожидаемый o / p:

INSERT /*+ APPEND */ INTO TABLE1 (VERSION,VALID_FROM,USERNAME,UD_GEPART_ID, UD_SEPART_ID) 
SELECT /*+ PARALLEL(64) */ NULL, USG_DT, MIG, NULL,NULL FROM TABLE2;

Аналогично переберите другие таблицы и сгенерируйте операторы, как указано выше.

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

Я думаю, что следующее должно помочь.

target_table, source_table,  = ws.iter_rows(min_col=1, max_col=2, min_row=1 max_row=1, values_only)[0]
target_cols, source_cols,  = ws.iter_cols(min_col=1, max_col=2, min_row=3, values)
target_cols.insert(0, "PARALLEL(64)")

stmt = """INSERT INTO {0} ({1})
SELECT {2} FROM {3}.format(target_table, ",".join(target_cols), ",".join(source_cols), source_table)
"""

Это не все, и вы, вероятно, захотите изменить его, но, надеюсь, этого будет достаточно, а если нет, то вы получите основу для более конкретных вопросов.

0 голосов
/ 27 июня 2019

sheetnames

Возвращает список имен рабочих листов в этом Учебное пособие.

Тип: список строк

sheetnames возвращает список. Вы должны изменить

sheets = [wb.sheetnames]

до

sheets = wb.sheetnames

Также ниже это неправильно. Вы пытаетесь перебрать каждый лист, но на следующем шаге вы теряете sh, назначая его чему-то другому.

for sh in wb.worksheets:
    sh = wb.active
...