Python 中如何实现 Excel 电子表格操作?


假设我们有一个二维矩阵,表示一个 Excel 电子表格。我们需要找到一个包含所有单元格和计算公式的相同矩阵。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 是数字,则将其作为整数返回

  • 否则返回 solve(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)]

      • 返回 do(aRes, bRes, op)

    • 否则,

      • 返回 solve(getIdx(s))

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

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

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

  • 返回 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"] ]

Learn Python in-depth with real-world projects through our Python certification course. Enroll and become a certified expert to boost your career.

输出

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

更新于: 2020年11月10日

297 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告