Python Excel操作

最近公司要把Excel导入到mysql数据库,查了几篇博文,这几项是非常有用的,记录下来。

一、安装xlrd模块

到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了python 环境。

二、使用介绍

1、导入模块

import xlrd

2、打开Excel文件读取数据

data = xlrd.open_workbook('excelFile.xls')

3、使用技巧

获取一个工作表

table = data.sheets()[0] #通过索引顺序获取

table = data.sheet_by_index(0) #通过索引顺序获取

table = data.sheet_by_name(u'Sheet1')#通过名称获取

获取整行和整列的值(数组)

table.row_values(i)

table.col_values(i)

获取行数和列数

nrows = table.nrows

ncols = table.ncols

循环行列表数据

for i in range(nrows ):

print table.row_values(i)

单元格

cell_A1 = table.cell(0,0).value

cell_C4 = table.cell(2,3).value

使用行列索引

cell_A1 = table.row(0)[0].value

cell_A2 = table.col(1)[0].value

简单的写入

row = 0

col = 0

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

ctype = 1 value = '单元格的值'

xf = 0 # 扩展的格式化

table.put_cell(row, col, ctype, value, xf)

table.cell(0,0) #单元格的值'

table.cell(0,0).value #单元格的值'

三、Demo代码

Demo比较简单,就是读取Excel数据。

 1 # -*- coding: utf-8 -*- 
 2 import  xdrlib ,sys
 3 import xlrd
 4 def open_excel(file= 'file.xls'):
 5     try:
 6         data = xlrd.open_workbook(file)
 7         return data
 8     except Exception,e:
 9         print str(e)
10 #根据索引获取Excel表格中的数据   参数:file:Excel文件路径     colnameindex:表头列名所在行的所以  ,by_index:表的索引
11 def excel_table_byindex(file= 'file.xls',colnameindex=0,by_index=0):
12     data = open_excel(file)
13     table = data.sheets()[by_index]
14     nrows = table.nrows #行数
15     ncols = table.ncols #列数
16     colnames =  table.row_values(colnameindex) #某一行数据 
17     list =[]
18     for rownum in range(1,nrows):
19 
20          row = table.row_values(rownum)
21          if row:
22              app = {}
23              for i in range(len(colnames)):
24                 app[colnames[i]] = row[i] 
25              list.append(app)
26     return list
27 
28 #根据名称获取Excel表格中的数据   参数:file:Excel文件路径     colnameindex:表头列名所在行的所以  ,by_name:Sheet1名称
29 def excel_table_byname(file= 'file.xls',colnameindex=0,by_name=u'Sheet1'):
30     data = open_excel(file)
31     table = data.sheet_by_name(by_name)
32     nrows = table.nrows #行数 
33     colnames =  table.row_values(colnameindex) #某一行数据 
34     list =[]
35     for rownum in range(1,nrows):
36          row = table.row_values(rownum)
37          if row:
38              app = {}
39              for i in range(len(colnames)):
40                 app[colnames[i]] = row[i]
41              list.append(app)
42     return list
43 
44 def main():
45    tables = excel_table_byindex()
46    for row in tables:
47        print row
48 
49    tables = excel_table_byname()
50    for row in tables:
51        print row
52 
53 if __name__=="__main__":
54     main()

然后就是日期的处理,日期类型的cell取出来是个数字,于是查询了下解决的办法。

基本的代码结构

  1. data = xlrd.open_workbook(EXCEL_PATH)
  2. table = data.sheet_by_index(0)
  3. lines = table.nrows
  4. cols = table.ncols
  5. print u'The total line is %s, cols is %s'%(lines, cols)

读取某个单元格:

  1. table.cell(x, y).value

x:行

y:列

行,列都是从0开始

* 时间类型的转换,把excel中时间转成python 时间(两种方式)

excel某个单元格 2014/7/8

  1. xlrd.xldate_as_tuple(table.cell(2,2).value, 0) #转化为元组形式
  2. (2014, 7, 8, 0, 0, 0)
  3. xlrd.xldate.xldate_as_datetime(table.cell(2,2).value, 1) #直接转化为datetime对象
  4. datetime.datetime(2018, 7, 9, 0, 0)
  5. table.cell(2,2).value #没有转化
  6. 41828.0

源码查看:

  1. # @param xldate The Excel number
  2. # @param datemode 0: 1900-based, 1: 1904-based.
  3. xldate_as_tuple(xldate, datemode)

输入一个日期类型的单元格会返回一个时间结构组成的元组,可以根据这个元组组成时间类型

