问题在于,尽管我能够在以前的应用程序中似乎无法在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)
此循环是较大功能的一部分,因此如果您需要我可以编辑问题
预期结果是表已写入文件。
示例:
实际结果是程序错误,产生:
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")
答案 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])。
让我们看看这个。