Pyexcel 更改单元格值
Pyexcel changing a cell value
所以我的所有 Excel 项目都使用 openpyxl
,但现在我必须使用 .xls
文件,所以我被迫更改库。我选择了 pyexcel
因为它看起来相当简单并且有据可查。所以我已经经历了创建数百个变量的地狱,因为没有 .index
属性 或其他东西。
我现在要做的是读取正确文件中的列,f.e "Quantity"列,并从中获取f.e值12
,然后检查其他文件中的同一列,如果不是 12,则将其设为 12。简单。但是我在他们的文档中找不到任何关于更改单个单元格值的文字。你能帮帮我吗?
我没看懂,这不是最简单的吗?
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
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")
请注意,我所要做的只是 "sheet[3,2] ="。
这没有明确说明,但在 pyexcel documentation 中有所暗示,它指出要更新整个列,您可以执行以下操作:
sheet.column["Column 2"] = [11, 12, 13]
即通过分配新列表来替换列表。同样的逻辑适用于单个单元格 - 只需分配一个新值。
奖励 - [Row, column] 方法绕过大于 26 列的单元格位置(即 'AA' 及以上)。
警告 - 确保在你的比较中你是在比较,即 int 被理解为 int 而不是 str。 Python 应该隐式转换,但在某些情况下可能不会 - 特别是如果您使用 python 2 并且涉及 Unicode。
所以我的所有 Excel 项目都使用 openpyxl
,但现在我必须使用 .xls
文件,所以我被迫更改库。我选择了 pyexcel
因为它看起来相当简单并且有据可查。所以我已经经历了创建数百个变量的地狱,因为没有 .index
属性 或其他东西。
我现在要做的是读取正确文件中的列,f.e "Quantity"列,并从中获取f.e值12
,然后检查其他文件中的同一列,如果不是 12,则将其设为 12。简单。但是我在他们的文档中找不到任何关于更改单个单元格值的文字。你能帮帮我吗?
我没看懂,这不是最简单的吗?
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
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")
请注意,我所要做的只是 "sheet[3,2] ="。
这没有明确说明,但在 pyexcel documentation 中有所暗示,它指出要更新整个列,您可以执行以下操作:
sheet.column["Column 2"] = [11, 12, 13]
即通过分配新列表来替换列表。同样的逻辑适用于单个单元格 - 只需分配一个新值。
奖励 - [Row, column] 方法绕过大于 26 列的单元格位置(即 'AA' 及以上)。
警告 - 确保在你的比较中你是在比较,即 int 被理解为 int 而不是 str。 Python 应该隐式转换,但在某些情况下可能不会 - 特别是如果您使用 python 2 并且涉及 Unicode。