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

相关文章

来自专栏hbbliyong

12个非常有用的JavaScript技巧

在这篇文章中,我将分享12个非常有用的JavaScript技巧。这些技巧可以帮助你减少并优化代码。  1) 使用!!将变量转换成布尔类型 有时,我们需要检查...

2617
来自专栏代码拾遗

​Java 注解详解

注解是在Java 1.5之后引入的,为的是可以直接在代码中编写元信息。在注解发布之前,如果想要描述代码只能将其写入到其他文件中,例如xml。 注解可以应用于包,...

691
来自专栏Android开发指南

1:基本概念

2667
来自专栏Java帮帮-微信公众号-技术文章全总结

JavaWeb01轻松掌握HTML(Java真正的全栈开发)

? html 一.html介绍: 全称为HyperText Markup Language,译为超文本标记语言,它不是一种编程语言,是一种描述性的标记语言,用...

3225
来自专栏编程

《4》python数据类型和变量

(4)python数据类型和变量 ? 整数 Python可以处理任意大小的整数,例如:1,100,-8080,0,等等。 十六进制用0x前缀和0-9,a-f表示...

3249
来自专栏web前端

Vuejs --02 Vue实例

一、构造器      1、vm(view model 表示Vue实例),每个Vuejs都是通过构造函数Vue创建Vue的根实例启动 var vm = new V...

2048
来自专栏信安之路

python 2.7正则下篇

看的出来(?P<year>\d{4})中,可以用尖括号中的名字去获取后面正则匹配出来的数值,这样方便调用,便于记忆。

592
来自专栏北京马哥教育

Linux Awk用法总结

? 目录 Awk是什么 命令行语法 脚本(Script)组成 模式(Pattern) 正则表达式(Regular Expression) 表达式(Exp...

2814
来自专栏LinkedBear的个人空间

唠唠SE的IO-02——字节输入输出流 原

计算机中都是二进制数据,一个字节是8个2进制位。字节可以表示所有的数据,比如文本,音频,视频。

683
来自专栏V站

PHP常用函数总结

$x = 5.7; $y = 1.3; // 两个浮点数,x>y 浮点余数 $r = fmod($x, $y); // $r equals 0.5, becau...

1982

扫描关注云+社区