使用python索引E在worddocx中创建表

2024-05-14 22:10:07 发布

您现在位置:Python中文网/ 问答频道 /正文

问题是,我似乎无法在Word文档中创建表,尽管可以预先创建表。选择要写入表中的行/列时出现问题。在

产生的错误代码是:

IndexError: list index out of range

并在以下行中找到: 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: list index out of range

在线:

^{pr2}$

按要求提供以下全部功能:

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")

Tags: textnameptsizetablecellsharedprint
1条回答
网友
1楼 · 发布于 2024-05-14 22:10:07

该代码的思想是从数据库中取出行并插入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 表示表中没有具有此索引的行。在

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

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

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

让我们看看这个。在

相关问题 更多 >

    热门问题