7

xlrdモジュール、具体的にはrow_values()メソッドを使用してExcelスプレッドシートからデータを引き出すスクリプトがあります。「#N / A」が以前のVLookupsによって自動生成された場合を除いて、それは素晴らしい仕事をしているように見えます。その場合、xlrdは整数42として「#N/A」を取得します。

文字列のフォーマット方法を調べましたが、それがどのように問題であるかがわかりませんでした。

人生の意味を発見した台本(42)を持っていることとは別に、誰かが問題が何であるかを示唆することができますか?

乾杯

注:シートにはVlookupが含まれなくなり、すべての値が他のシートからコピーされ、すべてがプレーンな値であり、数式は含まれていません。

4

4 に答える 4

11

これは便利だと思いました。ジョンの最初の助けに感謝します。

def xls_proc_text(cell, value_proc=None, text_proc=None):
    """Converts the given cell to appropriate text."""
    """The proc will come in only when the given is value or text."""
    ttype = cell.ctype
    if ttype == xlrd.XL_CELL_EMPTY or ttype == xlrd.XL_CELL_TEXT or ttype == xlrd.XL_CELL_BLANK:
        if text_proc is None:
            return cell.value
        else:
            return text_proc(cell.value)
    if ttype == xlrd.XL_CELL_NUMBER or ttype == xlrd.XL_CELL_DATE or ttype == xlrd.XL_CELL_BOOLEAN:
        if value_proc is None:
            return str(cell.value)
        else:
            return str(value_proc(cell.value))
    if cell.ctype == xlrd.XL_CELL_ERROR:
        # Apply no proc on this.
        return xlrd.error_text_from_code[cell.value]
于 2011-04-30T13:47:17.880 に答える
5

Ctrl-F #N/AWeb(またはコンピューター上。ブラウザーでドキュメントを開いて実行)上のxlrdドキュメントは、Excelの内部コードからテキストへの変換テーブルを提供します。

sheet.row_types()メソッド、およびsheet.row_types()などによって返される型番号間の相互参照を提供するCellクラスのドキュメントを確認すると役立つ場合があります。一般に、値に対してisinstance()を使用するよりも、これらの型番号をテストする方が効率的であり、型番号を使用する際にあいまいさがないことに注意してください。

于 2011-02-08T07:14:25.000 に答える
5

Andrewがセルにエラーがある場合にリストしたように、xlrdはエラーのコードを書き込みます。これはここで確認できます。

0x00: '#NULL!',  # Intersection of two cell ranges is empty
0x07: '#DIV/0!', # Division by zero
0x0F: '#VALUE!', # Wrong type of operand
0x17: '#REF!',   # Illegal or deleted cell reference
0x1D: '#NAME?',  # Wrong function or range name
0x24: '#NUM!',   # Value range overflow
0x2A: '#N/A',    # Argument or function not available

コード0x2Aを16進数から12進数に変換すると、その42の値を取得できます。これを回避するには、コードで次のようなものを使用できます。

for rownum in xrange(sh.nrows):
    wr.writerow(['#N/A' if col.ctype == xlrd.XL_CELL_ERROR else col.value for col in sh.row(rownum)])
于 2016-01-20T18:16:51.803 に答える
1
  • 私は解決策を単純化しました、上記のみんなに感謝します。セルタイプに基づいてエラーセルを識別できます。
  • 私たちが持っているデータは#N/Aのctypeです
  • 値=42(#N / Aの代わりに)
  • ctypeは5になります

簡単な解決策は、エラーセルを識別し、42の代わりに「なし」を入力することです。

textType = sheet.cell(r,0).ctype #Get the type of the cell

        if textType == 5:
            text = None
        else:
            text = sheet.cell(r, 0).value

XLRDドキュメント

以下のドキュメントに基づいて、他のすべてのタイプを識別できます

XL_CELL_ERROR5intは内部Excelコードを表します。テキスト表現については、提供されている辞書error_text_from_codeを参照してください。

于 2019-10-03T11:33:53.870 に答える