参考:https://www.cnblogs.com/ivanpan/p/7300335.html
https://blog.csdn.net/java2013liu/article/details/80325704
https://www.cnblogs.com/zhoujie/p/python18.html
python读取Excel实例
1.操作步骤:
(1)安装python官方Excel库-->xlrd
(2)获取Excel文件位置并读取
(3)读取sheet
(4)读取指定rows和cols内容
2.示例代码
# -*- coding: utf-8 -*-
import xlrd
from datetime import date,datetime
def read_excel():
#文件位置
ExcelFile=xlrd.open_workbook(r'C:\Users\Administrator\Desktop\TestData.xlsx')
#获取目标EXCEL文件sheet名
print ExcelFile.sheet_names()
#------------------------------------
#若有多个sheet,则需要指定读取目标sheet例如读取sheet2
#sheet2_name=ExcelFile.sheet_names()[1]
#------------------------------------
#获取sheet内容【1.根据sheet索引2.根据sheet名称】
#sheet=ExcelFile.sheet_by_index(1)
sheet=ExcelFile.sheet_by_name('TestCase002')
#打印sheet的名称,行数,列数
print sheet.name,sheet.nrows,sheet.ncols
#获取整行或者整列的值
rows=sheet.row_values(2)#第三行内容
cols=sheet.col_values(1)#第二列内容
print cols,rows
#获取单元格内容
print sheet.cell(1,0).value.encode('utf-8')
print sheet.cell_value(1,0).encode('utf-8')
print sheet.row(1)[0].value.encode('utf-8')
#打印单元格内容格式
print sheet.cell(1,0).ctype
if__name__ =='__main__':
read_excel()
问题1:假如我们修改其中一个值为年份,读不出正确数字,而是数字
ctype介绍 :
0empty 1string 2number 3date 4boolean 5error
解决方法:先判断单元格内容再处理,具体如下:
>>> date_value = xlrd.xldate_as_tuple(sheet2.cell_value(2,2),workbook.datemode)
>>> date_value
(1992, 2, 22, 0, 0, 0)
想让excel数据返回一个字符串字典list,造了一个excel。数据如下:
用代码读取后发现整型和日期变成了小数(123456变成了123456.0,2017/5/20 5:20变成了42875.22222222222):
有个比较简单的解决办法就是在数字和日期的单元格内容前加上一个英文的逗号即可。如果数据比较多,也可以批量加英文逗号的前缀(网上都有方法)。
再次运行代码就正确了:
这种比较适合数据量较少的时候,如果数据量比较多,还是建议通过程序代码判断单元格内容的ctype来解决!
下面是我通过网上找的例子修改的代码。初学python没几天,有不足之处希望留言指正,大家共同学习!
注意:该例子没有对第一行的数据进行处理。第一行数据作为key,其它行作为value,依次返回每行数据。
import xlrd
from datetime import datetime
from xlrd import xldate_as_tuple
def get_excel_data(file): # 传入文件路径字符串即可,例如:get_excel_data('account.xlsx')
workbook = xlrd.open_workbook(file)
sheet = workbook.sheets()[0] # 读取第一个sheet
nrows = sheet.nrows # 行数
first_row_values = sheet.row_values(0) # 第一行数据
list = []
num = 1
for row_num in range(1, nrows):
row_values = sheet.row_values(row_num)
if row_values:
str_obj = {}
for i in range(len(first_row_values)):
ctype = sheet.cell(num, i).ctype
cell = sheet.cell_value(num, i)
if ctype == 2 and cell % 1 == 0.0: # ctype为2且为浮点
cell = int(cell) # 浮点转成整型
cell = str(cell) # 转成整型后再转成字符串,如果想要整型就去掉该行
elif ctype == 3:
date = datetime(*xldate_as_tuple(cell, 0))
cell = date.strftime('%Y/%m/%d %H:%M:%S')
elif ctype == 4:
cell = True if cell == 1 else False
str_obj[first_row_values[i]] = cell
list.append(str_obj)
num = num + 1
return list