โครงสร้างข้อมูลเบื้องหลังสเปรดชีตคืออะไร


35

ฉันต้องการเข้าใจว่าสเปรดชีต (กลุ่มของเซลล์ที่ระบุชื่อหรือที่ระบุไว้เป็นอย่างอื่นที่มีค่าหรือสูตรที่อ้างอิงเซลล์อื่น ๆ ) ได้รับการแก้ไขอย่างไร ฉันลองดูโครงการที่มีอยู่แล้ว แต่มีมากขึ้นกับ GUI, การทำให้เป็นอนุกรม, กิจกรรม, ฯลฯ ที่ฉันไม่พบสเปรดชีต

ที่ง่ายที่สุดมันทำงานอย่างไร


1
หากคุณต้องการดูการใช้งานสเปรดชีตซึ่งมี gui น้อยที่สุด (และทำให้ความฟุ้งซ่านน้อยลงจากปัญหา) ให้ดูที่ sc: linuxjournal.com/article/10699?page=0,0
itsbruce

คำตอบ:


21

ที่แกนกลางของมันสเปรดชีตเป็นภาษาที่ใช้งานได้กับการพิมพ์แบบไดนามิกและแต่ละฟังก์ชั่นหรือค่าที่สามารถอ้างถึงเป็นเซลล์ในเมทริกซ์

แทนที่จะ(defn some-name ...)ใส่some-nameส่วนต่าง ๆ ลงในเซลล์

หากคุณไปที่การปรับปรุงภาษาที่ใช้งานได้แบบไดนามิก (เช่น lighttable for clojure) คุณจะเห็นฟังก์ชั่นส่วนใหญ่เหมือนกับสเปรดชีต ผูกค่ากับชื่อเขียนฟังก์ชันที่ใช้ค่านั้นเปลี่ยนค่าและผลลัพธ์ของฟังก์ชันจะเปลี่ยนทันที สิ่งนี้เหมือนกับการทำอะไรบางอย่างเช่นการเขียน=A1 + B2ในตำแหน่งของC3excel

ดังนั้นโปรแกรมเมอร์ที่ใช้งานได้มักจะชอบเขียนสเปรดชีตเป็นโปรแกรมของเล่น ... และเรื่องของงานวิจัยด้วย (ใช่ฉันขอโทษพวกเขาทุกคนอยู่เบื้องหลัง ACM.org paywall)

  • การเขียนโปรแกรมการทำงานของสเปรดชีต

    ชุมชนการเขียนโปรแกรมที่ใช้งานได้แสดงความสนใจในสเปรดชีต แต่น่าแปลกใจที่ไม่มีใครคิดว่าจะสร้างสเปรดชีตมาตรฐานเช่น Excel ทำงานกับภาษาโปรแกรมมาตรฐานเช่น Haskell ในบทความนี้เราแสดงวิธีหนึ่งที่สามารถทำได้ ความหวังของเราคือการทำเช่นนั้นเราอาจได้รับโปรแกรมเมอร์สเปรดชีตเพื่อลองใช้งานการเขียนโปรแกรม

  • แบบฟอร์ม / 3: ภาษาภาพลำดับที่หนึ่งเพื่อสำรวจขอบเขตของกระบวนทัศน์สเปรดชีต

    แม้ว่าผู้ว่าการเขียนโปรแกรมเชิงฟังก์ชั่นบางครั้งอ้างว่าการเขียนโปรแกรมฟังก์ชั่นนั้นยากเกินไปหรือขัดกับความเข้าใจง่ายสำหรับโปรแกรมเมอร์ส่วนใหญ่ที่จะเข้าใจและใช้งาน แต่หลักฐานที่ตรงกันข้ามสามารถพบได้โดยการดูความนิยม กระบวนทัศน์สเปรดชีตซึ่งเป็นชุดย่อยอันดับแรกของกระบวนทัศน์การเขียนโปรแกรมใช้งานได้พบการยอมรับอย่างกว้างขวางในหมู่ทั้งโปรแกรมเมอร์และผู้ใช้ปลายทาง ยังมีข้อ จำกัด มากมายกับระบบสเปรดชีตส่วนใหญ่ ในบทความนี้เราจะพูดคุยเกี่ยวกับฟีเจอร์ภาษาที่กำจัดข้อ จำกัด เหล่านี้โดยไม่เบี่ยงเบนจากโมเดลการประเมินแบบลำดับแรก

  • การใช้ฟังก์ชั่นสเปรดชีต

    การพัฒนาผู้ใช้ปลายทางจำนวนมากทำได้ด้วยสเปรดชีต คำอุปมาสเปรดชีตนั้นน่าสนใจเพราะเป็นภาพและรองรับการทดลองเชิงโต้ตอบ แต่เมื่อสังเกตจากเพย์ตันโจนส์แบล็กเวลล์และเบอร์เน็ตต์การเปรียบเทียบสเปรดชีตไม่ยอมรับแม้แต่สิ่งที่เป็นนามธรรมขั้นพื้นฐานที่สุด ดังนั้นพวกเขาจึงเสนอวิธีการกำหนดฟังก์ชั่นในแง่ของแผ่นงานด้วยเซลล์รับเข้าและส่งออกที่กำหนด เราจะเรียกมันว่าแผ่นงาน


