-1

したがって、データの2つの別々のリスト、wordlistとdigitlistを作成する必要があります。また、両方のセットに関連するデータセットがあるため、wordlist[1]はdigitlist[1]に関連しています。データセットを以下に示します。

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

データセットごとに新しいシートを作成し、シートの最初の列にワードリストを、2番目の列にディジットリストを書き込んでみます。これで、次のコードは、1セットのデータのみを含める場合に機能します。

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)

しかし、2番目のデータセットを追加しようとすると、エラーが発生します。問題は、Excelワークシートを2回書くことができないことだと思います。つまり、新しく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

問題は、2番目のループで、同じセルを何度も何度もヒットし続けていることです。

つまり、データが次のデータのように見えると仮定します。

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

反復をミックスに追加すると、のすべてのエントリに対して、のすべてのエントリをdigitlist実行することになります。digitlist[i]wordlist[i]

したがって、プログラムは「cat」をRow0、Cell0 [つまり(0,0)]に書き込み、次に3、7、および9000を(0,1)、、(1,1)およびに書き込みます(1,2)。次に、プログラムは「猫」を(1,0)...に書き出してから、3、7、および9000をに書き出そうと(0,1)(1,1)ます(1,2) また、内側iは外側をシャドウしiます...そうでない場合(内側のループを使用した場合)、17、8、4000をにii書き出そうとします...これは何ではない可能性がありますあなたはまったく欲しい。(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を使用しているため、2つのコード(質問に示されている)のどちらも機能する可能性はありません。 for

インデントを修正し、ループ変数を、、、 col_index`(または、キーストロークを少なくしたい場合はsheetx / rowx / colx)などの意味のある名前に置き換えます。sheet_indexrow_index

seglistですか?

"""Excelスプレッドシートを2回書き込むことはできません"""-そうではありません。デフォルトでは、同じセルxlwtに2回書き込むことはできません。経験的証拠は、99.99%の確率で、原因は愚かな論理であるということです。セルを上書きする必要がある人(上記のタスクでは必要ありません)は、上書きチェックを上書きできます。

したがって、すべてをまとめると、次のコードは、「」から理解できることを実装します。データセットごとに新しいシートを作成し、最初の列にワードリストを、2番目の列にディジットリストを記述しようとしています。シート。"" "

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 に答える