使用python索引错误在Word Docx中创建表

时间:2019-01-21 16:38:51

标签: python python-3.x docx

问题在于,尽管我能够在以前的应用程序中似乎无法在Word文档中创建表。问题在于选择表中要写入哪行/列的问题。

产生的错误代码是:

  

IndexError:列表索引超出范围

并在以下行中找到: cell=table.cell(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)

此循环是较大功能的一部分,因此如果您需要我可以编辑问题

预期结果是表已写入文件。

示例:

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 :(得分:0)

代码的想法是从数据库中获取行,并将其插入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”两次都成立。 一切正常,添加了两行新数据,然后在这两行中添加了两行数据。

现在仅更改一个值(3到101):myresults = [('Winston', '1', '2', '101'), ('Julia', '1', '2', '3')]

并启动程序,它不起作用。 条件'2'<'101'不成立(这不是双重考虑,这是因为字符串比较规则,以'1'开头的字符串小于以'2'开头的字符串)。因此,不会在表上创建一行,之后的两行数据需要两行,但该行只有一行。

错误消息IndexError: list index out of range 表示表中没有具有此类索引的行。

因此,作为解决方案,您可以将字符串转换为条件之前的float。如果问题不是字符串比较规则而是数字,则需要重新考虑算法。

您可以在此处提供sql请求的结果(“ SELECT badgename,cost,stock, desiredstock FROM badges”)。 您可以在myresults=mycursor.fetchall()行之后打印 插入以下行:print(mycursor.fetchall())。或显示为tk.messagebox.showinfo。或直接在数据库中检查。

无需显示所有数据,需要检查最后两个元素(i [2],i [3])。

让我们看看这个。