จุดเริ่มต้นของสเปรดชีตที่ Wikipediaให้คำแนะนำเกี่ยวกับวิธีการนำไปใช้งาน:

สเปรดชีตเป็นโปรแกรมประยุกต์คอมพิวเตอร์แบบโต้ตอบสำหรับองค์กรและการวิเคราะห์ข้อมูลในรูปแบบตาราง สเปรดชีตที่พัฒนาขึ้นเป็นแบบจำลองทางคอมพิวเตอร์ของแผ่นงานบัญชีกระดาษ โปรแกรมทำงานกับข้อมูลที่แสดงเป็นเซลล์ของอาเรย์จัดเป็นแถวและคอลัมน์ แต่ละเซลล์ของอาร์เรย์เป็นองค์ประกอบ model-view – controller ที่สามารถมีข้อมูลตัวเลขหรือข้อความหรือผลลัพธ์ของสูตรที่คำนวณและแสดงค่าโดยอัตโนมัติตามเนื้อหาของเซลล์อื่น

อาคารนี้จากโครงร่างของกระบวนทัศน์ Model-View-Controller ที่แสดงในห้องสมุด ผู้เขียนพูดถึง applets (วันที่สักหน่อยมันเขียนใน '93 -'96) และกล่าวถึงเว็บเพจของเขาซึ่งไปที่http://csis.pace.edu/~bergin/Java/applets.htm (ใช่ , applets) สำหรับรหัสสเปรดชีตที่เกี่ยวข้องhttp://csis.pace.edu/~bergin/Java/Spreadsheet.java

ฉันจะชี้ให้เห็นว่าสเปรดชีตทั้งหมดนั้นไม่ใหญ่มากในแอพเพล็ต 570 บรรทัดรวมถึงเอกสารประกอบ

ที่กล่าวว่าขึ้นอยู่กับภาษาคุณสามารถทำได้ทั้งหมดด้วยเพียงแค่ตัวชี้ฟังก์ชั่นในอาร์เรย์หร็อมแหร็ม


32

ตามหลักการแล้วแต่ละเซลล์เป็นโหนดของกราฟ acyclic โดยตรงและการอ้างอิงไปยังเซลล์อื่นสร้างขอบในกราฟนั้น เมื่อคุณเปลี่ยนเซลล์การเรียงลำดับโทโพโลยีของโหนดทั้งหมดที่เข้าถึงได้จากเซลล์ที่คุณเปลี่ยนจะให้ลำดับที่คุณต้องการประเมินเซลล์ เมื่อคุณกำหนดลำดับที่ถูกต้องแล้วมันเป็นเพียงการแยกวิเคราะห์นิพจน์มาตรฐาน


