用于在文件中填充excel公式的输入框

时间:2013-06-27 13:34:48

标签: python excel

我想创建一个Python脚本来打开csv(或xls)文件,使用输入框我可以将Excel公式复制并粘贴到特定行...然后将其应用于其余的空该列中的行。为了帮助可视化,这是一个例子

DATA, FORMULA
001,  [here would be inserted the formula]
002,  [here would be populated the amended formula]
003,  [here would be populated the amended formula]
004,  [here would be populated the amended formula]

所以,想法是有一个脚本,它会让我输入框询问 - 你想从哪一行开始? |答案= B2 - 你想在那里推广什么配方? | “= COUNTIF(A:A,A2)”

...然后它将填充B2列中的公式并自动填充下一个B3,B4,B5和B6,其中公式被调整为特定单元格。我想这样做的原因是我处理大型excel文件的事实,这些文件经常在我的计算机上崩溃,所以我想在不运行Excel本身的情况下执行它。

我做了一些研究adn xlwt可能无法做到这一点。你能帮我找到解决方案,我该怎么做?我很感激您的任何想法和指导。

1 个答案:

答案 0 :(得分:0)

不幸的是,如果不在代码中实现电子表格程序(Excel)的一部分,就无法完成您想要做的事情。那里没有捷径。

对于文件格式,Python可以本地处理CSV文件,但我认为您无法将原始公式(而不是数字或文本内容)从CSV导入Excel本身。

由于您已经使用Python,可能最好将逻辑从电子表格移动到程序中:使用Excel或其他电子表格程序输入数据,只输入数字,并使用脚本不要修改工作表,但要实现您需要的计算 - 可能将数据存储在SQL数据库中(Python的内置SQLite将很好地为单个用户应用程序执行,就像在这种情况下) - 并将计算出的数字输出到电子表格文件或者,也许,使用matplotlib直接从Python生成您的打算图表。

那就是说,你要求可以从Python完成 - 但随着数据集的增长,它可能会导致你的一般工作流程越来越复杂 -

Hre - 这些辅助函数将允许您从Excel单元格命名约定转换为数字,反之亦然 - 这样您就可以拥有在Python编程中操作的数字索引。

解析输入的公式来提取单元格 - 地址并不容易,但是

  • 将它们渲染回公式,调整数字索引后应该会轻松很多)。我建议你在脚本中对你的公式进行硬编码,而不是允许输入任何可能的公式。

    def parse_num(地址):     x =“”     for chr in(地址):         如果chr.isdigit():             x + = chr     return int(x) - 1

    def parse_col(地址):     x = 0     for chr in address:         如果chr.isdigit():             打破         x = x * 26 +(ord(chr.upper()) - ord(“A”))     返回x

    def render_address(col,row):     base = 26     power = col // base     col_letters =“”     tmp_col = col     for x in xrange(power,-1,-1):         dig = tmp_col //(base ** p)         letter = chr(dig + ord(“A”))         col_letters + = letter         tmp_col%= base ** p     return col_letters + str(row + 1)

现在,如果您愿意在Python中工作,只需将您的数据输入为CSV并使用小型python程序获取结果,而不是尝试将它们放入电子表格中 - 以获取上面的公式{{ 1}}基本上,你想要计算有多少其他行将第一列作为这一行 - 对于750000个数据位置,它在Python中是小菜一碟 - (如果所有数据都不适合RAM,它会变得更加困难 - 但是在2GB机器中大约有1亿个数据点会发生这种情况 - 此时你仍然可以通过专用结构将所有内容都放在RAM中 - 以上它将开始需要更多的逻辑,这将是几行使用正如我上面提到的SQLIte。

现在,给定带有一列数据的CSV文件的代码会生成第二个CSV文件,其中第二列包含第一列中出现的数字总数:

COUNTIF(A:A,A2)

只有当你真正需要按顺序排列所有第一列时才会这样 最后的文件。如果您想要的只是第1列中每个数字的计数, 无论它们出现的顺序如何,你只需要在第一个块之后的import csv from collections import Counter data_count = Counter() with open("data.csv", "rt") as input_file: reader = csv.reader(input_file) # skip header: reader.next() for row in reader(): data_count[int(row[0])] += 1 # everything is accounted for now - output the result: with open("data.csv", "rt") as input_file, open("counted_data.csv", "wt") as output_file: reader = csv.reader(input_file) writer = csv.writer(output_file) header = reader.next() header.append("Count") writer.writerow(header) for row in reader(): writer.writerow(row + [str(data_count[int(row[0])])] ) 中的数据 - 你可以在Python提示符中以交互方式玩这个数据,并且在几分之一秒内得到的结果需要花费几十分钟的时间。电子表格程序。

如果您的数据集不适合内存,您只需将它们放在数据库中,脚本比此更简单,您仍然可以在几分之一秒内得到结果。