5

xlrd を使用して Excel ファイルから値を読み取ろうとしています。日付、数字、およびこれまでのテキストでうまく機能しています。テキストを含むセルを含む列 (カテゴリ) があります (セルはテキストとして書式設定されています)。セルの値を印刷すると、テキストの代わりにフロートが表示されます。チェックする Cell オブジェクトの ctype も出力しましたが、Number として表示されています。xlrd のドキュメントとチュートリアルを読みましたが、なぜこれが発生しているのかわかりません。私のExcelファイルが何らかの形で台無しになっている可能性がありますか?正しい方向への提案や指針はありますか?

import xlrd
import datetime

workbook = xlrd.open_workbook('training.xls')
courseSheet = workbook.sheet_by_index(0)

for row in range(courseSheet.nrows):
    title = courseSheet.cell_value(row, 2)
    date = courseSheet.cell_value(row, 4)
    date = datetime.datetime(*xlrd.xldate_as_tuple(date, workbook.datemode))
    dateTuple = date.timetuple()
    category = courseSheet.cell_value(row, 7)
    print category
4

2 に答える 2

4

背景: 各セルについて、xlrd は、XLS ファイルに格納されている固有値 (存在する場合) を報告します。値の型は、最初はファイルのレコード型に基づいてのみ割り当てられます (たとえば、NUMBER および RK レコードには浮動小数点数が含まれます)。ここで説明されているように形式を分類し、その情報を使用して、数値ではなく日時、日付、または時刻が意図されていることが明らかな場合に値の型をオーバーライドします。xlrd は、セルに起因する形式に従ってセル値をレンダリングできるとは主張していません。

問題のセルは明らかに数値として入力されています。それらにテキスト形式が適用されている場合、それらは「テキストセル」にはなりません。

「」「セルの値を印刷すると、テキストではなくフロートが表示される」とあなたは言う... (a) ファイルが作成されたときにセルに入力された内容の例をいくつか挙げてください (b) 内容「セルがテキストとしてフォーマットされている」という証拠 (c) repr(cell.value) とは (d) 表示されると予想される「テキスト」とは何ですか?

次のコードが役立つ場合があります。

import xlrd, sys

def dump_cell(sheet, rowx, colx):
    c = sheet.cell(rowx, colx)
    xf = sheet.book.xf_list[c.xf_index]
    fmt_obj = sheet.book.format_map[xf.format_key]
    print rowx, colx, repr(c.value), c.ctype, \ 
        fmt_obj.type, fmt_obj.format_key, fmt_obj.format_str

book = xlrd.open_workbook(sys.argv[1], formatting_info=1)
sheet = book.sheet_by_index(0)
for rowx in xrange(sheet.nrows):
    for colx in xrange(sheet.ncols):
        dump_cell(sheet, rowx, colx)
于 2011-12-17T23:41:03.863 に答える
0

私はOPと同じ問題を抱えており、python(xlrd)側で解決策がない場合があるという結論に達したと思います。データが最初にExcelシートに入力された方法に翻弄されます。具体的には、既に正しい「テキスト」書式が適用されているセルにデータが入力された場合、またはデータがデフォルトの「一般」書式でセルに入力された後、セルの書式が「データが入力された後の Text'。

書式設定済みのセルにデータを入力すると、テキスト用に書式設定されたセルに数値データがあることを示す Excel の警告チェック マークが数値データに付けられます。この場合、xlrd は期待どおりにデータを処理し、Excel ワークシートに表示される文字列を返します。(たとえば、セルの内容は Excel で "1" として読み取られ、xlrd はセルの値として "1" を返します)

ただし、数値データを入力した後にセルの書式を変更すると、Excel のデータは "1" と表示されますが、xlrd は "1.0" のセル値を返します。このセルの xlrd cell.ctype を確認すると、Excel で形式がテキストに変更されたにもかかわらず、セルがまだ数値として扱われていることがわかります。

考えられる解決策は、Excel の文字列データを引用符で囲むことです。これにより、Excel が最初からデータを数値として扱うことができなくなります。

于 2013-07-11T15:19:00.897 に答える