一、前言

大家好,今天我来介绍一下我接的zhenguo老师的第一个Python单子。我完成这个单子前后不到2小时。

首先我接到这个单子的想法是处理Excel表,在两个表之间建立联系,并通过项目需求,修改excel表中的数据。我是运用面向过程写的,将每一步都放在了不同的函数中,下面让我来介绍一下我是怎么通过自己的思路一步一步完成的。

做完单子后,zhenguo老师很快就给我转账了,并且没有二次修改,感觉很省心:

投稿这篇文章后,zhenguo老师又给我50元稿费:

先上客户的需求

二、代码实现及讲解

  1. 模块的导入

主要用到的模块为openpyxl、random

import openpyxl
import random
from  openpyxl.utils.cell import get_column_letter,column_index_from_string

除了运用到openpyxl和random还用到了openpyxl中的utils包下cell模块的两个方法,第一个方法get_column_letter的作用是将整型转换为对应excel中列属性的字符串,例如:12转换为L,50转换为AX

第二个方法是将字符串转换为整型,其本质类似于10进制和27进制之间的转换,当然你也可以自己写,下面附上自己写的行(整型)转换为列(字符串)的代码。

def num_to_string(n):column = n - 1real_colum = ''while column >= 26:value = column // 26column = column % 26real_colum += chr(value + 64)real_colum += chr(column + 65)return real_colum

2.获取“数据原表”中数据

#创建一个全局变量MATERIAL_MESSAGE
MATERIAL_MESSAGE = []
#获取小宛中数据
def get_construct_message():#读取数据原表.xlsx表wb = openpyxl.load_workbook('数据原表.xlsx')#获取获取当前活动工作表,默认为第一个表ws = wb.active#获取在生产记录更新.xlsx中的可以用到的数据存入MATERIAL_MESSAGE中for row in range(1,ws.max_row + 1):if ws[f'A{row}'].value == '日期':for i in range(ord('B'),ord('I')):material = []#将日期转换为与生产记录更新中相对应写法的形式date = ws[f'B{row}'].value.translate(str.maketrans('年月','--'))date = date.replace('号','')material.append(date)i = chr(i)material.append(ws[f'{i}{row + 1}'].value)material.append(ws[f'{i}{row + 3}'].value)MATERIAL_MESSAGE.append(material)print(MATERIAL_MESSAGE)

3.获取生产记录更新表中的日期和材料

# 将客户要求的对应数据存入字典中
TABLES = {"水泥":"水泥1","粉煤灰":"煤灰","河沙":"沙1","粗骨料1":"石1","粗骨料2":"石2","减水剂":"外加剂","水":"水"}
#存入生产记录更新表的日期和其所在的行数
DATE = []
#存入生产记录更新表的材料和其所在的列数
MATERIAL = []
wb = openpyxl.load_workbook('生产记录更新.xlsx')
ws = wb.active
#获取日期
def get_date():for row in range(3,ws.max_row + 1):#将日期进行分割合并转换成与MATERIAL_MESSAGE中对应日期的格式date = str(ws[f'B{row}'].value).split()[0]date_list = date.split('-')if '0' in date_list[1]:date_list[1] = date_list[1].replace('0','')if '0' in date_list[2]:date_list[2] = date_list[2].replace('0','')date = '-'.join(date_list)DATE.append([date,row])pprint.pprint(DATE)#获取材料
def get_material():n = 0for column in ws[1]:n += 1#判断该单元格的内容是否在TABLES中if column.value in TABLES.values():#运用行列转换的方法进行转换MATERIAL.append([column.value,get_column_letter(n - 1)])pprint.pprint(MATERIAL)

DATE表部分数据

MATERIAL表数据

4.对生产数据更新表中数据的修改

#两个参数分别为材料的类型和所在的列数
def update_default(matrial,letter):for row in range(3,ws.max_row + 1):#判断单元格是否为空if ws[f'{letter}{row}'].value != None:for i in range(len(MATERIAL_MESSAGE)):#需求条件,要将连个表中的日期和材料类型进行一一对应if DATE[row-3][0] == MATERIAL_MESSAGE[i][0] and matrial == TABLES[MATERIAL_MESSAGE[i][1]]:#修改形参letter对应列的每个符号要求的单元格对应的设定值ws[f'{letter}{DATE[row - 3][1]}'].value = MATERIAL_MESSAGE[i][2]#分别获取该列列号的下两列对应的列号letter_random = get_column_letter(column_index_from_string(letter) + 2)letter_real = get_column_letter(column_index_from_string(letter) + 1)#判断该列是否在这三列中,若在其中则得到-2到2之间的随机数,否则-1到1之间的随机数,并更新误差值if letter in ('AV','BB','BE'):ws[f'{letter_random}{DATE[row - 3][1]}'].value = round(random.uniform(-2, 2), 1)else:ws[f'{letter_random}{DATE[row - 3][1]}'].value = round(random.uniform(-1, 1), 1)#运用设定值和误差值更新中间的实际值ws[f'{letter_real}{DATE[row - 3][1]}'].value = round(ws[f'{letter}{DATE[row - 3][1]}'].value * (1 + ws[f'{letter_random}{DATE[row - 3][1]}'].value * 0.01),2)

5.最后,调用函数并保存数据

def main():get_construct_message()get_date()get_material()for i in MATERIAL:update_default(i[0],i[1])wb.save('生产记录更新.xlsx')if __name__ == "__main__":main()

