Создание таблицы в Word Docx с помощью Python Index Error - PullRequest
0 голосов
/ 21 января 2019

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

Полученный код ошибки:

IndexError: индекс списка вне диапазона

И находится в строке: cell=table.cell(l,0)

Вот неправильный цикл for:

    for k in myresults:
        l=l+1
        list(k)
        print(k)
        print("FF")
        print(k[0])
        print(l)
        cell=table.cell(l,0)
        cell.text=k[0]
        TableText = cell.paragraphs[0].runs[0]
        TableText.font.bold = False
        TableText.font.name = 'Nunito Sans'
        TableText.font.size = docx.shared.Pt(12)
        StockDeficit=int(k[3])-int(k[2])
        cell=table.cell(l,1)
        cell.text=k[1]
        TableText = cell.paragraphs[0].runs[0]
        TableText.font.bold = False
        TableText.font.name = 'Nunito Sans'
        TableText.font.size = docx.shared.Pt(12)
        cell=table.cell(l,2)
        cell.text=k[2]
        TableText = cell.paragraphs[0].runs[0]
        TableText.font.bold = False
        TableText.font.name = 'Nunito Sans'
        TableText.font.size = docx.shared.Pt(12)
        cell=table.cell(l,3)
        cell.text=k[3]
        TableText = cell.paragraphs[0].runs[0]
        TableText.font.bold = False
        TableText.font.name = 'Nunito Sans'
        TableText.font.size = docx.shared.Pt(12)
        #Remove £ From Cost
        CostOfBadges = k[1].replace("£", "")
        CostOfBadges=float(CostOfBadges)*StockDeficit
        CostOfBadges=round(CostOfBadges,2)
        cell=table.cell(l,4)
        cell.text=str(CostOfBadges)
        TableText = cell.paragraphs[0].runs[0]
        TableText.font.bold = False
        TableText.font.name = 'Nunito Sans'
        TableText.font.size = docx.shared.Pt(12)
        TotalCost=TotalCost+CostOfBadges
        print(TotalCost)
        TotalCost=round(TotalCost,2)

Этот цикл является частью более крупной функции, поэтому если вам требуетсяЯ могу отредактировать вопрос

Ожидаемый результат - таблица записывается в файл.

Пример:

Badge Table

Фактический результат заключается в том, что программа выдает ошибки:

IndexError: список индексов выходит за пределы диапазона

В строке:

cell=table.cell(l,0)

Полная функция ниже по запросу:

def CreateStockReport():
    global TotalCostG
    TotalCostG=0
    RowCount=0
    #Open Report File
    doc = docx.Document()
    run = doc.add_paragraph().add_run()
    # Apply Style
    Tstyle = doc.styles['Normal']
    font = Tstyle.font
    font.name = "Nunito Sans"
    font.size = Pt(48)
    Title = doc.add_paragraph()
    TRun = Title.add_run("Badge Stock Report")
    TRun.bold = True
    doc.add_picture('Scouts_Logo_Stack_Black.png', width=Inches(4.0))
    TotalCost=0
    mycursor.execute("SELECT badgename,cost,stock, desiredstock FROM badges")
    myresults=mycursor.fetchall()
    #Create Table
    #Determine How Long The Table Will Be
    for i in myresults:
        if i[2]<i[3]:
            RowCount=RowCount+1
            print("No Of Rows:"+str(RowCount))
    RowCount=RowCount+1
    doc.add_page_break()
    table = doc.add_table(rows=RowCount, cols=5)
    table.style = 'Table Grid'
    for l in range(0,5):
        print(l)
        cell = table.cell(0, l)
        if l==0:
            cell.text="Badge Name"
        if l==1:
            cell.text="Cost (£)"
        if l==2:
            cell.text="Stock"
        if l==3:
            cell.text="Desired Stock Level"
        if l==4:
            cell.text="Price Of Order (£)"
        TableHeadings = cell.paragraphs[0].runs[0]
        TableHeadings.font.bold = True
        TableHeadings.font.name = 'Nunito Sans'
        TableHeadings.font.size = docx.shared.Pt(12)


    print(len(myresults))
    TableText = cell.paragraphs[0].runs[0]
    TableText.font.bold = False
    TableText.font.name = 'Nunito Sans'
    TableText.font.size = docx.shared.Pt(12)
    NoOfStocked = 0
    for k in myresults:
        #Remove Unneccesary rows (Badges which meet stock requirements)
        print(k[2])
        print(k[3])
        if int(k[2])>int(k[3]):
            myresults.remove(k)
            print(myresults)
            NoOfStocked=NoOfStocked+1
    print("Number Of Stocked Badges"+str(NoOfStocked))
    print(myresults)
    l=0
    for k in myresults:
        l=l+1
        list(k)
        print(k)
        print("FF")
        print(k[0])
        print(l)
        cell=table.cell(l,0)
        cell.text=k[0]
        TableText = cell.paragraphs[0].runs[0]
        TableText.font.bold = False
        TableText.font.name = 'Nunito Sans'
        TableText.font.size = docx.shared.Pt(12)
        StockDeficit=int(k[3])-int(k[2])
        cell=table.cell(l,1)
        cell.text=k[1]
        TableText = cell.paragraphs[0].runs[0]
        TableText.font.bold = False
        TableText.font.name = 'Nunito Sans'
        TableText.font.size = docx.shared.Pt(12)
        cell=table.cell(l,2)
        cell.text=k[2]
        TableText = cell.paragraphs[0].runs[0]
        TableText.font.bold = False
        TableText.font.name = 'Nunito Sans'
        TableText.font.size = docx.shared.Pt(12)
        cell=table.cell(l,3)
        cell.text=k[3]
        TableText = cell.paragraphs[0].runs[0]
        TableText.font.bold = False
        TableText.font.name = 'Nunito Sans'
        TableText.font.size = docx.shared.Pt(12)
        #Remove £ From Cost
        CostOfBadges = k[1].replace("£", "")
        CostOfBadges=float(CostOfBadges)*StockDeficit
        CostOfBadges=round(CostOfBadges,2)
        cell=table.cell(l,4)
        cell.text=str(CostOfBadges)
        TableText = cell.paragraphs[0].runs[0]
        TableText.font.bold = False
        TableText.font.name = 'Nunito Sans'
        TableText.font.size = docx.shared.Pt(12)
        TotalCost=TotalCost+CostOfBadges
        print(TotalCost)
        TotalCost=round(TotalCost,2)
    TotalCostG = TotalCost
    Total = doc.add_paragraph()
    TotalText = Total.add_run("The total amount for this order is £"+str(TotalCost))
    TotalText.font.name = 'Nunito Sans'
    TotalText.font.size = docx.shared.Pt(12)
    tk.messagebox.showinfo("Success!", "Report Created!")
    doc.save("BadgeStockReport.docx")
    os.system("start BadgeStockReport.docx")

1 Ответ

0 голосов
/ 05 февраля 2019

Идея кода состоит в том, чтобы взять строки из базы данных и вставить в таблицу в документе Word.Количество строк в таблице зависит от условия if i[2]<i[3].Это означает, что если element3 (это i [2]) меньше, чем element4 (это i [3]), тогда в таблицу будет добавлена ​​новая пустая строка (RowCount=RowCount+1).

Например.Сразу после строки myresults=mycursor.fetchall() вставьте эту строку: myresults = [('Winston', '1', '2', '3'), ('Julia', '1', '2', '3')]

и запустите программу, она должна работать, потому что i [2] (строка '2') меньше, чем i [3] (строка '3).«).Условие «2» <«3» верно оба раза.Все в порядке, добавлены две новые строки, а затем к этим строкам добавлены две строки данных. </p>

Теперь измените только одно значение (от 3 до 101): myresults = [('Winston', '1', '2', '101'), ('Julia', '1', '2', '3')]

и запуститепрограмма не должна работатьУсловие '2' <'101' неверно (и это не двойное мышление, это из-за правил сравнения строк, строка, начинающаяся с '1', меньше строки, начинающейся с '2').Таким образом, одна строка не создается в таблице, а более поздним двум строкам данных требуется две строки, но строка только одна. </p>

Сообщение об ошибке IndexError: list index out of range означает, что в таблице нет строки с таким индексом.

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

Здесь можно указать результат запроса sql ("SELECT badgename,cost,stock, desiredstock FROM badges").Вы можете напечатать это сразу после строки myresults=mycursor.fetchall() и вставить эту строку: print(mycursor.fetchall()).Или показать как tk.messagebox.showinfo.Или проверьте прямо в БД.

Не нужно показывать все данные, необходимо проверить два последних элемента (i [2], i [3]).

Давайте посмотрим на это.

...