Pyexcel更改单元格值

时间:2016-07-12 21:45:08

标签: python excel pyexcel

所以我在所有Excel项目中使用openpyxl,但现在我必须使用.xls个文件,所以我被迫更改库。我选择了pyexcel因为它似乎相当容易且记录良好。所以我创造了数百个变量,因为没有.index属性,或者其他东西,我已经完成了地狱。

我现在要做的是读取正确文件中的列,f.e" Quantity"列,并从中获取f.e值12,然后检查其他文件中的相同列,如果不是12,则将其设为12.简单。但我找不到任何关于在文档中更改单个单元格值的说法。你能救我吗?

2 个答案:

答案 0 :(得分:2)

我没有得到它,不是最简单的事情吗?

column_name = 'Quantity'
value_to_find = 12
sheets1 = pe.get_book(file_name='Sheet1.xls')
sheets1[0].name_columns_by_row(0)
row = sheets1[0].column[column_name].index(value_to_find)

sheets2 = pe.get_book(file_name='Sheet2.xls')
sheets2[0].name_columns_by_row(0)
if sheets2[0][row, column_name] != value_to_find:
    sheets2[0][row, column_name] = value_to_find

修改

奇怪的是,如果你使用cell_address索引,你只能分配值,必须是一些bug。添加此功能:

def index_to_letter(n):
    alphabet = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
    result = []
    while (n > 26):
        result.insert(0, alphabet[(n % 26)])
        n = n // 26
    result.insert(0, alphabet[n])
    return ''.join(result)

修改最后一部分:

sheets2[0].name_columns_by_row(0)
col_letter = index_to_letter(sheets2[0].colnames.index(column_name))
cel_address = col_letter+str(row+1)
if sheets2[0][cel_address] != value_to_find:
    sheets2[0][cel_address] = value_to_find

编辑2

看起来你不能只在直接使用列名时分配,所以周围就是找到column_name的索引:

sheets2[0].name_columns_by_row(0)
col_index = sheets2[0].colnames.index(column_name)
if sheets2[0][row, col_index] != value_to_find:
    sheets2[0][row, col_index] = value_to_find

答案 1 :(得分:1)

Excel使用2组对单元格的引用。单元格名称(" A1")和单元格矢量(行,列)。

PyExcel documentation tutorial状态它支持这两种方法。 caiohamamura的方法尝试建立单元名称 - 如果单元格位于每个文件的相同位置,则不需要使用该向量。

获得单元格后,为单个单元格指定值很简单 - 您可以指定值。例如:

import pyexcel
sheet = pyexcel.get_sheet(file_name="Units.xls")
print(sheet[3,2]) # this gives me "cloud, underwater"
sheet[3,2] = "cloud, underwater, special"
sheet.save_as("Units1.xls")

请注意,我所要做的只是"表格[3,2] ="。
这没有明确说明,但在pyexcel documentation中暗示要更新您要执行的整个列:

sheet.column ["第2栏"] = [11,12,13]

即。通过分配新列表来替换列表。相同的逻辑适用于单个单元格 - 只需指定一个新值。

奖励 - [行,列]方法绕过大于26的列中的单元格位置(即' AA'及以上)。

警告 - 确保在你的比较中你正在比较like-for-like,即int被理解为int而不是str。 Python应该隐式转换,但在某些情况下可能不会 - 特别是如果你使用的是python 2并且涉及到Unicode。