是否有一个 Excel 函数或脚本来查找和替换两个不同工作表中匹配的字段,并将其替换为第二个工作表中包含的另一个数据?
Posted
技术标签:
【中文标题】是否有一个 Excel 函数或脚本来查找和替换两个不同工作表中匹配的字段,并将其替换为第二个工作表中包含的另一个数据?【英文标题】:Is there an Excel function or a script to find and replace fields that match in two different sheets by another data contained in the second sheet? 【发布时间】:2015-07-28 12:04:45 【问题描述】:今天是我第一次使用 Open Office,我需要一些帮助才能开始使用。 我的老板给了我两个 Excel 文件,其中包含我必须完成的数据。
第一张表在“A”中包含供应商代码和一堆其他列,其中包含我需要保留的产品尺寸等数据。 第二个在“A”中包含相同的供应商代码,但顺序不同,因为它们也有很多是双精度的,并且在“B”中有一个商店代码。如果两张表中都与“A”中包含的代码匹配,我需要在第一张表中添加一个包含商店代码的列。
这不是我真正的工作,但由于夏天每个人都走了,他要求我去做。
我的问题是两张纸的长度都超过了 12 000 行,而且我知道只有 700 到 800 篇文章会匹配。自从我第一次使用 Excel/OpenOffice(我知道我知道......)以来,我想知道是否有办法自动化这项工作,无论是使用 OpenOffice 还是我可以使用脚本来完成它。我发现了很多类似的帖子,但没有一个是我需要的。
欢迎任何帮助。 谢谢!
【问题讨论】:
这两个文件有多大?还有你有多少内存? 12,000 个条目可能在没有太多内存考虑的情况下是可以管理的...... 第一个是 7.8mo,第二个只有 178kb,我不应该对内存有问题,他们借给我一个 macbook 来完成它有 8gb 内存的工作。 【参考方案1】:我会首先尝试让它运行而不考虑内存问题,并且只有在遇到该问题时才能解决该问题。 12,000 似乎很多,但你可能会惊讶于你可以在 python 上抛出什么并让它“正常工作”。编程中遇到excel之类的我几乎都是用csv文件...
import csv
# B.csv:
# store# part#
# xx xx
# xx xx
# xx xx
# ...
partNums =
with open('B.csv') as bfile:
breader = csv.DictReader(bfile)
for row in breader:
partNums[row['part#']] = row['store#']
# A.csv
# part# tag1 tag2 tag3 ...
# xx xx xx xx ...
# xx xx xx xx ...
# xx xx xx xx ...
# ...
with open('outfile.csv', 'wb') as outfile:
with open('A.csv', 'rb') as afile:
areader = csv.reader(afile)
outwriter = csv.writer(outfile)
headers = areader.next()
headers.append('StoreCode')
outwriter.writerow(headers)
for row in areader:
if row[0] in partNums: #assuming first row is part#
row.append(partNums[row[0]])
else: #value if no store number exists
row.append('')
outwriter.writerow(row)
【讨论】:
您可能需要对其进行一些调整以适应您文件的确切格式,但基本上是的 谢谢!所以我应该用参数中的 2 个文件来运行它?我会询问我们的 IT 人员,但他们正忙于设置我们的新 ERP,并且需要为某些模块使用它。 Re,所以我在替换格式文件后尝试运行它,但我不知道为什么当我运行它时它会打印出 ImageMagick 的用法,然后是这个 import: delegate library support not built-in `' (X11) @error/import.c/ImportImageCommand/1297。我继续尝试不同的格式并更改我的文件,同时知道为什么会这样吗? 您想在开放式办公室中运行它吗?这需要从命令行运行。将其保存为 .py 文件并从命令提示符调用它 我终于让它也能正常工作了,它比简单的 excel 函数更有趣,它运行 12k 线的速度给我留下了深刻的印象。谢谢【参考方案2】:您也可以尝试 VLOOKUP() 公式。它可能在 Calc 中与 .xls 文件一起使用,但为了安全起见,我会先将它们都保存为 .ods。您可以在 File1 的一个空列的顶部编写公式,例如:
=VLOOKUP(A1;'file:///C:/FolderName/File2.ods'#$Sheet1.$A$1:$B$12000;2;0)
本教程中解释了 VLOOKUP 的语法以及示例:VLOOKUP questions and answers。
确保在列字母和行号前面包含$
符号 - 这会告诉电子表格在您复制/粘贴公式时不要调整这些字母和数字。第一个参数(此处为 A1)在复制/粘贴时将被调整为 A2、A3 等,因此公式将匹配每一行的相应商店代码。
第一个单元格工作后,使用 VLOOKUP 公式复制该单元格。然后单击名称框(它位于公式栏的左侧)并键入要将该公式粘贴到的范围,例如H2:H12000
,然后按 Enter。您键入的范围应突出显示。现在粘贴你的公式。
所有匹配的代码都应该出现,不匹配的代码将显示#N/A
。如果你想要空白而不是 #N/A
你可以做类似的事情
=IF(ISERROR(VLOOKUP(A1;'file:///C:/FolderName/File2.ods'#$Sheet1.$A$1:$B$12000;2;0);"";VLOOKUP(A1;'file:///C:/FolderName/File2.ods'#$Sheet1.$A$1:$B$12000;2;0))
基本上就是说“如果这个公式返回错误;然后显示一个空白;否则显示这个公式的结果”
【讨论】:
以上是关于是否有一个 Excel 函数或脚本来查找和替换两个不同工作表中匹配的字段,并将其替换为第二个工作表中包含的另一个数据?的主要内容,如果未能解决你的问题,请参考以下文章