Tengo una tabla que me gustaría completar con los números del 1 al máximo, donde max puede ser cualquier número mayor que 1 pero hasta el número total de celdas en la tabla. Me encuentro con problemas que probablemente sean realmente fáciles, pero no solo estoy obteniendo: Deje de agregar números a la tabla una vez que se alcanza el valor máximo. Puede comenzar en una ubicación diferente (como la tercera columna en la primera fila) )

Puedo obtener los números para completar, pero no detenerme en el número máximo. He intentado poner el iterador en todos los niveles del ciclo for, pero no puedo lograr mis resultados.

Aquí está mi código hasta ahora:

from docx import Document

document_name = 'table_loop_test.docx'
document = Document('template.docx')

table = document.add_table(cols=7, rows=5)

iterator = 1
max = 30

while iterator <= max:
    for row in table.rows:
        for cell in row.cells:
            cell.text = f'{iterator}'
            iterator += 1

document.save(document_name)

try:
    subprocess.check_output('open ' + document_name, shell=True)
except subprocess.CalledProcessError as exc:
    print(exc.output).decode('utf-8')

Creo que se detendría a las 30, ¡pero continúa! ¡Muchas gracias por su ayuda!

0
giffysquid 1 oct. 2019 a las 00:48

3 respuestas

La mejor respuesta

Una iteración de su ciclo while pasará por el ciclo completo anidado para el que creó. En lugar de usar el ciclo while, puede agregar una condición para romper los dos ciclos.

for row in table.rows:
    for cell in row.cells:
        cell.text = f'{iterator}'
        iterator += 1
        if iterator > max_cell:
            break
    else:
        continue
    break

Siempre me siento divertido por usar bucles for-else ya que no recuerdo cuándo se ejecuta else, como alternativa es usar return en una función:

def make_table(max_cell):
    for row in table.rows:
        for cell in row.cells:
            cell.text = f'{iterator}'
            iterator += 1
            if iterator > max:
                return
1
busybear 30 sep. 2019 a las 22:40

Según mi comentario de que sus bucles for dependan de max, una solución podría ser la siguiente:

for row in table.rows:
    for cell in row.cells:
        if iterator <= max:
            cell.text = f'{iterator}'
            iterator += 1

Esto se puede hacer más eficiente agregando una condición a break si el valor iterator es mayor o igual que max, para evitar que los bucles for se ejecuten después de {{X3 }} se pasa el valor.

1
natn2323 30 sep. 2019 a las 22:25

Es posible que desee poner:

if iterator > max:
    break

En sus dos bucles for

0
Ionuț Zamfir 30 sep. 2019 a las 21:57
58175683