Python,批量修改Excel的数据

一、引言

        本文解决的问题:批量修改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

 四、结语

        希望对您有帮助,祝您天天开心,享受每一天!~

       

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年11月30日
下一篇 2023年11月30日

相关推荐