Openpyxl - 合并由字符串分隔的空列单元格

Openpyxl - Merge Empty Column Cells Delimited by String

我一直在做一些大数据工作,我一直在编写一个脚本来自动将 15,000 多行 .csv 格式化为格式化的 excel 文件。我一直在使用 Openpyxl 进行大部分格式化工作。

我需要将 Hostname 列中的服务器名称单元格与其下方的空单元格合并,但似乎无法让它工作。在下面的 table 中,我需要将 Dev Server 与其下方的所有空单元格合并(停止在 RAS 服务器)。然后将 RAS Server 与其下方的空单元格合并,然后 Prod Server 下面是空单元格。

我遇到的问题是我似乎无法指定正确的 for 循环来识别带有字符串的单元格,遍历它下面的每个单元格(与空单元格合并) , 然后在包含字符串的下一个单元格处停止并开始新的合并单元格。

指定的 parameters/cell 数字在这里不起作用 - 真正的 table 有 15,000 多行,每台服务器上的 'installed software' 数量在 25-200 多行之间。为了让事情变得更好,真实的服务器名称也没有一致的命名模式或方案。

这可能吗?任何帮助或指导将不胜感激。

Hostname Installed Software
Dev Server Microsoft Word
Microsoft Excel
Microsoft Teams
Visual Studio Code
Discord
RAS Server Microsoft Word
Spotify
Log4j
Prod Server Adobe Photoshop
Unreal Engine
Adobe PDF Reader
Steam
Adobe Illustrator
Hyper-V
wb = openpyxl.load_workbook("Test.xlsx")  # Load Workbook
ws = wb["Sheet1"]                         # Load Worksheet

    total_rows = []  # Used to enumerate the total number of rows
                     # in the Worksheet

    for i in range (1,20000):
        if ws["B" + str(i)].value != None:
            total_rows.append(i)  # If the cell has a string, the
                                  # cell row number is appended to 
                                  # total_rows.  Indexing the last 
                                  # number is total_rows will give
                                  # you the total number of rows
    
    cells_with_strings = []
    for i in range (1,(total_rows[-1])):
        if ws["A" + str(i)].value != None:
            cells_with_strings.append(int(i))
            # Iterates through each cell in column A, and appends
            # the row numbers of cells containing text to cells_with_strings
    
    merge_cell_range = len(cells_with_strings) - 1
    for i in range (0, (merge_cell_range)):
        ws.merge_cells("A" + str(cells_with_strings[i]) + ":" + "A" + str((cells_with_strings[(i+1)])-1))
        # Using the values in cell_with_strings, it merges the cells in the rows
        # represented by the values in cells_with_strings.  This works for all 
        # merges except for the last merge.
    
    final_merge = []
    for i in range ((cells_with_strings[-1]), ((cells_with_strings[-1]) + 9999)):
        if ws["B" + str(i)].value != None:
            final_merge.append(int(i))
    ws.merge_cells("A" + str(final_merge[0]) + ":" + "A" + str(final_merge[-1]))
    # The last row merge requires different code to the iteration merge.

wb.save("Test.xlsx")