openpyxl:一种将一系列数字读取到数组的更好方法
openpyxl: a better way to read a range of numbers to an array
我正在寻找使用 openpyxl
读取一系列单元格的更好(更具可读性/更少被黑客入侵)的方法。我目前所拥有的工作,但涉及通过组装字符串的位来组成 excel 单元格范围(例如 A1:C3
),感觉有点粗糙。
目前这就是我从特定单元格开始读取 nCols
列和 nRows
行的方式(最小工作示例,假设 worksheet.xlsx
在工作目录中,并且具有在 Sheet1
:
中单元格 A1
到 C3
中写入的单元格引用
from openpyxl import load_workbook
import numpy as np
firstCol = "B"
firstRow = 2
nCols = 2
nRows = 2
lastCol = chr(ord(firstCol) + nCols - 1)
cellRange = firstCol + str(firstRow) + ":" + lastCol + str(firstRow + nRows - 1)
wsName = "Sheet1"
wb = load_workbook(filename="worksheet.xlsx", data_only=True)
data = np.array([[i.value for i in j] for j in wb[wsName][cellRange]])
print(data)
Returns:
[[u'B2' u'C2']
[u'B3' u'C3']]
除了有点难看之外,这种方法还有一些功能限制。例如,在超过 26 列的工作表中,对于像 AA
.
这样的列,它将失败
是否有 better/correct 方法使用 openpyxl 从给定的左上角读取 nRows
和 nCols
?
openpyxl 提供了在数字列索引(基于 1 的索引)和 Excel 的 'AA' 样式之间进行转换的函数。有关详细信息,请参阅 utils
模块。
但是,一般来说您几乎不需要它们。您可以使用工作表的 get_squared_range()
方法进行编程访问。而且,从 openpyxl 2.4 开始,您可以使用 iter_rows()
和 iter_cols()
方法执行相同的操作。注意。 iter_cols()
在只读模式下不可用。
使用 iter_rows()
的等效 MWE 为:
from openpyxl import load_workbook
import numpy as np
wsName = "Sheet1"
wb = load_workbook(filename="worksheet.xlsx", data_only=True)
ws = wb[wsName]
firstRow = 2
firstCol = 2
nCols = 2
nRows = 2
allCells = np.array([[cell.value for cell in row] for row in ws.iter_rows()])
# allCells is zero-indexed
data = allCells[(firstRow-1):(firstRow-1+nRows),(firstCol-1):(firstCol-1+nCols)]
print(data)
使用 get_squared_range()
的等效 MWE 为:
from openpyxl import load_workbook
import numpy as np
wsName = "Sheet1"
wb = load_workbook(filename="worksheet.xlsx", data_only=True)
firstCol = 2
firstRow = 2
nCols = 2
nRows = 2
data = np.array([[i.value for i in j] for j in wb[wsName].get_squared_range(
firstCol, firstRow, firstCol+nCols-1, firstRow+nRows-1)])
print(data)
两者都return:
[[u'B2' u'C2']
[u'B3' u'C3']]
有关 Pandas 和 openpyxl 一起使用的更多信息,另请参阅 https://openpyxl.readthedocs.io/en/default/pandas.html。
为了完整性(这样我以后可以找到它),@Rob 在评论中建议使用 pandas
函数 read_excel
的等效代码是:
import pandas
import numpy as np
wsName = "Sheet1"
df = pandas.read_excel(open("worksheet.xlsx", "rb"), sheetname=wsName, header=None)
firstRow = 2
firstCol = 2
nCols = 2
nRows = 2
# Data-frame is zero-indexed
data = np.array(df.ix[(firstRow-1):(firstRow-2+nRows), (firstRow-1):(firstRow-2+nRows)])
print(data)
哪个returns:
[[u'B2' u'C2']
[u'B3' u'C3']]
我正在寻找使用 openpyxl
读取一系列单元格的更好(更具可读性/更少被黑客入侵)的方法。我目前所拥有的工作,但涉及通过组装字符串的位来组成 excel 单元格范围(例如 A1:C3
),感觉有点粗糙。
目前这就是我从特定单元格开始读取 nCols
列和 nRows
行的方式(最小工作示例,假设 worksheet.xlsx
在工作目录中,并且具有在 Sheet1
:
A1
到 C3
中写入的单元格引用
from openpyxl import load_workbook
import numpy as np
firstCol = "B"
firstRow = 2
nCols = 2
nRows = 2
lastCol = chr(ord(firstCol) + nCols - 1)
cellRange = firstCol + str(firstRow) + ":" + lastCol + str(firstRow + nRows - 1)
wsName = "Sheet1"
wb = load_workbook(filename="worksheet.xlsx", data_only=True)
data = np.array([[i.value for i in j] for j in wb[wsName][cellRange]])
print(data)
Returns:
[[u'B2' u'C2']
[u'B3' u'C3']]
除了有点难看之外,这种方法还有一些功能限制。例如,在超过 26 列的工作表中,对于像 AA
.
是否有 better/correct 方法使用 openpyxl 从给定的左上角读取 nRows
和 nCols
?
openpyxl 提供了在数字列索引(基于 1 的索引)和 Excel 的 'AA' 样式之间进行转换的函数。有关详细信息,请参阅 utils
模块。
但是,一般来说您几乎不需要它们。您可以使用工作表的 get_squared_range()
方法进行编程访问。而且,从 openpyxl 2.4 开始,您可以使用 iter_rows()
和 iter_cols()
方法执行相同的操作。注意。 iter_cols()
在只读模式下不可用。
使用 iter_rows()
的等效 MWE 为:
from openpyxl import load_workbook
import numpy as np
wsName = "Sheet1"
wb = load_workbook(filename="worksheet.xlsx", data_only=True)
ws = wb[wsName]
firstRow = 2
firstCol = 2
nCols = 2
nRows = 2
allCells = np.array([[cell.value for cell in row] for row in ws.iter_rows()])
# allCells is zero-indexed
data = allCells[(firstRow-1):(firstRow-1+nRows),(firstCol-1):(firstCol-1+nCols)]
print(data)
使用 get_squared_range()
的等效 MWE 为:
from openpyxl import load_workbook
import numpy as np
wsName = "Sheet1"
wb = load_workbook(filename="worksheet.xlsx", data_only=True)
firstCol = 2
firstRow = 2
nCols = 2
nRows = 2
data = np.array([[i.value for i in j] for j in wb[wsName].get_squared_range(
firstCol, firstRow, firstCol+nCols-1, firstRow+nRows-1)])
print(data)
两者都return:
[[u'B2' u'C2']
[u'B3' u'C3']]
有关 Pandas 和 openpyxl 一起使用的更多信息,另请参阅 https://openpyxl.readthedocs.io/en/default/pandas.html。
为了完整性(这样我以后可以找到它),@Rob 在评论中建议使用 pandas
函数 read_excel
的等效代码是:
import pandas
import numpy as np
wsName = "Sheet1"
df = pandas.read_excel(open("worksheet.xlsx", "rb"), sheetname=wsName, header=None)
firstRow = 2
firstCol = 2
nCols = 2
nRows = 2
# Data-frame is zero-indexed
data = np.array(df.ix[(firstRow-1):(firstRow-2+nRows), (firstRow-1):(firstRow-2+nRows)])
print(data)
哪个returns:
[[u'B2' u'C2']
[u'B3' u'C3']]