3
ดีโทรหาฉัน nitty แต่ไม่มีการรับประกันว่าคุณไม่สามารถสร้างรอบใด ๆ ในสเปรดชีต ในความเป็นจริงฉันเพิ่งทดสอบสิ่งนี้กับ Excel รับการเตือน แต่ด้วยการเพิกเฉยฉันสามารถสร้างการอ้างอิงแบบวนได้ง่าย
Doc Brown

1
@DocBrown เพื่อหลีกเลี่ยงการติดอยู่ในลูปและแช่แข็งโปรแกรมก็อาจได้รับการตัดที่ลิงค์สุดท้ายหนึ่งที่จะทำให้มัน
Izkata

1
จุดดี @DocBrown คุณยังคงต้องตรวจสอบรอบและปฏิบัติเหมือน DAG เพื่อจุดประสงค์ในการคำนวณแม้ว่าคุณจะตัดสินใจอนุญาตให้เรียกซ้ำ คุณเพิ่งผ่านการสั่งซื้อหลายครั้ง
Karl Bielefeldt

โครงสร้างข้อมูลใดที่สามารถใช้เพื่อจำลองการพึ่งพา DAG ประเภทนี้ ฉันกำลังตรวจสอบกับ adjacency matrix แต่ด้วยอาร์เรย์ * n เราไม่สามารถเชื่อมโยงแอตทริบิวต์กับโหนดและขอบ สำหรับสูตรเช่นในเซลล์จะเป็นหนึ่งในคุณสมบัติ
Andy Dufresne

6

ดังที่ได้กล่าวไปแล้วสเปรดชีตจะถูกนำไปใช้อย่างง่ายดายเช่น DAG (กราฟ acyclic โดยตรง) ที่เก็บไว้ในแฮชหรือพจนานุกรมแบบง่าย รหัสง่าย ๆ ในการเล่นอาจเป็นวิธีที่เข้าใจง่ายที่สุด:

เวอร์ชั่น Python ที่ง่ายมาก: http://code.activestate.com/recipes/355045-spreadsheet/

สิ่งนี้ได้รับการอธิบายและอธิบายเพิ่มเติมในโพสต์บล็อกนี้: http://ralsina.me/weblog/posts/BB585.html

นอกจากนี้ยังมี JavaScript รุ่นธรรมดาพร้อม GUI ที่นี่: http://jsfiddle.net/ondras/hYfN3/


0

ฉันได้เขียนแพ็คเกจไพ ธ อนที่ช่วยให้คุณสามารถแปลงโครงสร้างเซลล์ฟังก์ชันวัตถุประสงค์ไฟล์ MS Excel เป็น Python XL2py

ค่าของเซลล์จะถูกแยกวิเคราะห์เป็นวัตถุประเภท dict () ต่อท้ายค่าของพวกเขา เซลล์ที่มีการอ้างอิงไปยังเซลล์อื่น ๆ โดยสูตรประกอบด้วยโหนด โหนดหมายถึงเซลล์ที่ค่าถูกกำหนดโดยสูตร จากแต่ละโหนดสูตรจะมีการกำหนดโครงสร้างการพึ่งพาเพื่อกำหนดว่ามีการอ้างอิงแบบวงกลมอยู่หรือไม่ คำสั่งการคำนวณโหนดถูกกำหนดโดยคำนึงถึงโครงสร้างการพึ่งพาเซลล์ที่เกี่ยวข้อง

ในโครงสร้างต้นไม้ I / O คุณสามารถใช้อัลกอริธึมการย่อขนาดใด ๆ ที่ใช้ใน Python ตามที่คุณต้องการ

ฉันขอแนะนำให้คุณดูที่https://github.com/gusmaogabriels/XL2py

ขอแสดงความนับถือกาเบรียล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.