Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมสำหรับดำเนินการ excel สเปรดชีตใน Python?


สมมติว่าเรามีเมทริกซ์ 2 มิติที่แสดงถึงสเปรดชีต excel เราต้องหาเมทริกซ์เดียวกันกับทุกเซลล์และสูตรที่คำนวณไว้ สเปรดชีต excel มีลักษณะดังนี้

B1 7 0
3 5 =A1+A2

คอลัมน์มีชื่อเป็น (A, B, C...) และแถวคือ (1, 2, 3....) แต่ละเซลล์จะประกอบด้วยค่า การอ้างอิงไปยังเซลล์อื่น หรือสูตร Excel สำหรับการดำเนินการด้วย ระหว่างตัวเลขหรือการอ้างอิงเซลล์ (ตัวอย่าง "=A1+5", "=A2+B2" หรือ "=2+5")

ดังนั้นหากอินพุตเป็นแบบ

B1 7 0
3 5 =A1+A2

แล้วผลลัพธ์ที่ได้จะเป็น

7 7 0
3 5 10

เนื่องจาก B1 =7 (แถวแรก คอลัมน์ที่สอง) และ "=A1 + A2" คือ 7 + 3 =10

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้

  • กำหนดฟังก์ชั่น แก้ไข() นี่จะใช้เวลา s

  • ถ้า s เป็นตัวเลข ให้คืนค่า s เป็นจำนวนเต็ม

  • มิฉะนั้นให้แก้ปัญหา (getIdx(s))

  • กำหนดฟังก์ชัน getIdx() นี่จะใช้เวลา s

  • ส่งคืนรายการที่ค่าแรกเป็นสตริงย่อยของ s จาก 1 ถึงสิ้นสุดเป็นจำนวนเต็ม และค่าที่สองคือ ASCII ของ s[0] - ASCII ของ "A"

  • กำหนดฟังก์ชัน 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] เหมือนกับ "=" แล้ว

      • สำหรับแต่ละ c ในสตริงย่อยของ s[จากดัชนี 2 ถึงจุดสิ้นสุด] ทำ

        • ถ้า c เป็นโอเปอเรเตอร์ใดๆ ใน (+, -, /, *) แล้ว

          • op :=c

          • ออกจากวง

      • [a, b] :=สตริงย่อยของ s [จากดัชนี 1 ถึงจุดสิ้นสุด] และแยกด้วย op

      • [aRes, bRes] :=[แก้ไข(a) , แก้ไข(b)]

      • return do(aRes, bRes, op)

    • มิฉะนั้น

      • กลับแก้(getIdx(s))

  • สำหรับฉันในช่วง 0 ถึงจำนวนแถวของเมทริกซ์ ทำ

    • สำหรับ j ในช่วง 0 ถึงจำนวนคอลัมน์ของเมทริกซ์ ให้ทำ

      • matrix[i, j] :=(แก้(i, j)) เป็นสตริง

  • ส่งคืนเมทริกซ์

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น:

ตัวอย่าง

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']]