2011-02-08 4 views
3

xlrdモジュール、特にrow_values()メソッドを使用してExcelスプレッドシートからデータを取り出すスクリプトがあります。以前のVLookupsによって "#N/A"が自動生成された場合を除き、xlrdは "#N/A"を整数42として取得します。xlrd "#N/A"を4212に変換するExcelスクリプト

私は見ました文字列の書式設定の方法を理解できませんでした。

人生の意味を発見したスクリプト(42)を別にすれば、誰でも問題の原因を示唆することはできますか?

乾杯

注:シートは、もはやそれにVlookupsを持って、すべての値が他のシートからコピーされている、すべてのものは、何式無地値ではありません。ウェブ上の

+0

ワイルド推測:あなたのコードでは、このようなものを使用することができることを避けるために エクセル#Nの数値コード/エラー値が2042である私はxlrdについて何も知らないが、多分それは役立ちます。 (私はむしろ、あなたのスクリプトは深い考えを考えていると信じています...) – jtolle

答えて

4

xlrdドキュメント(またはコンピュータ上、お使いのブラウザでドキュメントを開き、Ctrl-F #N/Aを行う)あなたconversion table from Excel internal codes to textを与えます。

sheet.row_types() methodCell class docsを見ると、sheet.row_types()などで返される型番号の相互参照を得ることができます。一般的に、値にisinstance()を使用するよりも、その型番号をテストする方が効率的であり、型番号を使用する場合にはあいまいさがないことに注意してください。

8

これは役に立ちました。ジョンの初期のおかげです。

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] 
2

アンドリューが記載されているとして、あなたは、セル内のエラーを持っている場合は、xlrdはあなたがhereを見ることができ、エラーのコードを書き込みます:

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 

進から12月までコード0x2Aを変換するあなたがいることを得ることができます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)]) 
関連する問題