目录



>>> from helper import info; info()
页面更新时间: 2020-03-21 21:33:32
操作系统/OS: Linux-4.19.0-8-amd64-x86_64-with-debian-10.3 ;Python: 3.7.3

项目:更新一个电子表格

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

需求说明

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

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

你的程序做下面的事情:

  • 循环遍历所有行。

  • 如果该行是 GarlicCeleryLemons ,更新价格。

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

  • 打开电子表格文件。

  • 针对每一行,检查列 A 的值是不是 CeleryGarlicLemon

  • 如果是,更新列 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

这样硬编码产品和更新的价格有点不优雅。如果你需要用不同的价格,或针对 不同的产品,再次更新这个电子表格,就必须修改很多代码。每次修改代码,都有 引入缺陷的风险。

更灵活的解决方案,是将正确的价格信息保存在字典中,在编写代码时,利用 这个数据结构。在一个新的文件编辑器窗口中,输入以下代码:

>>> # 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.

如果需要再次更新这个电子表格,只需要更新 PRICEJJPDATES 字典,不用修改其他代码。

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

程序的下一部分将循遍历电子表格中的所有行。

>>> # TODO: Loop through the rows and update the prices.
>>>
>>> # Loop through the rows and update the prices.
>>>
>>> for rowNum in range(2, sheet.max_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('/tmp/xx_updatedProduceSales.xlsx')

我们从第二行开始循环遍历,因为第1行是标题。 第1列的单元格(即列 A)将保存在变量 produceName 中。 如果 produceName 的值是 PRICE_UPDATES 字典中的一 个键,你就知道,这行的价格必须修改^正确的价格是 PRICE_UPDATES[produceName]

请注意,使用PRICEJJPDATES让代码变得多么干净。 只需要一条 if 语句,而不是像 if produceName =='Garlic' 这样的代码, 就能够更新所有类型的产品。因为代码没有硬编码 产品名称,而是使用PRICEJJPDATES字典, 在 for 循环中更新价格,所以如果产品 销售电子表格需要进一步修改,你只需要修改 PRICE_UPDATES 字典,不用改其他代码。

在遍历整个电子表格并进行修改后,代码将 Workbook 保存到 updatedProduceSales.xlsx 。它没有覆写原来 的电子表格,以防万一程序有缺陷,将电子表格改错。 在确认修改的电子表格正确后,你可以删除原来的电子表格。

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

第3步:类似程序的思想

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

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

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

  • 自动清理电子表格中的数据。例如,可以利用正则表达式,

读取多种格式的电话号码,将它们转换成单一的标准格式。