【问题标题】:How to copy a value from an Excel cell and paste it into a new cell at scale如何从 Excel 单元格中复制一个值并将其粘贴到一个新的单元格中
【发布时间】:2018-12-21 21:06:21
【问题描述】:

我正在尝试创建将在单元格中搜索诸如“蓝色”之类的颜色值的代码,如果在该单元格中找到它,则将该值粘贴到另一个单元格中,然后在几个范围内重复此操作一百种颜色。

一旦发生这种情况,对列中的下一个单元格再次执行相同的过程,并粘贴到相应行中的另一个单元格中,直到每个填充的单元格都搜索完所有颜色值。

我有创建 Excel 工作表的代码,该工作表将提取一些预定义的值,但我不确定如何扩展代码以包含数百种不同的颜色。

#Excel Project to fill attributes quickly.

#Importing Modules
import os, openpyxl

#defining variables
wb = openpyxl.Workbook()
sheet = wb['Sheet']

#Asking for your category
x = input('What is your category?')



#Writing header
sheet['A1'] = 'Short Description'
sheet['B1'] = 'Long Description'
sheet['C1'] = 'Item'
sheet['J1'] = 'Color'

#writing attribute values
sheet['A2'] = 'Amazing blue shiny fantastic shirt ee-9003'
sheet['A3'] = 'Red dull jacket'

#Writing values for "Color"

if 'Red' or 'red' in sheet['A2'].value:
    sheet['J2'] = 'Red'
elif 'Orange' or 'orange' in sheet['A2'].value:
    sheet['J2'] = 'Orange'
elif 'Blue' or 'blue' in sheet['A2'].value:
        sheet['J2'] = 'Blue'


if 'Red' or 'red' in sheet['A3'].value:
    sheet['J3'] = 'Red'
elif 'Blue' or 'blue' in sheet['A3'].value:
    sheet['J3'] = 'Blue'


#Saving to your desktop
os.chdir(r'E:\Desktop')
wb.save('Attributes_filled_' + str(x) + '.xlsx')

到目前为止,我希望代码第一次生成“蓝色”,第二次生成“红色”,但根据我对代码的排序方式,我会得到第一个 if 语句结果。

【问题讨论】:

  • 你可能想看看Select case
  • 最好的解决方案是创建一个单元格值字典,以便您可以搜索它。我之前在 Stackoverflow 上回答过这个问题,所以你可以搜索它。

标签: excel python-3.x openpyxl


【解决方案1】:

if 'Red' or 'red' in sheet['A2'].value: 始终被视为True,因为非空字符串被视为True。 所以其实和if True or 'red' in sheet['A2'].value:是一样的

From the docs:

默认情况下,除非对象的类定义了返回 False 的 __bool__() 方法或使用对象调用时返回零的 __len__() 方法,否则默认情况下,该对象被视为 true。 1这里是大多数被认为是假的内置对象:

  • 定义为假的常量:无和假。
  • 任何数字类型的零:0、0.0、0j、Decimal(0)、Fraction(0, 1)
  • 空序列和集合:''、()、[]、{}、set()、range(0)

以下任何一项都可以解决您的问题:

if 'red' in sheet['A3'].value.lower():

或

if 'Red' in sheet['A3'].value or 'red' in sheet['A3'].value:

或

if any(color in sheet['A3'].value for color in ('Red', 'red')):

同样适用于所有 if/elif 条件。 另请注意,如果字符串是较大字符串的一部分,它仍将返回 True,即 'Blue" in "I've Got The Blues" 将被评估 True

编辑:由于 cmets 中的讨论,我将评估替换为考虑。

【讨论】:

  • 你的解释不太对。 if "Red" or "red" in … 将始终返回 "Red",因为作为条件,字符串始终为 True。与这个问题更相关的是 Python 中的条件必须始终是明确的,即。逻辑应该是if "Red" in cell.value or "red" in cell.value"
  • @CharlieClark,在我的回答中,我没有说它会返回什么。我说整个条件将被评估True,因此代码的相应部分将被执行。当然你是正确的,如果它被分配给一个变量,它将返回'Red'。
  • 整个条件永远不会计算,因为第一部分始终为真。
  • @CharlieClark,我不想玩语义,但你不对。是的 - 它不会进一步评估,但将根据第一部分 - “红色”评估整个条件(认为是真)。如果您担心evaluate 的使用,请将其阅读为considered。我会相应地编辑答案。
  • 在任何情况下,这确实是一个附带问题,因为它是逐个单元格的。如上所述,这里的解决方案是使用字典按单元格内容索引工作表。
猜你喜欢
  • 2017-01-09
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多