项目:更新一个电子表格

这个项目需要编写一个程序,更新产品销售电子表格中的单元格。程序将遍 历这个电子表格,找到特定类型的产品,并更新它们的价格。请从 http://nostarch.com/ automatestuff/下载这个电子表格。图 12-3展示了这个电子表格。 
 

每一行代表一次单独的销售。列分别是销售产品的类型(A)、产品每磅的价格 (B)、销售的磅数(C),以及这次销售的总收入。TOTAL列设置为 Excel 公式,将每磅的成本乘以销售的磅数,并将结果取整到分。有了这个公式,如果列 B 或 C 发 生变化,TOTAL列中的单元格将自动更新。 现在假设 Garlic、Celery和 Lemons 的价格输入的不正确。这让你面对一项无聊 的任务:遍历这个电子表格中的几千行,更新所有 garlic、celery和 lemon 行中每磅 的价格。你不能简单地对价格查找替换,因为可能有其他的产品价格一样,你不希 望错误地“更正”。对于几千行数据,手工操作可能要几小时。但你可以编写程序, 几秒钟内完成这个任务。 你的程序做下面的事情:

•  循环遍历所有行。

•  如果该行是 Garlic、Celery或 Lemons,更新价格。

这意味着代码需要做下面的事情:

•  打开电子表格文件。

•  针对每一行,检查列 A 的值是不是 Celery、Garlic 或 Lemon。

•  如果是,更新列 B 中的价格。

•  将该电子表格保存为一个新文件(这样就不会丢失原来的电子表格,以防万一)。 

利用更新信息建立数据结构 

需要更新的价格如下:

扫描二维码关注公众号,回复: 3275373 查看本文章

Celery  1.19

Garlic  3.07

Lemon  1.27

你可以像这样编写代码: 

if produceName == 'Celery':     
    cellObj = 1.19 
if produceName == 'Garlic':     
    cellObj = 3.07 
if produceName == 'Lemon':     
    cellObj = 1.27 

这样硬编码产品和更新的价格有点不优雅。如果你需要用不同的价格,或针对 不同的产品,再次更新这个电子表格,就必须修改很多代码。每次修改代码,都有 引入缺陷的风险。 更灵活的解决方案,是将正确的价格信息保存在字典中,在编写代码时,利用 这个数据结构。在一个新的文件编辑器窗口中,输入以下代码: 

#! python3
# updateProduce.py - Corrects costs in produce sales spreadsheet.

import openpyxl

wb = openpyxl.load_workbook('produceSales.xlsx')
sheet = wb['Sheet']

# The produce types and their updated prices
PRICE_UPDATES = {'Garlic': 3.07,
				 'Celery': 1.19
				 'Lemon': 1.27}

# TODO: Loop through the rows and update the prices.

将它保存为 updateProduce.py。如果需要再次更新这个电子表格,只需要更新 PRICE_UPDATES 字典,不用修改其他代码。 

检查所有行,更新不正确的价格 

程序的下一部分将循环遍历电子表格中的所有行。将下面代码添加到 updateProduce.py的末尾: 

#! python3
# updateProduce.py - Corrects costs in produce sales spreadsheet.

--snip--

# Loop through the rows and update the prices.
for rowNum in range(2, sheet.max_row + 1):
	produceName = sheet.cell(row=rowNum, column=1).value
	if produceName in PRICE_UPDATES:
		sheet.cell(row=rowNum, column=2).value = PRICE_UPDATES[produceName]

wb.save('updateProduceSales.xlsx')

我们从第二行开始循环遍历,因为第 1 行是标题。第 1 列的单元格(即列 A)将 保存在变量produceName中。如果 produceName的值是 PRICE_ UPDATES 字典中的一 个键,你就知道,这行的价格必须修改。正确的价格是PRICE_UPDATES[produceName]。请注意,使用 PRICE_UPDATES 让代码变得多么干净。只需要一条 if 语句,而 不是像 if produceName == 'Garlic'这样的代码,就能够更新所有类型的产品。因为代 码没有硬编码产品名称,而是使用 PRICE_UPDATES 字典 ,在 for 循环中更新价格, 所以如果产品销售电子表格需要进一步修改,你只需要修改 PRICE_UPDATES 字 典,不用改其他代码。 在遍历整个电子表格并进行修改后,代码将Workbook对象保存到updatedProduceSales. xlsx。它没有覆写原来的电子表格,以防万一程序有缺陷,将电子表格改错。 在确认修改的电子表格正确后,你可以删除原来的电子表格。 

类似程序的思想 :

因为许多办公室职员一直在使用 Excel 电子表格,所以能够自动编辑和写入 Excel 文件的程序,将非常有用。这样的程序可以完成下列任务:

•  从一个电子表格读取数据,写入其他电子表格的某些部分。 

•  从网站、文本文件或剪贴板读取数据,将它写入电子表格。

•  自动清理电子表格中的数据。例如,可以利用正则表达式,读取多种格式的电 话号码,将它们转换成单一的标准格式。 
 

完整代码:

#! python3
# updateProduce.py - Corrects costs in produce sales spreadsheet.

import openpyxl

wb = openpyxl.load_workbook('produceSales.xlsx')
sheet = wb['Sheet']

# The produce types and their updated prices
PRICE_UPDATES = {'Garlic': 3.07,
				 'Celery': 1.19,
				 'Lemon': 1.27}

# Loop through the rows and update the prices.
for rowNum in range(2, sheet.max_row + 1):
	produceName = sheet.cell(row=rowNum, column=1).value
	if produceName in PRICE_UPDATES:
		sheet.cell(row=rowNum, column=2).value = PRICE_UPDATES[produceName]

wb.save('updateProduceSales.xlsx')

猜你喜欢

转载自blog.csdn.net/dongyu1703/article/details/82288290
今日推荐