datemode 有2个选项基本我们都会使用1900为基础的时间戳

  1. ##
  2. # Convert an Excel date/time number into a datetime.datetime object.
  3. #
  4. # @param xldate The Excel number
  5. # @param datemode 0: 1900-based, 1: 1904-based.
  6. #
  7. # @return a datetime.datetime() object.
  8. #
  9. def xldate_as_datetime(xldate, datemode)

输入参数和上面的相同,但是返回值是一个datetime类型,就不需要在自己转换了

最后还有一个就是写入excel,相对比较简单

[python] view plaincopy

  1. from pyExcelerator import *
  2. w = Workbook() #创建一个工作簿
  3. ws = w.add_sheet('Hey, Hades') #创建一个工作表
  4. ws.write(0,0,'bit') #在1行1列写入bit
  5. ws.write(0,1,'huang') #在1行2列写入huang
  6. ws.write(1,0,'xuan') #在2行1列写入xuan
  7. w.save('mini.xls') #保存

注意,中文需要转码

txt="中文"

ws.write(1,1,txt.decode("gbk"))

贴上我写的导出excel 函数:

[python] view plaincop

  1. #-*-coding:utf8 -*-
  2. #import xlrd
  3. from pyExcelerator import *
  4. def table_to_excel(user_list, file_name="result.xls"):
  5. '''''This function can output the user_list to the excel files'''
  6. work_book = Workbook()
  7. work_sheet = work_book.add_sheet("solution")
  8. key_col_map = {}
  9. for col, key in enumerate(user_list[0]):
  10. work_sheet.write(0, col, key)
  11. key_col_map[key] = col
  12. for cursor, user in enumerate(user_list):
  13. for key, value in user.items():
  14. work_sheet.write(cursor + 1, key_col_map[key], str(value).decode("utf-8"))
  15. work_book.save(file_name)
  16. if __name__ == "__main__":
  17. '''''For test the function'''
  18. test_list = []
  19. item1 = {}
  20. item1["test"] = "good"
  21. item1["number"] = 10
  22. item2 = {"test": "bad",
  23. "number": 9
  24. }
  25. test_list.append(item1)
  26. test_list.append(item2)
  27. table_to_excel(test_list)

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2015-07-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏dotnet core相关

datatables 配套bootstrap3样式使用小结(1)

公司CMS内容资讯站的后台管理界面用了大量的table来管理数据,试用了之后,感觉挺不错,推荐一下。

782

在Atom中设置Python开发环境

当然,网络上有很多很棒的文本编辑器。Sublime Text,Bracket,Atom等。就我个人而言,我一直都是Atom的粉丝,因为它是完全免费的,并且它有...

3598
来自专栏我的博客

EclipsePHP studio使用集锦

ps:以前一直用dw编辑php,今天打算尝试新的编辑器使用(其实中间使用过gedit,notepad++,editor等) 今天打算彻底在windows下使用e...

3094
来自专栏技术博文

php pathinfo()的用法

pathinfo — 返回文件路径的信息  mixed pathinfo ( string $path [, int $options = PATHINFO_D...

3427
来自专栏Ryan Miao

sublime Text3使用笔记

转载:http://blog.csdn.net/u012771929/article/details/30030249 目录: 1.setting   安装插件...

34211
来自专栏24K纯开源

Android Studio快捷键每日一练(4)

33、分析数据流到当前位置 苹果/Windows:无对应快捷键,可在菜单中选择Analyze->Analyze Data Flow to Here 通过分析当前...

1998
来自专栏加米谷大数据

技术分享 | Centos下 Vim快捷键操作命令大全

Vim是一个超牛的编辑器,命令功能十分强大 。而且这些命令大都可以进行组合 , 比如,9yy命令表示复制9行内容,9表示要复制的行数,同样100dd表示删除10...

34010
来自专栏从零开始学自动化测试

pytest文档3-pycharm运行pytest

上一篇pytest文档2-用例运行规则已经介绍了如何在cmd执行pytest用例,平常我们写代码在pycharm比较多 写完用例之后,需要调试看看,是不是能正常...

903
来自专栏lgp20151222

kotlin查看编译后的Java代码

java学一下kotlin,由于用的是同样的jvm,那就说明他们的字节码文件应该是一样的,那么,如果我们能看到编译后的文件,那么学的更快了。

550
来自专栏Ryan Miao

idea快捷键总结

使用好快捷键会快很多,这里我慢慢添加我用习惯的快捷键。参考 1.alt+enter 这个几乎万能,有错误提示的时候将光标移动到错误处,然后alt+enter,会...

27112

扫码关注云+社区