三、效果展示

修改前部分数据

修改后部分数据

四、结尾

通过自己的的两个小时的努力奋战完成了这个单子,总的来说,难度不在于怎么修改数据,而是在于怎么把两个表相互关联,通过这次接单让我对excel表能够更加熟练地进行操作,接单既能提升自己的能力,又能赚点外快,何乐而不为呢?

2小时完成的第一个副业单子:Python修正excel表格数据相关推荐

  1. python excel取列_python取excel表格第一列数据-python操作excel,使用xlrd模块,获取某一列数据的......

    怎样用python,读取excel中的一列数据 Python对Excel的读写主要有xlrd.copyxlwt.xlutils.openpyxl.xlsxwriter几种. 1.xlrd主要用来读百取 ...

  2. 第一章, 介绍:挖掘twitter的数据

    mahout_xb的专栏 http://blog.csdn.net/mahout_xb/article/details/7341477 第一章, 介绍:挖掘twitter的数据 分类: data mi ...

  3. Python之路【第一篇】:Python简介和入门

    Python之路[第一篇]:Python简介和入门 Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗 ...

  4. 迈向数据科学的第一步:在Python中支持向量回归

    什么是支持向量回归? (What is Support Vector Regression?) Support vector regression is a special kind of regre ...

  5. 洗牌-牛客 第一行一个数T(T ≤ 100),表示数据组数。对于每组数据,第一行两个数n,k(1 ≤ n,k ≤ 100),接下来一行有2n个数a1,a2,...,a2n(1 ≤ ai ≤ 1000

    题目描述: 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程. 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张.首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上 ...

  6. 每周一本书之《Python大战机器学习:数据科学家的第一个小目标》

    数据科学家可谓是当下炙手可热的职业,机器学习则是他们的必备技能.机器学习在大数据分析中居于核心地位,在互联网.金融保险.制造业.零售业.医疗等产业领域发挥了越来越大的作用且日益受到关注. Python ...

  7. 儿童学python第一课_初学Python(第一课)

    今天整理一下关于Python初学者的基础知识部分的第一课,因为之前学习过C,所以过于基础的知识就不详细记录了. Python相对于C\C++来说,在语法方面已经很简单了:甚至对于JavaScript也 ...

  8. Excel表格中第一个输入的零不显示怎么办?

    Excel表格是办公的人经常要用到的软件,经常用它来统计和记录各种数据,但是有时候表格中第一个数字是零的时候,经常第一个零输入时不显示的,这个情况我们怎么解决呢?这里小编跟大家讲一下希望能帮助大家. ...

  9. (1)1999~2021 年中国城市统计年鉴面板数据(含地级市面板、县级市面板和主要指标)(2)香港统计年刊(3)第一到第七次的人口普查数据(4)全国省市县-五六七普人口数据(5)国际统计年鉴

    (1)1999-2021 年中国城市统计年鉴面板数据(含地级市面板.县级市面板和主要指标) (2)香港统计年刊 (3)第一到第七次的人口普查数据 (4)全国省市县-五六七普人口数据 (5)国际统计年鉴 ...

  10. 第一节课的Python基础知识

    第一节课的Python基础知识 Python内置的数据类型 1.number 2.string 3.list 4.tuple 5.dict 6.set 其他小结 方法range()的使用 获取一个li ...

最新文章

  1. 如何为Linux设置Docker和Windows子系统:爱情故事。 ?
  2. 产业|MIR睿工业:2018年机器人市场分析报告
  3. 让Windows2008R2也能进入手柄设置(游戏控制器设置)
  4. 贪心只能过样例 loj515
  5. 数据按时间拆开分批处理示例
  6. pymavlink 源码剖析(一)之XML文件的数据解析
  7. Eclipse MAT 安装及使用
  8. vim文本编辑器的使用
  9. ajax 制作表格带查询参数,查询表格——建立动态表格,使用ajax输入查询条件将后台数据查询出来以表格的形式展示出来...
  10. SpringBoot之kafka安装windows
  11. Spring的事务注解@Transactional 出现的6种失效场景
  12. 前端培训Ajax-onreadystatechange 事件
  13. ExtJs6 响应式布局
  14. 浅谈登录服务器的方法
  15. python爬取京东商品图片_爬取京东和天猫下载商品图片
  16. Symbol 数据类型
  17. 2017年总结,2018新开始
  18. 为什么压缩卷明明显示有许多空间却无法分出空余空间?
  19. 微信小程序 - 实现手机号登录--授权并获取手机号保存至本地
  20. 墨者_密码学加解密实训(摩斯密码第1题)

热门文章

  1. 中兴通讯专利技术价值超450亿元
  2. python招聘杭州拉勾网_Python拉勾网职位分析-Pyecharts
  3. Ionic4—JS扩展之ion-refresher下拉刷新
  4. Ionic4.x ion-refresher 下拉更新
  5. vbs进阶——实用函数之msgbox篇
  6. msgbox php,VBA消息框(MsgBox)
  7. 列表解析式,生成表达式
  8. html 重力感应效果,HTML5 重力感应效果,实现摇一摇效果
  9. 分光器(光分路器)基础知识【快速入门】01
  10. 2021东阳高考成绩查询,2021金华市地区高考成绩排名查询,金华市高考各高中成绩喜报榜单...