设为首页 加入收藏

TOP

Python操作excel表格(一)
2017-10-13 10:50:33 】 浏览:3085
Tags:Python 操作 excel 表格

用Python操作Excel在工作中还是挺常用的,因为毕竟不懂Excel是一个用户庞大的数据管理软件

注:本篇代码在Python3环境下运行

首先导入两个模块xlrd和xlwt,xlrd用来读取Excel表格,xlwt是写Excel表格

在命令提示行输入命令:

  pip install xlrd

  pip install xlwt

下面我们学习一下这两个模块的使用

一、xlrd

1.首先导入模块,import xlrd

2.先写一个表用来实验,表的内容是这样的:

 

import xlrd

file_path = '1.xlsx'

xlrd.Book.encoding = "utf8" #设置编码
data = xlrd.open_workbook(file_path)#打开文件
sheet_names = data.sheet_names()  #查看文件中包含sheet的名称

获取工作簿,有三种方式

# table = data.sheets()[0]
# table = data.sheet_by_name('Sheet1')
table = data.sheet_by_index(0) #取第一张工作簿(三种方法)

获取总行数和总列数

rows_count = table.nrows #取总行数
cols_count = table.ncols#取总列数

 获取第一行及第一列数据

row_data = table.row_values(0)#获取第一行数据(数组)
col_data = table.col_values(0)#获取第一列数据(数组)

获取某个单元格的值

cell_data = row_data[0]  #取第0行第0列的值   战士
cell_data_A1 = table.cell(1, 1).value  #取第1行第1列的值    李白

循环读取所有数据

for row in range(0,rows_count):
    for col in range(0,cols_count):
        data1 = table.cell(row,col).value
        print(data1,end=' ')
    print('\n')

这是基本操作,下面扩展一点

关于时间格式:

  看一下取时间那一列数据,得到的什么 

['时间', 42993.0, '2017.01.12', 40900.0]

这并不是我们想要的,这个时间格式是Excel中,以1900年1月1日为起始时间,以天为单位的得到的数据

其实在这个模块中,有个属性可以显示单元格数据的类型,ctype,有这几种类型:

  ctype = 1 # 类型 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error

 我们可以查看一下,它打印的这个是什么类型 

print(table.cell(1,6).ctype)#3
print(table.cell(2,6).ctype)#1
print(table.cell(3,6).ctype)#3

原来他能识别这是时间格式,那我们要处理一下了,让他显示格式化时间

可以用这条命令来转换一下

date_value = xlrd.xldate_as_tuple(table.cell_value(1,6),data.datemode)

print(date_value)#(2017, 9, 15, 0, 0, 0)

这个格式就可以用了

from datetime import date,datetime

print(date(*date_value[:3]))#2017-09-15  

print(date(*date_value[:3]).strftime('%Y/%m/%d'))#2017/09/15

所以当我们循环读取并打印数据的时候,可以做一个判断,如果数据的ctype为3,就做这样一个转换

for row in range(0,rows_count):
    for col in range(0,cols_count):
        if (table.cell(row, col).ctype == 3):#如果读到时间格式的数据,就转换
            data_value = xlrd.xldate_as_tuple(table.cell_value(row, col), data.datemode)
            data1 = date(*data_value[:3]).strftime('%Y/%m/%d')
        else:
            data1 = table.cell(row,col).value
        print(data1,end=' ')
    print('\n')
战士 刺客 法师 坦克 辅助 射手 时间 

老夫子 李白 甄姬 亚瑟 蔡文姬 鲁班 2017/09/15 

杨戬 韩信 小乔 牛魔 大乔 狄仁杰 2017.01.12 

典韦 赵云 妲己 钟无艳 孙斌 虞姬 2011/12/23 

 

 

其实,xlrd也能实现简单的修改数据,但是这只是临时的修改,好像并没有什么用

#简单的写入数据
row = 1
col = 0
ctype = 1 # 类型 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
value = '1212'
xf = 0 # 扩展的格式化 (默认是0)
table.put_cell_unragged(row, col, ctype, value, xf)
table.put_cell(row, col, ctype, value, xf)#只是暂时的修改,而且只能是修改已有的数据

然后再读取数据:

for row in range(0,rows_count):
    for col in range(0,cols_count):
        if (table.cell(row, col).ctype == 3):#如果读到时间格式的数据,就转换
            data_value = xlrd.xldate_as_tuple(table.cell_value(row, col), data.datemode)
            data1 = date(*data_value[:3]).strftime('%Y/%m/%d')
        else:
            data1 = table.cell(row,col).value
        print(data1,end=' ')
    print('\n')

拿到的结果就是修改了的,但是这只是临时的,原表格并没有修改

战士 刺客 法师 坦克 辅助 射手 时间 

1212 李白 甄姬 亚瑟 蔡文姬 鲁班 2017/09/15 

杨戬 韩信 小乔 牛魔 大乔 狄仁杰 2017.01.12 

典韦 赵云 妲己 钟无艳 孙斌 虞姬 2011/12/23 

 

关于合并的单元格的读取

默认读取合并的单元格的时候,只会在合并单元格出现的第一个位置有值,其他合并的位置 就是空了,我们可以拿到合并的单元格所在表中的位置

用一张新表,内容如下

 

workbook = xlrd.open_workbook('2.xlsx')
table2 = workbook.sheet_by_index(0) 
print(table2.merged_cells)#[(3, 5, 3, 4), (3, 5, 0, 1)]  读取表中有合并单元格的位置
#merged_cells返回的这四个参数的含义是:(row,row_range,col,
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇身份运算符 下一篇购物车--用户和商户入口

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目