一、引言
本文解决的问题:批量修改Excel中的数据。 学会使用xlrd和openpyxl。最后用一个批量修改Excel的数值作为案例实现。
二、需要用到的库和函数使用方法。
(1)openpyxl;
①读取Excel文件
xlsx_path = u'Excel文件路径'
wb = openpyxl.load_workbook(xlsx_path)
②获取Excel文件中某个sheet页
ws = wb.worksheets[0] #获取第一页sheet
③获取当前sheet页中有效的行和列
cols = ws.max_column #获取有效的数据的最大列数
rows = ws.max_row #最大行数
④获取单元格的内容,并进行修改
#ws就是之前获取的sheet;
ws.cell(row=row,column=col).value #获取(row,col)单元格的值
ws.cell(row=row,column=col).value = random.randint(1,5) #将(row,col)单元格的值 变成一个[1,5]的随机整数
#此处有一个注意事项
#cell(r,c)中的行r和列c 是从1开始。而不是0。 例如A11则是ws.cell(1,1),不是ws.cell(0,0)
⑤保存Excel文件
#wb = openpyxl.load_workbook(xlsx_path)
wb.save("./2.xlsx") #设置保存的路径 和保存的文件名:2.xlsx
(2)xlrd,与上一个介绍的差不多。只是库函数用法有点区别。
就不单独介绍,会用同一个案例,不同的库去实现。详情直接看代码即可。
三、案例实现:
将一张表中的所有的数值 进行 随机上下波动。
在Python3的环境下,并且用pip install openpyxl/xlrd安装好库
一,使用openpyxl。
# -*- coding: GBK -*-
# -*- coding:gbk -*-
import openpyxl
import re
import traceback
import os
import random
xlsx_path = u'./1.xlsx'
wb = openpyxl.load_workbook(xlsx_path) #打开Excel
num = 0 #初始化num
#获取所有sheet页
#sheet_list = wb.sheetnames #可以自己加个遍历,一次性处理多个sheet页。
#此处只做一个sheet页的数字随机更改
ws = wb.worksheets[0] #直接获取sheet的第一页;
cols = ws.max_column #获取有效数据的最大列
rows = ws.max_row #获取有效数据的最大行
print('cols:'+str(cols)+'____rows:'+str(rows)) #查看有效行数和列数
#开始遍历最大有效行数和列数 内的每一个 单元格;
for row in range(1,rows+1):
for col in range(1,cols+1):
content = ws.cell(row=row,column=col).value #获取该行该列单元格的内容content
if(content !=None): # 如果该单元格内容不为空
if(isinstance(content, int)): #如果该内容 为 整数
#if type(content).__name__ == 'int': #用这个判断也可以。效果相同
if content>0 and content<=5:
ws.cell(row=row,column=col).value = random.randint(1,5) #进行数值更改
if content>5 and content<=10:
ws.cell(row=row,column=col).value = random.randint(5,10)
if content>10 and content<=20:
ws.cell(row=row,column=col).value = random.randint(10,20)
if content>20 and content<=50:
ZF = random.choice((-1, 1)) #随机选择 +1或者-1
ran_num = random.randint(1,7) #随机出现 [1,7]的正整数
num = content + (ZF*ran_num) #num是[-7,7]之间的数
print(str(content)+'....'+str(num))
ws.cell(row=row,column=col).value = num #原数字上下波动范围是7
if content>50 and content<=200:
ZF = random.choice((-1, 1))
ran_num = random.randint(1,15)
num = content + (ZF*ran_num)
print(str(content)+'....'+str(num))
ws.cell(row=row,column=col).value = num
if content>200 and content<=500:
ZF = random.choice((-1, 1))
ran_num = random.randint(1,35)
num = content + (ZF*ran_num)
print(str(content)+'....'+str(num))
ws.cell(row=row,column=col).value = num
if content>500 and content<=1000:
ZF = random.choice((-1, 1))
ran_num = random.randint(1,55)
num = content + (ZF*ran_num)
print(str(content)+'....'+str(num))
ws.cell(row=row,column=col).value = num
if content>1000 and content<=10000:
ZF = random.choice((-1, 1))
ran_num = random.randint(1,115)
num = content + (ZF*ran_num)
print(str(content)+'....'+str(num))
ws.cell(row=row,column=col).value = num
if content>10000 and content<=50000:
ZF = random.choice((-1, 1))
ran_num = random.randint(1,515)
num = content + (ZF*ran_num)
print(str(content)+'....'+str(num))
ws.cell(row=row,column=col).value = num
if content>50000 :
ZF = random.choice((-1, 1))
ran_num = random.randint(1,2000)
num = content + (ZF*ran_num)
print(str(content)+'....'+str(num))
ws.cell(row=row,column=col).value = num
wb.save("./2.xlsx") #保存文件
代码实现效果图:
原本的1.xlsx
运行结果的2.xlsx
二.xlrd
代码:
# -*- coding: GBK -*-
from xlutils.copy import copy
import xlrd
import random
# 缓存原excel内容
data = xlrd.open_workbook(filename=r'./1.xlsx')
# 索引下标为1的sheet页
new_excel = copy(data)
sheet11 = data.sheet_by_index(0) #用于获取sheet1的最大行数和列数以及单元格数据
sheet1 = new_excel.get_sheet(0) #通过copy,sheet1;方便修改和保存
cols = sheet11.ncols #有效的最大列数
rows = sheet11.nrows #有效的最大行数
#print(cols)
#print(rows)
#print(type(sheet11.cell_value(0,0))) #查看复制过来的A11的数据类型
#发现数据类型,纯数字为float ; 文字、空格、字母都是 str型;
for r in range(0,rows): #此处的单元格从(0,0)开始;区别于openpyxl
for c in range(0,cols):
content = sheet11.cell_value(r,c) #获取该行该列单元格的内容
if(isinstance(content, float)): #判断是否为float
#其实直接写isinstance(content, float)就行;
#但是我写的时候,就想多此一举而已;
T = True
else:
T = False
if(content !=None ): # 如果该单元格内容不为空
if(T):#if(isinstance(content, float))
content = int(float(content)) #将float转化成int
if content>0 and content<=5:
sheet1.write(r,c,random.randint(1,5)) #采用copy的sheet1;通过wirte直接修改
if content>5 and content<=10:
sheet1.write(r,c,random.randint(5,10))
if content>10 and content<=20:
sheet1.write(r,c,random.randint(10,20))
if content>20 and content<=50:
ZF = random.choice((-1, 1)) #随机选择 +1或者-1
ran_num = random.randint(1,7) #随机出现 [1,7]的正整数
num = content + (ZF*ran_num)
print(str(content)+'....'+str(num))
sheet1.write(r,c,num)
if content>50 and content<=200:
ZF = random.choice((-1, 1))
ran_num = random.randint(1,15)
num = content + (ZF*ran_num)
print(str(content)+'....'+str(num))
sheet1.write(r,c,num)
if content>200 and content<=500:
ZF = random.choice((-1, 1))
ran_num = random.randint(1,35)
num = content + (ZF*ran_num)
print(str(content)+'....'+str(num))
sheet1.write(r,c,num)
if content>500 and content<=1000:
ZF = random.choice((-1, 1))
ran_num = random.randint(1,55)
num = content + (ZF*ran_num)
print(str(content)+'....'+str(num))
sheet1.write(r,c,num)
if content>1000 and content<=10000:
ZF = random.choice((-1, 1))
ran_num = random.randint(1,115)
num = content + (ZF*ran_num)
print(str(content)+'....'+str(num))
sheet1.write(r,c,num)
if content>10000 and content<=50000:
ZF = random.choice((-1, 1))
ran_num = random.randint(1,515)
num = content + (ZF*ran_num)
print(str(content)+'....'+str(num))
sheet1.write(r,c,num)
if content>50000 :
ZF = random.choice((-1, 1))
ran_num = random.randint(1,2000)
num = content + (ZF*ran_num)
print(str(content)+'....'+str(num))
sheet1.write(r,c,num)
new_excel.save(r'./2.xlsx') #通过copy的excel直接保存;
代码运行效果图:2.xlsx
四、结语
希望对您有帮助,祝您天天开心,享受每一天!~
文章出处登录后可见!
已经登录?立即刷新