-1

所以我必须有两个单独的数据列表,wordlist 和 digitlist。并且两组都有相关的数据集,因此 wordlist[1] 与 digitlist[1] 相关。数据集如下所示:

seglist = ['aaa111', 'bbb222', 'ccc333']
wordlist = ['aaa', 'bbb', 'ccc']
digitlist = ['111', '222', '333']

我正在尝试为每组数据创建一个新工作表,并在工作表的第一列中写入单词表,在表的第二列中写入数字表。现在,当我只包含一组数据时,以下代码可以工作:

for i in range(len(seglist)):
p = str(i)
ws = w.add_sheet(p)
for i, cell in enumerate(wordlist[i]):
    ws.write(i,0,cell)

但是当我尝试添加第二个数据集时,它给了我和错误。我认为问题在于excel工作表不能写两次。那么这是否意味着我必须重新打开新的 excel 文件,然后重新格式化它?另外,有没有人对如何在excel电子表格上同时写入两组数据有任何想法?

for i in range(len(seglist)):
p = str(i)
ws = w.add_sheet(p)
for i, cell in enumerate(wordlist[i]):
    ws.write(i,0,cell)
    for i, cell in enumerate(digitlist[i]):
        ws.write(i,1,cell)
Exception: Attempt to overwrite cell: sheetname=u'0' rowx=0 colx=1

此外,每个数据集中列出的项目数量可能不一样。

4

2 回答 2

1

问题在于,在您的第二个循环中,您不断地一遍又一遍地击中相同的单元格。

也就是说,假设您的数据看起来像这样的数据:

wordlist = [['cat','feline','kitty'], ['dog','canine','puppy']]
digitlist = [[3,7,9000],[17,8,4000]]

当你点击 时wordlist,你会写:

Sheet0
    Row0
    -----
    cat
    feline
    kitty
Sheet1
    Row0
    -----
    dog
    canine
    puppy

当您将迭代添加到混合中时,您将针对 in 中的每个条目digitlist运行所有条目。digitlist[i]wordlist[i]

因此,您的程序将“cat”写入 Row0、Cell0 [即(0,0)],然后将 3、7 和 9000 写入(0,1)(1,1)(1,2)。然后您的程序将“feline”写入(1,0)... ,然后尝试将 3、7 和 9000 写入(0,1)(1,1)然后(1,2)重新开始。 此外,内部i阴影外部i......如果它没有,(如果你使用ii你的内部循环),那么你会试图写出 17、8 和 4000 到(0,1),(1,1)(1,2)......这可能不是什么你想要的。

如果您想做的是合并单词和数字列表并将它们彼此相邻写出来,那么请尝试zip

for i in range(len(wordlist)):
    merged = zip(wordlist[i], digitlist[i])
    cells = range(len(merged[0])) # Assumes no ragged arrays
    for row in range(len(merged)):
        for col in cells:
            ws.write(row, col, merged[row][col])
于 2011-07-22T23:30:11.617 回答
1

您的两段代码(如您的问题所示)都没有任何工作机会,因为(1)缩进被塞满了(2)您i每个 for循环中都使用变量。

修复缩进并将循环变量替换为有意义的名称,如sheet_index, row_index, col_index`(或 sheetx/rowx/colx,如果您喜欢更少的击键)。

是什么seglist

"""Excel 电子表格不能写两次""" -- 不是这样。默认情况下,xlwt阻止您在同一个单元格上书写两次。经验证据表明,在 99.99% 的情况下,原因是模糊的逻辑。需要覆盖单元格(上述任务中不需要)的人可以覆盖覆盖检查。

所以,把它们放在一起,下面的代码实现了我从“”中理解的内容,我正在尝试为每组数据创建一个新工作表,并将 wordlist 写在第一列,digitlist 写在第二列床单。”””

assert len(wordlist) == len(digitlist)
for sheetx in xrange(len(seglist)):
    ws = w.add_sheet(str(sheeetx))
    assert len(wordlist[sheetx]) == len(digitlist[sheetx])
    for rowx, values in enumerate(zip(wordlist[sheetx], digitlist[sheetx]):
        for colx, value in enumerate(values):
            ws.write(rowx, colx, value)

如果有任何assert触发器,您需要检查您的数据...

更新以响应有关参差不齐的数据的信息:

assert len(wordlist) == len(digitlist) == len(seglist))
for sheetx in xrange(len(seglist)):
    ws = w.add_sheet(str(sheeetx))
    for colx, values in enumerate((wordlist[sheetx], digitlist[sheetx])):
        for rowx, value in enumerate(values):
            ws.write(rowx, colx, value)
于 2011-07-23T05:48:18.740 回答