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 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2527
来自专栏杨龙飞前端

scrollto 到指定位置

2494
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2687
来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2132
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

30810
来自专栏C#

DotNet加密方式解析--非对称加密

    新年新气象,也希望新年可以挣大钱。不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬。(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...)...

4828
来自专栏java 成神之路

使用 NIO 实现 echo 服务器

4537
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

2938
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2622
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

4818

扫码关注云+社区