用 Python 执行 excel 电子表格操作的程序?

pythonserver side programmingprogramming更新于 2026/2/16 19:24:17

假设我们有一个代表 excel 电子表格的 2D 矩阵。我们必须找到相同的矩阵,其中计算了所有单元格和公式。excel 电子表格如下所示

B170
35=A1+A2

列名为 (A、B、C...),行名为 (1、2、3....)。每个单元格要么包含一个值,要么包含对另一个单元格的引用,要么包含一个 excel 公式,用于数字或单元格引用之间的运算。 (例如:"=A1+5"、"=A2+B2"或"=2+5")

因此,如果输入如下

B170
35=A1+A2

则输出将是

770
3510

因为 B1 = 7(第一行第二列)并且"=A1 + A2"是 7 + 3 = 10。

为了解决这个问题,我们将遵循以下步骤

  • 定义一个函数 resolve() 。这将需要 s

  • 如果 s 是数字,则返回 s 作为整数

  • 否则返回 resolve(getIdx(s))

  • 定义一个函数 getIdx() 。这将需要 s

  • 返回一个列表,其中第一个值是 s 的子字符串,从 1 到结尾为整数,第二个值 是 s[0] 的 ASCII - "A"的 ASCII

  • 定义一个函数 do() 。这将需要 a、b、op

  • 如果 op 与"+"相同,则

    • 返回 a + b

  • 如果 op 与"-"相同,则

    • 返回 a - b

  • 如果 op 与"*"相同,则

    • 返回 a * b

  • 如果 op 与"/"相同,则

    • 返回 a / b

  • 定义一个函数solve()。这将需要 i, j

  • 如果 matrix[i,j] 是数字,则返回该值

  • 否则:

    • s := matrix[i, j]

    • 如果 s[0] 与 "=" 相同,则

      • 对于 s[从索引 2 到末尾] 的子字符串中的每个 c,执行

        • 如果 c 是 (+, -, /, *) 中的任何运算符,则

          • op := c

          • 退出循环

      • [a, b] := s 的子字符串 [从索引 1 到末尾] 并用 op 拆分

      • [aRes, bRes] := [resolve(a) , resolve(b)]

      • return do(aRes, bRes, op)

    • 否则,

      • return resolve(getIdx(s))

  • 对于范围从 0 到矩阵行数的 i,执行

    • 对于范围从 0 到矩阵列数的 j,执行

      • matrix[i, j] := (solve(i, j))作为字符串

  • return matrix

让我们看看以下实现以便更好地理解:

示例

class Solution:
   def solve(self, matrix):
      def resolve(s):
         try:
            return int(s)
         except:
            return solve(*getIdx(s))

      def getIdx(s):
         return [int(s[1:]) - 1, ord(s[0]) - ord("A")]

      def do(a, b, op):
         if op == "+":
            return a + b
         if op == "-":
            return a - b
         if op == "*":
            return a * b
         if op == "/":
            return a / b

      def solve(i, j):
         try:
            return int(matrix[i][j])
         except:
            s = matrix[i][j]
            if s[0] == "=":
               for c in s[2:]:
                  if c in "+-/*":
                     op = c
                     break
               a, b = s[1:].split(op)
               aRes, bRes = resolve(a), resolve(b)
               return do(aRes, bRes, op)
            else:
               return solve(*getIdx(s))

      for i in range(len(matrix)):
         for j in range(len(matrix[0])):
            matrix[i][j] = str(solve(i, j))

      return matrix

ob = Solution()
matrix = [
   ["B1", "7", "0"],
   ["3", "5", "=A1+A2"]
]
print(ob.solve(matrix))

输入

[["B1", "7", "0"],
["3", "5", "=A1+A2"] ]

输出

[['7', '7', '0'],
['3', '5', '10']]

相关文章


有用资源