返回介绍

12.6 项目:更新一个电子表格

发布于 2024-01-22 21:44:06 字数 3132 浏览 0 评论 0 收藏 0

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

图12-3 产品销售的电子表格

每一行代表一次单独的销售。列分别是销售产品的类型(A)、产品每磅的价格(B)、销售的磅数(C),以及这次销售的总收入。TOTAL列设置为Excel公式,将每磅的成本乘以销售的磅数,并将结果取整到分。有了这个公式,如果列B或C发生变化,TOTAL列中的单元格将自动更新。

现在假设Garlic、Celery和Lemons的价格输入的不正确。这让你面对一项无聊的任务:遍历这个电子表格中的几千行,更新所有garlic、celery和lemon行中每磅的价格。你不能简单地对价格查找替换,因为可能有其他的产品价格一样,你不希望错误地“更正”。对于几千行数据,手工操作可能要几小时。但你可以编写程序,几秒钟内完成这个任务。

你的程序做下面的事情:

· 循环遍历所有行。

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

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

· 打开电子表格文件。

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

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

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

第1步:利用更新信息建立数据结构

需要更新的价格如下:

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.get_sheet_by_name('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字典,不用修改其他代码。

第2步:检查所有行,更新不正确的价格

程序的下一部分将循环遍历电子表格中的所有行。将下面代码添加到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.get_highest_row()):     # skip the first row
❷     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('updatedProduceSales.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❹。它没有覆写原来的电子表格,以防万一程序有缺陷,将电子表格改错。在确认修改的电子表格正确后,你可以删除原来的电子表格。

你可以从http://nostarch.com/automatestuff/下载这个程序的完整源代码。

第3步:类似程序的思想

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

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

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文