使用xlrd在Python中将数字Excel数据读取为文本

17 投票
2 回答
29095 浏览
提问于 2025-04-15 22:10

我正在尝试使用xlrd读取一个Excel文件,我想知道有没有办法忽略Excel文件中的单元格格式,只把所有数据当作文本导入?

这是我目前使用的代码:

import xlrd

xls_file = 'xltest.xls'
xls_workbook = xlrd.open_workbook(xls_file)
xls_sheet = xls_workbook.sheet_by_index(0)

raw_data = [['']*xls_sheet.ncols for _ in range(xls_sheet.nrows)]
raw_str = ''
feild_delim = ','
text_delim = '"'

for rnum in range(xls_sheet.nrows):
    for cnum in range(xls_sheet.ncols):
        raw_data[rnum][cnum] = str(xls_sheet.cell(rnum,cnum).value)

for rnum in range(len(raw_data)):
    for cnum in range(len(raw_data[rnum])):
        if (cnum == len(raw_data[rnum]) - 1):
            feild_delim = '\n'
        else:
            feild_delim = ','
        raw_str += text_delim + raw_data[rnum][cnum] + text_delim + feild_delim

final_csv = open('FINAL.csv', 'w')
final_csv.write(raw_str)
final_csv.close()

这段代码可以正常工作,但有些字段,比如邮政编码,被导入成了数字,所以后面会有个小数点零。例如,如果Excel文件中的邮政编码是'79854',它会被导入成'79854.0'。

我试着在这个xlrd文档中找解决办法,但没有成功。

2 个回答

4

我知道这不是问题的重点,但我建议你直接把数据写入csv文件,不用先存到raw_str里。这样对于一个大文件(比如有1万行数据)来说,可以节省很多时间。

你也可以不需要raw_data,只用一个循环就可以了。

24

这是因为在Excel中,整数值在Python中会被当作浮点数来处理。所以,当你使用sheet.cell(r,c).value时,它返回的是一个浮点数。你可以尝试把这些值转换成整数,但首先要确保这些值在Excel中本来就是整数:

cell = sheet.cell(r,c)
cell_value = cell.value
if cell.ctype in (2,3) and int(cell_value) == cell_value:
    cell_value = int(cell_value)

这一切都在xlrd的说明文档里。

撰写回答