问题是,我似乎无法在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)
这个循环是一个更大函数的一部分,所以如果你需要我可以编辑问题
预期的结果是将表写入文件。在
示例:
实际结果是程序错误,产生:
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")
该代码的思想是从数据库中取出行并插入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])。在
让我们看看这个。在
相关问题 更多 >
编程相关推荐