一、Openpyxl不支持老的xls文件、只支持xlsx文件,Openpyxl在python2好像运行不正常
安装
sudo pip3 install Openpyxl
例子:
test.xlsx
$ python3
Python 3.4.3 (default, Oct 14 2015, 20:28:29)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from openpyxl.reader.excel import load_workbook
>>> wb = load_workbook(filename=r'./test.xlsx')
>>> ws=wb["bbb"] #过时 ws=wb.get_sheet_by_name("bbb")
>>> print (ws.cell(row=1,column=1).value)
编号
>>> print (ws.cell(row=1,column=2).value)
单位
>>> print (ws.cell(row=2,column=1).value)
16
>>> print (ws.cell(row=2,column=2).value)
内蒙古通信建设工程有限责任公司
>>>
下面的代码从文件test.xlsx表格bbb读取数据,写到新文件result.xlsx到表格"表1"
#coding=utf-8
from openpyxl import load_workbook
from openpyxl import Workbook
from openpyxl.writer.excel import ExcelWriter
wb = load_workbook(filename = r'./test.xlsx')#获取一个已经存在的excel文件wb
ws=wb.get_sheet_by_name("bbb")#打开该文件wb需要用到的worksheet即ws
wb1=Workbook()#新建立一个工作簿wb1
ewb1=ExcelWriter(workbook=wb1)#新建一个ExcelWriter,用来写wb1
dest_filename=r'result.xlsx'#wb1的名字
ws1=wb1.worksheets[0]#取得wb1的第一个工作表ws1
ws1.title=u"表1"#指定ws1名字为表1
for col_num in range(1,3):#此处遍历列1,2(A,B列)
for row_num in range(1,42):#表示遍历的行数1,41
ws1.cell(row=row_num,column=col_num).value=ws.cell(row=row_num,column=col_num).value
ewb1.save(filename=dest_filename)#保存一定要有,否则不会有结果
注意:最新的openpyxl要做一些修改:
1、get_sheet_by_name函数已经过时,把它改为(不改会告警,但还是可以正确执行):
#ws=wb.get_sheet_by_name("bbb")
ws=wb.worksheets[1]
2、ewb1=ExcelWriter(workbook=wb1)执行报错
TypeError: __init__() takes exactly 3 arguments (2 given)
解决方案:
放弃用ExcelWriter(ewb1),直接用一个语句
wb1.save(filename=dest_filename)
来替换原来的
ewb1=ExcelWriter(workbook=wb1)新建一个ExcelWriter,用来写wb1
....
....
....
ewb1.save(filename=dest_filename)保存一定要有,否则不会有结果
修改后的新版代码如下:
#coding=utf-8
import sys
from openpyxl import load_workbook
from openpyxl import Workbook
from openpyxl.writer.excel import ExcelWriter
if __name__ == '__main__':
wb = load_workbook(filename = r'./test.xlsx')#获取一个已经存在的excel文件wb
#ws=wb.get_sheet_by_name("bbb")
ws=wb.worksheets[1]
wb1=Workbook()#新建立一个工作簿wb1
#ewb1=ExcelWriter(workbook=wb1)新建一个ExcelWriter,用来写wb1
dest_filename=r'result.xlsx'#wb1的名字
ws1=wb1.worksheets[0]#取得wb1的第一个工作表ws1
ws1.title=u"表1"#指定ws1名字为表1
for col_num in range(1,3):#此处遍历列1,2(A,B列)
for row_num in range(1,42):#表示遍历的行数1,41
ws1.cell(row=row_num,column=col_num).value=ws.cell(row=row_num,column=col_num).value
#ewb1.save(filename=dest_filename)保存一定要有,否则不会有结果
wb1.save(filename=dest_filename)
print('result.xlsx from test.xlsx saved!%n')
sys.exit()
二、python2用xlrd,xlwt来读写xls文件
读:
# -*- coding: utf-8 -*-
# 读取excel数据
# 打印第二行以下的数据
import xlrd
data = xlrd.open_workbook('test.xlsx') # 打开xls文件
table = data.sheets()[1] # 打开第二张表,名字为bbb
nrows = table.nrows # 获取表的行数
for i in range(nrows): # 循环逐行打印
if i == 0: # 跳过第一行
continue
for m in table.row_values(i):
print m
写:
#coding=utf-8
#######################################################
#filename:test_xlwt.py
#function:新建excel文件并写入数据
#######################################################
import xlwt
#创建workbook和sheet对象
workbook = xlwt.Workbook() #注意Workbook的开头W要大写
sheet1 = workbook.add_sheet('sheet1',cell_overwrite_ok=True)
sheet2 = workbook.add_sheet('sheet2',cell_overwrite_ok=True)
#向sheet页中写入数据
sheet1.write(0,0,'this should overwrite1')#向sheet1页中一行、一列写入数据
sheet1.write(0,1,'aaaaaaaaaaaa')#向sheet1页中一行、二列写入数据
sheet1.write(1,0,u'第二行第一列')#向sheet1页中二行、一列写入数据
sheet2.write(0,0,'this should overwrite2')
sheet2.write(1,2,'bbbbbbbbbbbbb')
#保存该excel文件,有同名文件时直接覆盖
workbook.save('./test2.xls')
print '创建excel文件完成!'
三、pyExcelerator主要用来写。用来读很不方便
#!/usr/bin/env python
#coding=utf-8
from pyExcelerator import *
w = Workbook()
ws = w.add_sheet('sheet')
#第一行作为header:注意是(0,0)作为第一行第一列
ws.write(0,0,u"姓名")
ws.write(0,1,u"年龄")
ws.write(0,2,u"班级")
data = [["aaaa",9,u"三年二班"], ["bbbb",8,u"三年二班"], ["cccc",9,u"三年二班"]]
#这里一般的处理是对数据循环,对应到sheet中的行列,写入数据
for i in range(len(data)):
for j in range(len(data[i])):
ws.write(i+1,j,data[i][j])
i+=1
w.save('mini.xls')
print ('创建excel文件mini.xls完成!')