
如何使用python将大量数据导出到Excel中的小技巧
(1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢?如果碰到需要导出大量数据又该如何 *** 作呢?本文主要解决以上两个问题。
(2)具体步骤如下:
1第一步,安装openpyxl,
使用pip install openpyxl即可,但是在windows下安装的是226版本,但是centos自动安装的是41版本,(多谢海哥的提醒)。
写的代码在windows下运行没问题,但centos上却报错了,说是ew=ExcelWriter(workbook=wb)少提供一个参数,于是果断在 237服务器上我已安装226版本的,问题解决。
pip install openpyxl==226
2第二步,哈哈,没有啦,废话不说了,直接上代码,ps,代码中包含xlwt和openpyxl的两个实现版本。
(3)扩展阅读:通过查阅资料,发现网上众说纷纭,总结起来有如下几点:
python Excel相关的 *** 作的module lib有两组,一组是xlrd、xlwt、xlutils,另一组是openpyxl,
但是前一组(xlrd,xlwt)比较老,只能处理由Excel 97-2003 或者Excel 97 以前版本生成的xls格式的excel文件,xlwt甚至不支持07版以后的excel ,这个格式excel文件一般来说,最大只能支持256列或者65536行的excel文件。
因此面对需要导出大量数据到excel的情况,你将有如下三种选择,(1)换一种存储格式,如保存为CSV文件 (2)使用openpyxl—,因为它支持对Excel 2007+ xlsx/xlsm format的处理 (3) win32 COM (Windows only)
当然,我们要直面困难了,为了更好地展示数据给产品和用户,我们依然选择的第二种。
ps,非常lucky,一番搜索后我找到了openpyxl,支持07+的excel,一直有人在维护,文档清晰易读,参照Tutorial和API文档很快就能上手,就是它了~
(4)闲话少说,直接上代码,敬请参考
# coding:utf-8
'''
# 希望对大家有帮助哈,请多提问题
create by yaoyz
date: 2017/01/24
'''
import xlrd
import xlwt
# workbook相关
from openpyxlworkbook import Workbook
# ExcelWriter,封装了很强大的excel写的功能
from openpyxlwriterexcel import ExcelWriter
# 一个eggache的数字转为列字母的方法
from openpyxlutils import get_column_letter
from openpyxlreaderexcel import load_workbook
class HandleExcel():
'''Excel相关 *** 作类'''
def __init__(self):
self head_row_labels = [u'学生ID',u'学生姓名',u'****',u'知识点ID',u'知识点名称']
"""
function:
读出txt文件中的每一条记录,把它保存在list中
Param:
filename: 要读出的文件名
Return:
res_list: 返回的记录的list
"""
def read_from_file(self,filename):
res_list=[]
file_obj=open(filename,"r")
for line in file_objreadlines():
res_listappend(line)
file_objclose()
return res_list
"""
function:
读出xlsx中的每一条记录,把它保存在data_dic中返回
Param:
excel_name: 要读出的文件名
Return:
data_dic: 返回的记录的dict
"""
def read_excel_with_openpyxl(self, excel_name="testexcel2007xlsx"):
# 读取excel2007文件
wb = load_workbook(filename=excel_name)
# 显示有多少张表
print "Worksheet range(s):" , wbget_named_ranges()
print "Worksheet name(s):" , wbget_sheet_names()
# 取第一张表
sheetnames = wbget_sheet_names()
ws = wbget_sheet_by_name(sheetnames[0])
# 显示表名,表行数,表列数
print "Work Sheet Titile:" ,wstitle
print "Work Sheet Rows:" ,wsget_highest_row()
print "Work Sheet Cols:" ,wsget_highest_column()
# 获取读入的excel表格的有多少行,有多少列
row_num=wsget_highest_row()
col_num=wsget_highest_column()
print "row_num: ",row_num," col_num: ",col_num
# 建立存储数据的字典
data_dic = {}
sign=1
# 把数据存到字典中
for row in wsrows:
temp_list=[]
# print "row",row
for cell in row:
print cellvalue,
temp_listappend(cellvalue)
print ""
data_dic[sign]=temp_list
sign+=1
print data_dic
return data_dic
"""
function:
读出xlsx中的每一条记录,把它保存在data_dic中返回
Param:
records: 要保存的,一个包含每一条记录的list
save_excel_name: 保存为的文件名
head_row_stu_arrive_star:
Return:
data_dic: 返回的记录的dict
"""
def write_to_excel_with_openpyxl(self,records,head_row,save_excel_name="savexlsx"):
# 新建一个workbook
wb = Workbook()
# 新建一个excelWriter
ew = ExcelWriter(workbook=wb)
# 设置文件输出路径与名称
dest_filename = save_excel_namedecode('utf-8')
# 第一个sheet是ws
ws = wbworksheets[0]
# 设置ws的名称
wstitle = "range names"
# 写第一行,标题行
for h_x in range(1,len(head_row)+1):
h_col=get_column_letter(h_x)
#print h_col
wscell('%s%s' % (h_col, 1))value = '%s' % (head_row[h_x-1])
# 写第二行及其以后的那些行
i = 2
for record in records:
record_list=str(record)strip()split("\t")
for x in range(1,len(record_list)+1):
col = get_column_letter(x)
wscell('%s%s' % (col, i))value = '%s' % (record_list[x-1]decode('utf-8'))
i += 1
# 写文件
ewsave(filename=dest_filename)
"""
function:
测试输出Excel内容
读出Excel文件
Param:
excel_name: 要读出的Excel文件名
Return:
无
"""
def read_excel(self,excel_name):
workbook=xlrdopen_workbook(excel_name)
print workbooksheet_names()
# 获取所有sheet
print workbooksheet_names() # [u'sheet1', u'sheet2']
sheet2_name = workbooksheet_names()[1]
# 根据sheet索引或者名称获取sheet内容
sheet2 = workbooksheet_by_index(1) # sheet索引从0开始
sheet2 = workbooksheet_by_name('Sheet1')
# sheet的名称,行数,列数
print sheet2name,sheet2nrows,sheet2ncols
# 获取整行和整列的值(数组)
rows = sheet2row_values(3) # 获取第四行内容
cols = sheet2col_values(2) # 获取第三列内容
print rows
print cols
# 获取单元格内容
print sheet2cell(1,0)value
print sheet2cell_value(1,0)
print sheet2row(1)[0]value
# 获取单元格内容的数据类型
print sheet2cell(1,0)ctype
# 通过名称获取
return workbooksheet_by_name(u'Sheet1')
"""
function:
设置单元格样式
Param:
name: 字体名字
height: 字体高度
bold: 是否大写
Return:
style: 返回设置好的格式对象
"""
def set_style(self,name,height,bold=False):
style = xlwtXFStyle() # 初始化样式
font = xlwtFont() # 为样式创建字体
fontname = name # 'Times New Roman'
fontbold = bold
fontcolor_index = 4
fontheight = height
borders= xlwtBorders()
bordersleft= 6
bordersright= 6
borderstop= 6
bordersbottom= 6
stylefont = font
styleborders = borders
return style
"""
function:
按照 设置单元格样式 把计算结果由txt转变为Excel存储
Param:
dataset:要保存的结果数据,list存储
Return:
将结果保存为 excel对象中
"""
def write_to_excel(self, dataset,save_excel_name,head_row):
f = xlwtWorkbook() # 创建工作簿
# 创建第一个sheet:
# sheet1
count=1
sheet1 = fadd_sheet(u'sheet1', cell_overwrite_ok=True) # 创建sheet
# 首行标题:
for p in range(len(head_row)):
sheet1write(0,p,head_row[p],selfset_style('Times New Roman',250,True))
default=selfset_style('Times New Roman',200,False) # define style out the loop will work
for line in dataset:
row_list=str(line)strip("\n")split("\t")
for pp in range(len(str(line)strip("\n")split("\t"))):
sheet1write(count,pp,row_list[pp]decode('utf-8'),default)
count+=1
fsave(save_excel_name) # 保存文件
def run_main_save_to_excel_with_openpyxl(self):
print "测试读写2007及以后的excel文件xlsx,以方便写入文件更多数据"
print "1 把txt文件读入到内存中,以list对象存储"
dataset_list=selfread_from_file("test_exceltxt")
'''test use openpyxl to handle EXCEL 2007'''
print "2 把文件写入到Excel表格中"
head_row_label=selfhead_row_labels
save_name="test_openpyxlxlsx"
selfwrite_to_excel_with_openpyxl(dataset_list,head_row_label,save_name)
print "3 执行完毕,由txt格式文件保存为Excel文件的任务"
def run_main_save_to_excel_with_xlwt(self):
print " 4 把txt文件读入到内存中,以list对象存储"
dataset_list=selfread_from_file("test_exceltxt")
'''test use xlwt to handle EXCEL 97-2003'''
print " 5 把文件写入到Excel表格中"
head_row_label=selfhead_row_labels
save_name="test_xlwtxls"
selfwrite_to_excel_with_openpyxl(dataset_list,head_row_label,save_name)
print "6 执行完毕,由txt格式文件保存为Excel文件的任务"
if __name__ == '__main__':
print "create handle Excel Object"
obj_handle_excel=HandleExcel()
# 分别使用openpyxl和xlwt将数据写入文件
obj_handle_excelrun_main_save_to_excel_with_openpyxl()
obj_handle_excelrun_main_save_to_excel_with_xlwt()
'''测试读出文件,注意openpyxl不可以读取xls的文件,xlrd不可以读取xlsx格式的文件'''
#obj_handle_excelread_excel_with_openpyxl("testexcel2003xls") # 错误写法
#obj_handle_excelread_excel_with_openpyxl("testexcel2003xls") # 错误写法
obj_handle_excelread_excel("testexcel2003xls")
obj_handle_excelread_excel_with_openpyxl("testexcel2007xlsx")
这个过程有几个比较麻烦的问题,比如读取日期、读合并单元格内容。下面先看看基本的 *** 作:
首先读一个excel文件,有两个sheet,测试用第二个sheet,sheet2内容如下:
python 对 excel基本的 *** 作如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# -- coding: utf-8 --
import xlrd
import xlwt
from datetime import date,datetime
def read_excel():
# 打开文件
workbook = xlrdopen_workbook(r'F:\demoxlsx')
# 获取所有sheet
print workbooksheet_names() # [u'sheet1', u'sheet2']
sheet2_name = workbooksheet_names()[1]
# 根据sheet索引或者名称获取sheet内容
sheet2 = workbooksheet_by_index(1) # sheet索引从0开始
sheet2 = workbooksheet_by_name('sheet2')
# sheet的名称,行数,列数
print sheet2name,sheet2nrows,sheet2ncols
# 获取整行和整列的值(数组)
rows = sheet2row_values(3) # 获取第四行内容
cols = sheet2col_values(2) # 获取第三列内容
最近由于经常要用到Excel,需要根据Excel表格中的内容对一些apk进行处理,手动处理很麻烦,于是决定写脚本来处理。首先贴出网上找来的读写Excel的脚本。
1读取Excel(需要安装xlrd):
123456789101112131415161718192021222324#-- coding: utf8 --import xlrd fname = "reflectxls"bk = xlrdopen_workbook(fname)shxrange = range(bknsheets)try: sh = bksheet_by_name("Sheet1")except: print "no sheet in %s named Sheet1" % fname#获取行数nrows = shnrows#获取列数ncols = shncolsprint "nrows %d, ncols %d" % (nrows,ncols)#获取第一行第一列数据cell_value = shcell_value(1,1)#print cell_value row_list = []#获取各行数据for i in range(1,nrows): row_data = shrow_values(i) row_listappend(row_data)2写入Excel(需安装pyExcelerator)
12345678from pyExcelerator import w = Workbook() #创建一个工作簿ws = wadd_sheet('Hey, Hades') #创建一个工作表wswrite(0,0,'bit') #在1行1列写入bitwswrite(0,1,'huang') #在1行2列写入huangwswrite(1,0,'xuan') #在2行1列写入xuanwsave('minixls') #保存3再举个自己写的读写Excel的例子
读取reflectxls中的某些信息进行处理后写入minixls文件中。
1234567891011121314151617181920212223242526272829303132333435363738394041424344#-- coding: utf8 --import xlrdfrom pyExcelerator import w = Workbook()ws = wadd_sheet('Sheet1') fname = "reflectxls"bk = xlrdopen_workbook(fname)shxrange = range(bknsheets)try: sh = bksheet_by_name("Sheet1")except: print "no sheet in %s named Sheet1" % fname nrows = shnrowsncols = shncolsprint "nrows %d, ncols %d" % (nrows,ncols) cell_value = shcell_value(1,1)#print cell_value row_list = []mydata = []for i in range(1,nrows): row_data = shrow_values(i) pkgdatas = row_data[3]split(',') #pkgdatassplit(',') #获取每个包的前两个字段 for pkgdata in pkgdatas: pkgdata = ''join((pkgdatasplit(''))[:2]) mydataappend(pkgdata) #将列表排序 mydata = list(set(mydata)) print mydata #将列表转化为字符串 mydata = ','join(mydata) #写入数据到每行的第一列 wswrite(i,0,mydata) mydata = [] row_listappend(row_data[3])#print row_list wsave('minixls')4现在我需要根据Excel文件中满足特定要求的apk的md5值来从服务器获取相应的apk样本,就需要这样做:
123456789101112131415161718192021222324252627282930313233#--coding:utf8--import xlrdimport osimport shutil fname = "/excelnamexls"bk = xlrdopen_workbook(fname)shxrange = range(bknsheets)try: #打开Sheet1工作表 sh = bksheet_by_name("Sheet1")except: print "no sheet in %s named Sheet1" % fname#获取行数nrows = shnrows#获取列数ncols = shncols#print "nrows %d, ncols %d" % (nrows,ncols)#获取第一行第一列数据cell_value = shcell_value(1,1)#print cell_value row_list = []#range(起始行,结束行)for i in range(1,nrows): row_data = shrow_values(i) if row_data[6] == "HXB": filename = row_data[3]+"apk" #print "%s %s %s" %(i,row_data[3],filename) filepath = r"/1/"+filename print "%s %s %s" %(i,row_data[3],filepath) if ospathexists(filepath): shutilcopy(filepath, r"/myapk/")补充一个使用xlwt3进行Excel文件的写 *** 作。
1234567891011121314151617181920212223242526import xlwt3 if __name__ == '__main__': datas = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h']]#二维数组 file_path = 'D:\\testxlsx' wb = xlwt3Workbook() sheet = wbadd_sheet('test')#sheet的名称为test #单元格的格式 style = 'pattern: pattern solid, fore_colour yellow; '#背景颜色为** style += 'font: bold on; '#粗体字 style += 'align: horz centre, vert center; '#居中 header_style = xlwt3easyxf(style) row_count = len(datas) col_count = len(datas[0]) for row in range(0, row_count): col_count = len(datas[row]) for col in range(0, col_count): if row == 0:#设置表头单元格的格式 sheetwrite(row, col, datas[row][col], header_style) else: sheetwrite(row, col, datas[row][col]) wbsave(file_path)输出的文件内容如下图:
注:以上代码在Python 3x版本测试通过。
好了,python *** 作Excel就这么!些了,简单吧
以上就是关于如何使用python将大量数据导出到Excel中的小技巧全部的内容,包括:如何使用python将大量数据导出到Excel中的小技巧、Python 使用xlwt和xlrd *** 作Excel自动换sheet的问题,如何让每5条数据放到一个sheet里面、python怎么读取excel的数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)