การติดต่ออย่างใกล้ชิดระหว่าง Delphi และ Excel [Wang Anpeng ([email protected]) 2002/4/57] ในฐานะ RAD ที่ยอดเยี่ยม ฟังก์ชันฐานข้อมูลอันทรงพลังของ Delphi เป็นหนึ่งในคุณสมบัติที่สำคัญที่สุด แต่การควบคุม QuickReport ที่ยากต่อการใช้งานมักจะไม่สามารถทำได้ ตอบสนองความต้องการในการรายงานฐานข้อมูล หากรายงานของคุณซับซ้อนมาก หรือต้องการความยืดหยุ่นในการเปลี่ยนแปลงรูปแบบ การใช้ Excel เป็นเซิร์ฟเวอร์รายงานก็เป็นทางเลือกที่ดี ส่วนประกอบ Excel ที่ Delphi มอบให้ตั้งแต่เวอร์ชัน 5 เป็นต้นไป ช่วยให้การประยุกต์ใช้เทคโนโลยีอัตโนมัติของ OLE ง่ายขึ้นอย่างมาก อย่างไรก็ตาม ไฟล์วิธีใช้ที่หายไปถือเป็นประเด็นที่ถูกวิพากษ์วิจารณ์มากที่สุดของ Delphi และส่วนประกอบใหม่เหล่านี้ก็ไม่มีข้อยกเว้น โมเดลออบเจ็กต์ของ Excel เป็นโครงสร้างแบบลำดับชั้นที่เหมือนต้นไม้ รูทคือออบเจ็กต์แอททริบิวต์ของออบเจ็กต์หลัก รายละเอียด โปรดดูที่ไฟล์วิธีใช้ MSOffice.Excel VBA หากต้องการควบคุม Excel ใน Delphi คุณต้องสร้างการเชื่อมต่อกับโปรแกรมเซิร์ฟเวอร์ก่อน เปิดสมุดงาน จากนั้นแลกเปลี่ยนข้อมูลกับแผ่นงานเป้าหมาย และสุดท้ายยกเลิกการเชื่อมต่อ เปิดสมุดงาน Excel ตัวอย่างของเราเริ่มต้นด้วยแบบฟอร์มหลักที่มี TStringGrid (แน่นอนว่าต้องกรอกข้อมูลบางอย่าง) และปุ่มสองปุ่ม ลากตัวควบคุมแอปพลิเคชัน TExcelap จากแท็บเซิร์ฟเวอร์ของแผงควบคุมแล้ววางลงในแบบฟอร์ม ขั้นแรก ตั้งค่า ConnectKind เป็น ckRunningOrNew ซึ่งหมายความว่าหากตรวจพบอินสแตนซ์ Excel ที่ทำงานอยู่ ให้สร้างการติดต่อกับอินสแตนซ์นั้น ไม่เช่นนั้นให้เริ่ม Excel นอกจากนี้ หากคุณต้องการให้โปรแกรมสร้างการติดต่อกับโปรแกรมเซิร์ฟเวอร์ทันทีที่รัน คุณสามารถตั้งค่าคุณสมบัติการเชื่อมต่ออัตโนมัติเป็น True ได้ สิ่งที่ต้องทำเพื่อสร้างการติดต่อกับ Excel คือคำสั่งเดียว: Excel Connect; บางทีคุณอาจสังเกตเห็นว่ามีตัวควบคุม Excel อื่นๆ บนแท็บเซิร์ฟเวอร์ Excel . ActiveWorkbook); ExcelWorksheet1.ConnectTo(Excel . ActiveSheet เป็น _Worksheet); ExcelWorksheet2.ConnectTo(Excel . Worksheets.Item['Sheet2'] เป็น _Worksheet) ควรสังเกตว่าต้องเปิดสมุดงานหรือแผ่นงานที่เกี่ยวข้องก่อนที่จะใช้วิธี ConnectTo นอกจากนี้ การควบคุมเหล่านี้จะไม่นำมาซึ่งความสะดวกเพิ่มเติมในกรณีส่วนใหญ่ ดังนั้นจึงเป็นการดีที่สุดที่จะใช้เพียง TExcelApplication เดียวเท่านั้น เมื่อสร้างการติดต่อกับเซิร์ฟเวอร์ Excel แล้ว สามารถสร้างสมุดงานใหม่ได้: var wkBook : _WorkBook; LCID : Integer; ... LCID := GetUserDefaultLCID(); ฟังก์ชัน พารามิเตอร์แรกใช้เพื่อกำหนดเทมเพลตที่ใช้สำหรับสมุดงานใหม่ คุณสามารถใช้ xlWBATChart, xlWBATExcel4IntlMacroSheet, xlWBATExcel4MacroSheet หรือค่าคงที่ xlWBATWorksheet หรืออาจเป็นชื่อของไฟล์ xls ที่มีอยู่ EmptyParam ในที่นี้คือหน่วย Variants และตัวแปรที่กำหนด ซึ่งหมายถึงการใช้เทมเพลตสากลเริ่มต้นเพื่อสร้างเวิร์กบุ๊กใหม่ หากคุณเปิดเอกสาร xls ที่มีอยู่ คุณควรส่งชื่อไฟล์ที่จะเปิดเป็นพารามิเตอร์แรกไปยังฟังก์ชัน Open: wkBook:=Excel.WorkBooks.Open(edtDesFile.text,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam , ค่าว่าง, ค่าว่าง, ค่าว่าง, ค่าว่าง, EmptyParam,EmptyParam,LCID) คุณต้องทราบว่าการดำเนินการข้อมูลทั้งหมดมีไว้สำหรับเวิร์กชีตที่ใช้งานอยู่เป็นหลัก คำสั่งต่อไปนี้ใช้ตัวแปร _WorkSheet เพื่อแสดงเซลล์ที่ใช้งานอยู่ในปัจจุบัน หากคุณทราบชื่อของเวิร์กชีต หมายเลขดัชนีสามารถถูกแทนที่ด้วยชื่อเวิร์กชีต: wkSheet:=wkBook.Sheets[1] เป็น _WorkSheet หลังจากเสร็จสิ้นการแลกเปลี่ยนข้อมูลแล้ว คุณต้องบันทึกเวิร์กบุค: Excel.ActiveWorkBook.SaveAs ('MyOutput', EmptyParam ,EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, LCID); หรือ: Excel.ActiveWorkBook.Save(LCID); สุดท้ายนี้ ให้ปิดสมุดงานและยกเลิกการเชื่อมต่อจาก Excel: wkBook.Close(True, SaveAsName, EmptyParam, LCID); ; วิธีการปิดที่นี่ประกอบด้วยฟังก์ชันบันทึก พารามิเตอร์แรกระบุว่าจะบันทึกการแก้ไขก่อนปิดเวิร์กบุ๊กหรือไม่ พารามิเตอร์ที่สองให้ชื่อไฟล์ที่จะบันทึก พารามิเตอร์ที่สามใช้สำหรับผู้เขียนหลายคนในการประมวลผลสถานการณ์ บรรทัดที่สองขอให้ยุติ Excel การแลกเปลี่ยนข้อมูลกับเวิร์กชีต ข้อมูลอินพุตจะดำเนินการในเซลล์หรือช่วงของเวิร์กชีตที่ใช้งานอยู่ ทั้งช่วงและเซลล์เป็นคุณสมบัติวัตถุของเวิร์กชีต เซลล์คือชุดของเซลล์ หากไม่มีการระบุตำแหน่งเฉพาะ เซลล์นั้นสามารถแสดงเซลล์ทั้งหมดในเวิร์กชีตทั้งหมดได้ อย่างไรก็ตาม โดยทั่วไปจะใช้เพื่ออ้างอิงถึงเซลล์ใดเซลล์หนึ่งโดยเฉพาะ ตัวอย่างเช่น WS.Cells.Item[1,1] แสดงถึงเซลล์ล่าสุด เซลล์ A1 ที่มุมซ้ายบน โปรดทราบว่า Item เป็นคุณสมบัติเริ่มต้นของ Cells ใน VBA และสามารถละเว้นได้ แต่ไม่มีความสะดวกดังกล่าวใน Delphi ในการกำหนดค่าให้กับเซลล์ คุณต้องอ้างอิงถึงคุณสมบัติ Value โดยไม่ได้บอกว่าคุณสมบัตินี้เป็นตัวแปร Variant เช่น: wkSheet.Cells.Item[1, 1].Value := 'Address Book'; แน่นอน คุณยังสามารถกำหนดค่าให้กับเซลล์ได้ ระบุสูตร: var AFormula:String; wkSheet.Range['F3','G6'].Value:=AFormula; วิธีการข้างต้นตรงไปตรงมาและเรียบง่ายมาก แต่จะช้ามากและไม่เหมาะสำหรับรายงานขนาดใหญ่ ข้อมูลทั้งหมดสามารถถ่ายโอนไปยัง Excel ตามลำดับได้หรือไม่ เราสามารถใช้ Range ได้ วัตถุนี้แสดงถึงพื้นที่ในเวิร์กชีต โดยปกติแล้ว จะเป็นพื้นที่สี่เหลี่ยมมุมฉาก ','J42']. มีปัญหาเล็กน้อยที่นี่ เนื่องจากหากข้อมูลเกิน 26 คอลัมน์ (เช่น มี 100 คอลัมน์) หรือหากจำเป็นต้องกำหนดช่วงเป้าหมายทันที การใช้ชื่ออักขระเพื่อทำเครื่องหมายเซลล์จะยุ่งยากกว่า โปรดจำไว้ว่าเนื่องจาก "C3" เป็นป้ายกำกับของเซลล์ แน่นอนว่าเราจึงสามารถใช้เซลล์ได้ เช่น Range[Cells.Item[1,1], Cells.Item[100,100]] เป็นไปได้ว่าค่าของ Range ควรเป็นอาร์เรย์ แต่คุณต้องไม่ใช้ Array ใน Delphi เพื่อกำหนดค่าให้กับมัน! โปรดจำไว้ว่าใน Delphi ค่าของวัตถุ Excel จะเป็นประเภท Variant เสมอ var Datas: Variant; Ir, ic: Integer; …… Datas:= varArrayCreate([1,ir,1,ic],varVariant); //สร้างอาร์เรย์ไดนามิก 100*100 ที่นี่… //กำหนดค่าให้กับ องค์ประกอบอาร์เรย์ที่นี่ด้วย wkSheet do Range[cells.Item[3,1],cells.Item[ir+2,ic]].Value:=Datas; ควรสังเกตว่าทั้งแผ่นงานและช่วงมีคุณสมบัติเซลล์ เพื่อความชัดเจน จะใช้คำสั่ง with ที่นี่ นอกจากนี้ Range ยังเป็นทิศทางอีกด้วย อาร์เรย์หนึ่งมิติที่สร้างด้วย VarArrayCreate สามารถกำหนดให้กับช่วงแถวเดียวได้เท่านั้น หากคุณต้องการกำหนดค่าสำหรับช่วงคอลัมน์เดียว คุณต้องใช้อาร์เรย์สองมิติ ตัวอย่าง: Datas:=VarArrayCreate([1,100,1 ,1], varVariant); //สร้างอาร์เรย์ไดนามิก 100*1 อย่างไรก็ตาม Cells.Item[] ส่งคืนวัตถุ Range จริง ๆ การดึงข้อมูลจากเวิร์กชีทนั้นเป็นกระบวนการย้อนกลับในการเขียนข้อมูล สิ่งที่ต้องคำนึงถึงคือวิธีกำหนดช่วงข้อมูลของเวิร์กชีท: var ir, ic : Integer …… wkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam; ).เปิดใช้งาน ; ir := Excel.ActiveCell.Row; ฟังก์ชันเซลล์พิเศษ SpecialCells ถูกนำมาใช้อย่างชาญฉลาดที่นี่เพื่อรับเซลล์สุดท้ายที่มีข้อมูล การแก้ไขข้อมูล ด้านล่างนี้คือตัวอย่างการแก้ไขข้อมูลสองตัวอย่าง var DestRange: OleVariant; start DestRange := Excel.Range['C1', 'D4']; Excel.Range['A1', 'B4'].Copy(DestRange); หากคุณส่งพารามิเตอร์ว่างไปยังฟังก์ชันคัดลอก ข้อมูลในพื้นที่นี้จะถูกคัดลอกไปยังคลิปบอร์ด และสามารถวางไปยังตำแหน่งอื่นโดยใช้วิธีวางในภายหลัง var WS: _Worksheet; …… Excel.Range['A1', 'B4'].Copy(EmptyParam); //คัดลอกข้อมูลในเวิร์กชีตไปยังคลิปบอร์ด WS := Excel.Activesheet เป็น _Worksheet; .Range['C1', 'D4'].เลือก; WS.Paste(EmptyParam, EmptyParam, lcid); //วางเนื้อหาของคลิปบอร์ดลงในเวิร์กชีตใหม่ การตั้งค่ารูปแบบ เลือก Excel เป็นเซิร์ฟเวอร์รายงาน เนื่องจากความสามารถในการจัดรูปแบบที่มีประสิทธิภาพเป็นหลัก ขั้นแรกเราจะรวมเซลล์ที่มีชื่อ "สมุดที่อยู่" และแสดงไว้ตรงกลาง จากนั้นเปลี่ยนแบบอักษรเป็น "สคริปต์อย่างเป็นทางการ" ขนาด 18 จุดด้วยตัวหนา: ด้วย wkSheet.Range['A1','D1'],Font เริ่มผสาน (True); // ผสานเซลล์ตามแนวนอน:= xlCenter; Size:=18; Name:='official script'; หากเนื้อหาของเซลล์ยาว เนื้อหาบางส่วนจะไม่แสดง วิธีการปกติคือการคลิกสองครั้งที่ขอบขวาของพื้นที่ที่เลือก เพื่อให้ความกว้างของแต่ละคอลัมน์ปรับตามความยาวของเนื้อหาโดยอัตโนมัติ ใน Delphi ความกว้างของคอลัมน์ที่ปรับได้และความสูงของแถวสามารถทำได้ด้วยวิธี AutoFit ควรสังเกตว่าวิธีนี้สามารถใช้ได้กับทั้งแถวและทั้งคอลัมน์เท่านั้น มิฉะนั้นระบบจะแจ้งข้อผิดพลาดของการปฏิเสธวิธี OLE: wkSheet.Columns.EntireColumn.AutoFit; รายงานสไตล์จีนมักจะต้องมีบรรทัดตารางที่ต่อยอดด้านบนและด้านล่าง และคุณสามารถใช้คุณสมบัติคอลเลกชัน Borders ได้ ควรสังเกตว่าวัตถุคอลเลกชันใน VBA มักจะมีคุณสมบัติรายการเริ่มต้นซึ่งไม่สามารถละเว้นได้ใน Delphi คุณสมบัติ Weight ใช้เพื่อกำหนดความหนาของเส้นตาราง: ด้วย Aname.RefersToRange,Borders do beginning แนวนอน:= xlRight; Item[xlEdgeBottom].Weight:=xlMedium; Item[xlEdgeTop].Weight:=xlMedium; . น้ำหนัก: =xlThin; item[xlInsideVertical].Weight:=xlThin; การตั้งค่าหน้าและการตั้งค่าหน้าการพิมพ์ได้รับการตั้งค่าผ่านคุณสมบัติออบเจ็กต์ PageSetUp ของเวิร์กชีต มีค่าคงที่กระดาษที่ตั้งไว้ล่วงหน้ามากกว่า 40 รายการใน Excel VBA ควรสังเกตว่าเครื่องพิมพ์บางรุ่นรองรับกระดาษบางประเภทเท่านั้น แอ็ตทริบิวต์ Orientation ใช้เพื่อควบคุมทิศทางการพิมพ์ และแนวนอนคงที่ = 2 หมายถึงการพิมพ์ในแนวนอน คุณสมบัติบูลีน CenterHorizontally และ CenterVertical ใช้เพื่อกำหนดว่าเนื้อหาที่พิมพ์อยู่กึ่งกลางแนวนอนและแนวตั้งหรือไม่ ด้วย wkSheet.PageSetUp ให้เริ่ม PaperSize:=xlPaperA4; //Paper type A4 PRintTitleRows := 'A1:D1'; // ทำซ้ำแถว/หน้านี้ LeftMargin:=18; //0.25" Left Margin RightMargin:=18; // 0.25" จะแตกต่างกันระหว่างเครื่องพิมพ์ TopMargin:=36; //0.5" BottomMargin:=36; //0.5" CenterHorizontally:=True; Orientation:=1; //การพิมพ์แนวนอน (แนวนอน)=2, แนวตั้ง=1 end; หากต้องการพิมพ์รายงาน คุณสามารถเรียกใช้เมธอด PrintOut ของเวิร์กชีตได้ วิธีการนี้กำหนดโดย VBA มี พารามิเตอร์ทางเลือก 8 ตัว สองตัวแรกใช้เพื่อระบุหน้าเริ่มต้นและหน้าสุดท้าย และจำนวนสำเนาที่จะพิมพ์ในรูปแบบที่สาม อย่างไรก็ตาม ใน Delphi พารามิเตอร์ LCID จะถูกเพิ่มที่ส่วนท้าย และไม่สามารถใช้ EmptyParam ได้ สำหรับพารามิเตอร์นี้ ในทำนองเดียวกัน วิธีการแสดงตัวอย่างก่อนพิมพ์ PrintPreview ไม่มีพารามิเตอร์ใน VBA แต่ต้องใช้พารามิเตอร์สองตัวเมื่อเรียกใน Delphi // wkBook.PrintPreview(True,LCID); //สำหรับการดูตัวอย่าง wkSheet.PrintOut(EmptyParam,EmptyParam,1, EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,LCID); ซับซ้อนมากขึ้น แนวทางที่ดีกว่าคือการตั้งชื่อช่วงของตารางที่ต้องการแล้วอ้างอิงตามชื่อ Names เป็นคุณสมบัติอ็อบเจ็กต์คอลเลกชันของ WorkBook ซึ่งมีเมธอด Add ที่สามารถทำงานได้ ชื่อ Aname : Excel2000.Name; …… Aname := wkBook.Names.Add('Address Book','=Sheet1!$A$3:$D$7', EmptyParam, EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam, พารามิเตอร์ว่าง พารามิเตอร์ว่าง); พารามิเตอร์แรกของฟังก์ชัน Add คือชื่อที่กำหนด และพารามิเตอร์ตัวที่สองคือช่วงเซลล์ที่แสดงด้วยชื่อ ควรสังเกตว่าประเภทของชื่อช่วงต้องใช้ตัวระบุ หากใช้ไลบรารีประเภท (D4) ตัวระบุจะเป็น Excel_TLB นอกจากนี้ ช่วงที่ตั้งชื่อควรใช้การอ้างอิงแบบสัมบูรณ์ กล่าวคือ เพิ่มสัญลักษณ์ "$" เมื่อคุณตั้งชื่อช่วง คุณสามารถอ้างอิงด้วยชื่อนั้นได้ บรรทัดโค้ดต่อไปนี้ทำให้เนื้อหาในสมุดที่อยู่ปรากฏเป็นตัวหนา: AName.RefersToRange.Font.Bold:=True; แก้ไขโปรแกรมแมโคร Excel ใน Delphi! รหัสต่อไปนี้จะสร้างมาโครสำหรับสมุดงานของเราที่บันทึกเวลาการเข้าถึงล่าสุดเมื่อปิดสมุดงาน: var LineNo: integer; CM: CodeModule; start CM := WkBook.VBProject.VBComponents.Item( 'ThisWorkbook') Codemodule; LineNo := CM.CreateEventProc('ก่อนปิด', 'สมุดงาน'); SDate:='วันที่เข้าถึงล่าสุด:'+DateToStr(Date()); CM.InsertLines(LineNo + 1, ' Range("B2").Value = "'+sDate+''"'); สิ้นสุด; แมโคร เพิ่มหน่วยในส่วนการใช้งานก่อนหน้า: VBIDE2000 หากใช้ไลบรารีประเภท หน่วยที่เกี่ยวข้องคือ VBIDE_TLB กุญแจสำคัญของโค้ดนี้คือออบเจ็กต์ CodeModule ขออภัย ไม่มีร่องรอยของออบเจ็กต์นี้ในเอกสารวิธีใช้ Excel VBA ดังนั้นเราจึงค้นหาได้เฉพาะ MSDN เท่านั้น Delphi4 และเวอร์ชันก่อนหน้า Delphi4 ไม่มีวัตถุ TExcelApplication และจำเป็นต้องแนะนำไลบรารีประเภทเพื่อใช้เทคโนโลยีการทำงานอัตโนมัติของ OLE ไลบรารีประเภทของ Excel97 คือ Excel8.olb ข้อแตกต่างที่สำคัญระหว่างสองวิธีนี้คือวิธีการสร้างการเชื่อมต่อกับโปรแกรมเซิร์ฟเวอร์ ต่อไปนี้เป็นกรอบงานโปรแกรมสำหรับควบคุม Excel ผ่านไลบรารีประเภท: ใช้ Windows, ComObj, ActiveX, Excel_TLB; var Excel: _Application; ; ไม่ทราบ: IUnknown; ผลลัพธ์ : HResult; เริ่ม LCID := LOCALE_USER_DEFAULT; ผลลัพธ์ := GetActiveObject(CLASS_Application, ไม่มี, ไม่ทราบ); //ลองจับภาพอินสแตนซ์ของโปรแกรมที่ทำงานอยู่หาก (ผลลัพธ์ = MK_E_UNAVAILABLE) จากนั้น Excel := CoApplication.Create //เริ่มอินสแตนซ์ของโปรแกรมใหม่ มิฉะนั้นจะเริ่มต้น {ตรวจสอบข้อผิดพลาดระหว่างการเรียกเมธอด GetActiveObject} OleCheck (ผลลัพธ์); (Unknown.QueryInterface(_Application, Excel)); สิ้นสุด; …… //ดำเนินการประมวลผลข้อมูล Excel.Visible[LCID] := True; // Excel.DisplayAlerts[LCID] := False; //แสดงกล่องโต้ตอบพร้อมท์ Excel.Quit; End; ไม่ได้ใช้โครงสร้างปกติที่นี่เนื่องจากกลไกการจัดการข้อยกเว้นจำเป็นต้องมีการตรวจสอบ OLE ที่ซับซ้อน ซึ่งช่วยลด ต้นทุน ความเร็วในการดำเนินการของส่วนยกเว้น ควรสังเกตว่าฟังก์ชันที่มาพร้อมกับ CoApplication และชื่อคงที่บางตัวที่สร้างโดยเวอร์ชัน Delphi ที่แตกต่างกันอาจแตกต่างกัน ดังนั้นคุณควรตรวจสอบไลบรารีประเภทที่เกี่ยวข้อง ก่อนที่จะเรียกใช้เมธอด Quit ต้องแน่ใจว่าได้ปล่อยเวิร์กบุ๊กและตัวแปรเวิร์กชีตทั้งหมดที่สร้างในโปรแกรม ไม่เช่นนั้น Excel อาจอยู่ในหน่วยความจำและเรียกใช้ (คุณสามารถกด Ctrl+Alt+Del เพื่อดูได้) มีปัญหาเล็กน้อยในการเรียก GetActiveObject เพื่อจับภาพอินสแตนซ์ของโปรแกรม หาก Excel อยู่ในสถานะการทำงานที่ย่อเล็กสุด อาจแสดงเฉพาะเฟรมหลักของโปรแกรมและพื้นที่ผู้ใช้ไม่สามารถมองเห็นได้ นอกจากนี้ หากคุณไม่ต้องการแนะนำไลบรารีประเภท คุณยังสามารถใช้การเชื่อมโยงที่ล้าหลังได้ แต่จะช้ากว่ามาก ตัวอย่างต่อไปนี้ประกาศตัวแปร Variant เพื่อแสดงถึงแอปพลิเคชัน Excel: var Excel: Variant; ... ลอง Excel := GetActiveObject('Excel.Application'); ยกเว้น Excel := CreateOleObject('Excel.Application'); .มองเห็น := จริง; เมื่อใช้การรวมที่ล้าหลัง คอมไพเลอร์จะไม่ตรวจสอบวิธีการของวัตถุ Excel ที่ถูกเรียก แต่ปล่อยให้งานเหล่านี้อยู่ที่โปรแกรมเซิร์ฟเวอร์ให้เสร็จสิ้นระหว่างการดำเนินการ ด้วยวิธีนี้ พารามิเตอร์เริ่มต้นจำนวนมากที่ตั้งค่าโดย VBA (มักจะมากกว่าหนึ่งโหล) ถูกใช้ตามที่ควรจะเป็น ดังนั้นวิธีนี้จึงมีประโยชน์ที่ไม่คาดคิด - รหัสมีความกระชับ: var WBk, WS, SheetName: OleVariant; ..... WBk := Excel.WorkBooks.Open('C:/Test. xls') ;WS := WBk.Worksheets.Item['SheetName']; WS.Activate; ...... WBk.Close(SaveChanges := True); Excel.Quit; เพียงคุณทำได้ด้วยตัวเองเท่านั้น: const xlWBATWorksheet = -4167; สุดท้ายนี้ อย่าลืมปล่อยตัวแปรหลังจากปิด Excel: Excel := Unassigned; ต่อไปนี้คือซอร์สโค้ดที่ใช้ในตัวอย่างของบทความนี้ ซึ่งส่งผ่านภายใต้ Delphi6+MSOffice2000 หน่วย Unit1; อินเทอร์เฟซใช้ Windows, ข้อความ, SysUtils, ตัวแปร, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม, กล่องโต้ตอบ, OleServer, Excel2000, กริด, StdCtrls; ขั้นตอน FormActivate (ผู้ส่ง: TObject); Button1Click (ผู้ส่ง: TObject); ขั้นตอน AddMacro; ขั้นตอน Printit; ; การใช้งาน {$R *.dfm} ใช้ VBIDE2000; wkSheet:_WorkSheet; LCID:จำนวนเต็ม; Rows[1].CommaText:='Zhang San, ชาย, 25,010-33775566'; Rows[2].CommaText:='Li Si, ชาย, 47,012-6574906'; Rows[3].CommaText:='Friday, Female ,18,061-7557381'; แถว[4].CommaText:='Sun Tao, เพศหญิง, 31,3324559'; end; end; end; , LCID); wkSheet:=wkBook.Sheets[1] เป็น _WorkSheet; TForm1.Write2Xls; var Datas:Variant; i,j:Integer; start ir:=StringGrid1.RowCount; ic:=StringGrid1.ColCount; :=1 ถึง ir ทำเพื่อ j:=1 ถึง ic ทำ Datas[i,j]:=StringGrid1.Cells[j-1,i-1]; ด้วย wkSheet จะเริ่มต้นการเปิดใช้งาน(LCID); Cells.Item[1,1].Value:='Address Book'; .Item[3,1],cells.Item[ir+2,ic]].Value:=Datas; end; // Excel.Visible[LCID]:=True; ข้อมูล:=ไม่ได้กำหนด; สิ้นสุดขั้นตอน TForm1.Retrieve; var Datas:Variant; =Excel.ActiveCell.คอลัมน์; ข้อมูล:=Range[Cells.Item[1,1],Cells.Item[ir,ic]].Value; ด้วย StringGrid1 จะเริ่มต้น ColCount:=ic; RowCount:=ir; ScrollBars:=ssBoth; ถึง ir-1 ทำเพื่อ j:=0 ถึง ic-1 ทำ Cells[j,i]:=Datas[i+1,j+1]; ข้อมูล:=UnAssigned; end; เนมชีตเริ่มต้น AName:=wkBook.Names.Add('Address Book','=Sheet1!$A$3:$D$7',EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam); สิ้นสุด; .AddFormula; var AFormula:String; AFormula:='=Rand()'; wkSheet.Range['F3','G6'].Value:=AFormula; end; แบบอักษรเริ่มผสาน (จริง); // ผสานเซลล์แนวนอน:= xlCenter; ขนาด:=18; FontStyle:=Bold; end; wkSheet.Columns.EntireColumn.AutoFit; พร้อม Aname.RefersToRange,Borders จะเริ่มต้นในแนวนอน:= xlRight; รายการ [xlInsideHorizontal].Weight:=xlThin; item[xlInsideVertical].Weight:=xlThin; end; var LineNo: integer; CM: CodeModule; VBComponents.Item('ThisWorkbook').โค้ดโมดูล; := CM.CreateEventProc('BeforeClose', 'Workbook'); SDate:='วันที่เข้าถึงล่าสุด:'+DateToStr(Date()); CM.InsertLines(LineNo + 1, ' Range("B2").Value = "'+sDate+'"'); สิ้นสุดขั้นตอน TForm1.Printit; PaperSize:=xlPaperA4; //Paper type A4 PrintTitleRows := 'A1:D1'; // ทำซ้ำแถว/หน้านี้ LeftMargin:=18; //0.25" Left Margin RightMargin:=18; //0.25" จะแตกต่างกันไปในแต่ละเครื่องพิมพ์ TopMargin:=36; //0.5" BottomMargin:=36; //0.5" CenterHorizontally:=True; การวางแนว:=1; //แนวนอน=2,แนวตั้ง=1 สิ้นสุด; wkSheet.PrintOut(EmptyParam,EmptyParam,1, EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,LCID); ; เริ่มลอง OpenExl; AddFormula; NameSheet; Formats; AddMacro; ReTrieve; end; end; การติดต่ออย่างใกล้ชิดของ Delphi กับ Excel [Wang [email protected]] หนึ่งในคุณสมบัติที่สำคัญที่สุด แต่การควบคุม QuickReport ที่ยากต่อการใช้งานมักจะไม่สามารถตอบสนองความต้องการของรายงานฐานข้อมูลได้ หากรายงานของคุณซับซ้อนมาก หรือต้องการความยืดหยุ่นในการเปลี่ยนแปลงรูปแบบ การใช้ Excel เป็นเซิร์ฟเวอร์รายงานก็เป็นทางเลือกที่ดี ส่วนประกอบ Excel ที่ Delphi มอบให้ตั้งแต่เวอร์ชัน 5 เป็นต้นไป ช่วยให้การประยุกต์ใช้เทคโนโลยีอัตโนมัติของ OLE ง่ายขึ้นอย่างมาก อย่างไรก็ตาม ไฟล์วิธีใช้ที่หายไปถือเป็นประเด็นที่ถูกวิพากษ์วิจารณ์มากที่สุดของ Delphi และส่วนประกอบใหม่เหล่านี้ก็ไม่มีข้อยกเว้น โมเดลออบเจ็กต์ของ Excel เป็นโครงสร้างแบบลำดับชั้นที่เหมือนต้นไม้ รูทคือออบเจ็กต์แอททริบิวต์ของออบเจ็กต์หลัก รายละเอียด โปรดดูที่ไฟล์วิธีใช้ MSOffice.Excel VBA หากต้องการควบคุม Excel ใน Delphi คุณต้องสร้างการเชื่อมต่อกับโปรแกรมเซิร์ฟเวอร์ก่อน เปิดสมุดงาน จากนั้นแลกเปลี่ยนข้อมูลกับแผ่นงานเป้าหมาย และสุดท้ายยกเลิกการเชื่อมต่อ เปิดสมุดงาน Excel ตัวอย่างของเราเริ่มต้นด้วยแบบฟอร์มหลักที่มี TStringGrid (แน่นอนว่าต้องกรอกข้อมูลบางอย่าง) และปุ่มสองปุ่ม ลากตัวควบคุม TExcelApplication จากแท็บเซิร์ฟเวอร์ของแผงควบคุมแล้ววางลงในแบบฟอร์ม ขั้นแรก ตั้งค่า ConnectKind เป็น ckRunningOrNew ซึ่งหมายความว่าหากตรวจพบอินสแตนซ์ Excel ที่ทำงานอยู่ ให้สร้างการติดต่อกับอินสแตนซ์นั้น ไม่เช่นนั้นให้เริ่ม Excel นอกจากนี้ หากคุณต้องการให้โปรแกรมสร้างการติดต่อกับโปรแกรมเซิร์ฟเวอร์ทันทีที่รัน คุณสามารถตั้งค่าคุณสมบัติการเชื่อมต่ออัตโนมัติเป็น True ได้ สิ่งที่ต้องทำเพื่อสร้างการติดต่อกับ Excel คือคำสั่งเดียว: Excel Connect; บางทีคุณอาจสังเกตเห็นว่ามีตัวควบคุม Excel อื่นๆ บนแท็บเซิร์ฟเวอร์ Excel . ActiveWorkbook); ExcelWorksheet1.ConnectTo(Excel . ActiveSheet เป็น _Worksheet); ExcelWorksheet2.ConnectTo(Excel . Worksheets.Item['Sheet2'] เป็น _Worksheet) ควรสังเกตว่าต้องเปิดสมุดงานหรือแผ่นงานที่เกี่ยวข้องก่อนที่จะใช้วิธี ConnectTo นอกจากนี้ การควบคุมเหล่านี้จะไม่นำมาซึ่งความสะดวกเพิ่มเติมในกรณีส่วนใหญ่ ดังนั้นจึงเป็นการดีที่สุดที่จะใช้เพียง TExcelApplication เดียวเท่านั้น เมื่อสร้างการติดต่อกับเซิร์ฟเวอร์ Excel แล้ว สามารถสร้างสมุดงานใหม่ได้: var wkBook : _WorkBook; LCID : Integer; ... LCID := GetUserDefaultLCID(); ฟังก์ชัน พารามิเตอร์แรกใช้เพื่อกำหนดเทมเพลตที่ใช้สำหรับสมุดงานใหม่ คุณสามารถใช้ xlWBATChart, xlWBATExcel4IntlMacroSheet, xlWBATExcel4MacroSheet หรือค่าคงที่ xlWBATWorksheet หรืออาจเป็นชื่อของไฟล์ xls ที่มีอยู่ EmptyParam ในที่นี้คือหน่วย Variants และตัวแปรที่กำหนด ซึ่งหมายถึงการใช้เทมเพลตสากลเริ่มต้นเพื่อสร้างเวิร์กบุ๊กใหม่ หากคุณเปิดเอกสาร xls ที่มีอยู่ คุณควรส่งชื่อไฟล์ที่จะเปิดเป็นพารามิเตอร์แรกไปยังฟังก์ชัน Open: wkBook:=Excel.WorkBooks.Open(edtDesFile.text,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam , ค่าว่าง, ค่าว่าง, ค่าว่าง, ค่าว่าง, EmptyParam,EmptyParam,LCID) คุณต้องทราบว่าการดำเนินการข้อมูลทั้งหมดมีไว้สำหรับเวิร์กชีตที่ใช้งานอยู่เป็นหลัก คำสั่งต่อไปนี้ใช้ตัวแปร _WorkSheet เพื่อแสดงเซลล์ที่ใช้งานอยู่ในปัจจุบัน หากคุณทราบชื่อของเวิร์กชีต หมายเลขดัชนีสามารถถูกแทนที่ด้วยชื่อเวิร์กชีต: wkSheet:=wkBook.Sheets[1] เป็น _WorkSheet หลังจากเสร็จสิ้นการแลกเปลี่ยนข้อมูลแล้ว คุณต้องบันทึกเวิร์กบุค: Excel.ActiveWorkBook.SaveAs ('MyOutput', EmptyParam ,EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, LCID); หรือ: Excel.ActiveWorkBook.Save(LCID); สุดท้ายนี้ ให้ปิดสมุดงานและยกเลิกการเชื่อมต่อจาก Excel: wkBook.Close(True, SaveAsName, EmptyParam, LCID); ; วิธีการปิดที่นี่ประกอบด้วยฟังก์ชันบันทึก พารามิเตอร์แรกระบุว่าจะบันทึกการแก้ไขก่อนปิดเวิร์กบุ๊กหรือไม่ พารามิเตอร์ที่สองให้ชื่อไฟล์ที่จะบันทึก พารามิเตอร์ที่สามใช้สำหรับผู้เขียนหลายคนในการประมวลผลสถานการณ์ บรรทัดที่สองขอให้ยุติ Excel การแลกเปลี่ยนข้อมูลกับเวิร์กชีต ข้อมูลอินพุตจะดำเนินการในเซลล์หรือช่วงของเวิร์กชีตที่ใช้งานอยู่ ทั้งช่วงและเซลล์เป็นคุณสมบัติวัตถุของเวิร์กชีต เซลล์คือชุดของเซลล์ หากไม่มีการระบุตำแหน่งเฉพาะ เซลล์นั้นสามารถแสดงเซลล์ทั้งหมดในเวิร์กชีตทั้งหมดได้ อย่างไรก็ตาม โดยทั่วไปจะใช้เพื่ออ้างอิงถึงเซลล์ใดเซลล์หนึ่งโดยเฉพาะ ตัวอย่างเช่น WS.Cells.Item[1,1] แสดงถึงเซลล์ล่าสุด เซลล์ A1 ที่มุมซ้ายบน โปรดทราบว่า Item เป็นคุณสมบัติเริ่มต้นของ Cells ใน VBA และสามารถละเว้นได้ แต่ไม่มีความสะดวกดังกล่าวใน Delphi ในการกำหนดค่าให้กับเซลล์ คุณต้องอ้างอิงถึงคุณสมบัติ Value โดยไม่ได้บอกว่าคุณสมบัตินี้เป็นตัวแปร Variant เช่น: wkSheet.Cells.Item[1, 1].Value := 'Address Book'; แน่นอน คุณยังสามารถกำหนดค่าให้กับเซลล์ได้ ระบุสูตร: var AFormula:String; wkSheet.Range['F3','G6'].Value:=AFormula; วิธีการข้างต้นตรงไปตรงมาและเรียบง่ายมาก แต่จะช้ามากและไม่เหมาะสำหรับรายงานขนาดใหญ่ ข้อมูลทั้งหมดสามารถถ่ายโอนไปยัง Excel ตามลำดับได้หรือไม่ เราสามารถใช้ Range ได้ วัตถุนี้แสดงถึงพื้นที่ในเวิร์กชีต โดยปกติแล้ว จะเป็นพื้นที่สี่เหลี่ยมมุมฉาก ','J42']. มีปัญหาเล็กน้อยที่นี่ เนื่องจากหากข้อมูลเกิน 26 คอลัมน์ (เช่น มี 100 คอลัมน์) หรือหากจำเป็นต้องกำหนดช่วงเป้าหมายทันที การใช้ชื่ออักขระเพื่อทำเครื่องหมายเซลล์จะยุ่งยากกว่า โปรดจำไว้ว่าเนื่องจาก "C3" เป็นป้ายกำกับของเซลล์ แน่นอนว่าเราจึงสามารถใช้เซลล์ได้ เช่น Range[Cells.Item[1,1], Cells.Item[100,100]] เป็นไปได้ว่าค่าของ Range ควรเป็นอาร์เรย์ แต่คุณต้องไม่ใช้ Array ใน Delphi เพื่อกำหนดค่าให้กับมัน! โปรดจำไว้ว่าใน Delphi ค่าของวัตถุ Excel จะเป็นประเภท Variant เสมอ var Datas: Variant; Ir, ic: Integer; …… Datas:= varArrayCreate([1,ir,1,ic],varVariant); //สร้างอาร์เรย์ไดนามิก 100*100 ที่นี่… //กำหนดค่าให้กับ องค์ประกอบอาร์เรย์ที่นี่ด้วย wkSheet do Range[cells.Item[3,1],cells.Item[ir+2,ic]].Value:=Datas; ควรสังเกตว่าทั้งแผ่นงานและช่วงมีคุณสมบัติเซลล์ เพื่อความชัดเจน จะใช้คำสั่ง with ที่นี่ นอกจากนี้ Range ยังเป็นทิศทางอีกด้วย อาร์เรย์หนึ่งมิติที่สร้างด้วย VarArrayCreate สามารถกำหนดให้กับช่วงแถวเดียวได้เท่านั้น หากคุณต้องการกำหนดค่าสำหรับช่วงคอลัมน์เดียว คุณต้องใช้อาร์เรย์สองมิติ ตัวอย่าง: Datas:=VarArrayCreate([1,100,1 ,1], varVariant); //สร้างอาร์เรย์ไดนามิก 100*1 อย่างไรก็ตาม Cells.Item[] ส่งคืนวัตถุ Range จริง ๆ การดึงข้อมูลจากเวิร์กชีทนั้นเป็นกระบวนการย้อนกลับในการเขียนข้อมูล สิ่งที่ต้องคำนึงถึงคือวิธีกำหนดช่วงข้อมูลของเวิร์กชีท: var ir, ic : Integer …… wkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam; ).เปิดใช้งาน ; ir := Excel.ActiveCell.Row; ฟังก์ชันเซลล์พิเศษ SpecialCells ถูกนำมาใช้อย่างชาญฉลาดที่นี่เพื่อรับเซลล์สุดท้ายที่มีข้อมูล การแก้ไขข้อมูล ด้านล่างนี้คือตัวอย่างการแก้ไขข้อมูลสองตัวอย่าง var DestRange: OleVariant; start DestRange := Excel.Range['C1', 'D4']; Excel.Range['A1', 'B4'].Copy(DestRange); หากคุณส่งพารามิเตอร์ว่างไปยังฟังก์ชันคัดลอก ข้อมูลในพื้นที่นี้จะถูกคัดลอกไปยังคลิปบอร์ด และสามารถวางไปยังตำแหน่งอื่นโดยใช้วิธีวางในภายหลัง var WS: _Worksheet; …… Excel.Range['A1', 'B4'].Copy(EmptyParam); //คัดลอกข้อมูลในเวิร์กชีตไปยังคลิปบอร์ด WS := Excel.Activesheet เป็น _Worksheet; .Range['C1', 'D4'].เลือก; WS.Paste(EmptyParam, EmptyParam, lcid); //วางเนื้อหาของคลิปบอร์ดลงในเวิร์กชีตใหม่ การตั้งค่ารูปแบบ เลือก Excel เป็นเซิร์ฟเวอร์รายงาน เนื่องจากความสามารถในการจัดรูปแบบที่มีประสิทธิภาพเป็นหลัก ขั้นแรกเราจะรวมเซลล์ที่มีชื่อ "สมุดที่อยู่" และแสดงไว้ตรงกลาง จากนั้นเปลี่ยนแบบอักษรเป็น "สคริปต์อย่างเป็นทางการ" ขนาด 18 จุดด้วยตัวหนา: ด้วย wkSheet.Range['A1','D1'],Font เริ่มผสาน (True); // ผสานเซลล์ตามแนวนอน:= xlCenter; Size:=18; Name:='official script'; หากเนื้อหาของเซลล์ยาว เนื้อหาบางส่วนจะไม่แสดง วิธีการปกติคือการคลิกสองครั้งที่ขอบขวาของพื้นที่ที่เลือก เพื่อให้ความกว้างของแต่ละคอลัมน์ปรับตามความยาวของเนื้อหาโดยอัตโนมัติ ใน Delphi ความกว้างของคอลัมน์ที่ปรับได้และความสูงของแถวสามารถทำได้ด้วยวิธี AutoFit ควรสังเกตว่าวิธีนี้สามารถใช้ได้กับทั้งแถวและทั้งคอลัมน์เท่านั้น มิฉะนั้นระบบจะแจ้งข้อผิดพลาดของการปฏิเสธวิธี OLE: wkSheet.Columns.EntireColumn.AutoFit; รายงานสไตล์จีนมักจะต้องมีบรรทัดตารางที่ต่อยอดด้านบนและด้านล่าง และคุณสามารถใช้คุณสมบัติคอลเลกชัน Borders ได้ ควรสังเกตว่าวัตถุคอลเลกชันใน VBA มักจะมีคุณสมบัติรายการเริ่มต้นซึ่งไม่สามารถละเว้นได้ใน Delphi คุณสมบัติ Weight ใช้เพื่อกำหนดความหนาของเส้นตาราง: ด้วย Aname.RefersToRange,Borders do beginning HorizonAlignment:= xlRight; Item[xlEdgeBottom].Weight:=xlMedium; Item[xlEdgeTop].Weight:=xlMedium; . น้ำหนัก: =xlThin; item[xlInsideVertical].Weight:=xlThin; การตั้งค่าหน้าและการตั้งค่าหน้าการพิมพ์ได้รับการตั้งค่าผ่านคุณสมบัติออบเจ็กต์ PageSetUp ของเวิร์กชีต มีค่าคงที่กระดาษที่ตั้งไว้ล่วงหน้ามากกว่า 40 รายการใน Excel VBA ควรสังเกตว่าเครื่องพิมพ์บางรุ่นรองรับกระดาษบางประเภทเท่านั้น แอ็ตทริบิวต์ Orientation ใช้เพื่อควบคุมทิศทางการพิมพ์ และแนวนอนคงที่ = 2 หมายถึงการพิมพ์ในแนวนอน คุณสมบัติบูลีน CenterHorizontally และ CenterVertical ใช้เพื่อกำหนดว่าเนื้อหาที่พิมพ์อยู่กึ่งกลางแนวนอนและแนวตั้งหรือไม่ ด้วย wkSheet.PageSetUp ให้เริ่ม PaperSize:=xlPaperA4; //Paper type A4 PrintTitleRows := 'A1:D1'; // ทำซ้ำแถว/หน้านี้ LeftMargin:=18; Left Margin RightMargin:=18; // 0.25" จะแตกต่างกันระหว่างเครื่องพิมพ์ TopMargin:=36; //0.5" BottomMargin:=36; //0.5" CenterHorizontally:=True; Orientation:=1; //การพิมพ์แนวนอน (แนวนอน)=2, แนวตั้ง=1 สิ้นสุด; หากต้องการพิมพ์รายงาน คุณสามารถเรียกใช้เมธอด PrintOut ของเวิร์กชีตได้ พารามิเตอร์ทางเลือก สองตัวแรก ใช้เพื่อระบุหน้าเริ่มต้นและหน้าสุดท้ายและจำนวนสำเนาที่พิมพ์ในรูปแบบที่สาม อย่างไรก็ตาม ใน Delphi พารามิเตอร์ LCID จะถูกเพิ่มที่ส่วนท้าย และ EmptyParam ไม่สามารถใช้กับพารามิเตอร์นี้ได้ ในทำนองเดียวกัน วิธีการแสดงตัวอย่างก่อนพิมพ์ PrintPreview ไม่มีพารามิเตอร์ใน VBA แต่ต้องใช้พารามิเตอร์สองตัวเมื่อเรียกใน Delphi // wkbook.printpreview (จริง, lcid); ซับซ้อนมากขึ้นวิธีที่ดีกว่าคือการตั้งชื่อช่วงตารางเฉพาะจากนั้นอ้างอิงตามชื่อ ชื่อเป็นคุณสมบัติการรวบรวมวัตถุของเวิร์กบุ๊กซึ่งมีวิธีการเพิ่มที่สามารถทำงานนี้ได้ var aname: excel2000.name; emptyparam, emptyparam); พารามิเตอร์แรกของฟังก์ชั่นเพิ่มคือชื่อที่กำหนดและพารามิเตอร์ที่สองคือช่วงเซลล์ที่แสดงด้วยชื่อ ควรสังเกตว่าประเภทของชื่อช่วงจะต้องใช้รอบคัดเลือก นอกจากนี้ช่วงที่มีชื่อควรใช้การอ้างอิงแบบสัมบูรณ์นั่นคือเพิ่มสัญลักษณ์ "$" เมื่อคุณตั้งชื่อช่วงคุณสามารถอ้างอิงได้ด้วยชื่อนั้น แก้ไขโปรแกรมแมโคร Excel ใน Delphi! รหัสต่อไปนี้สร้างมาโครสำหรับสมุดงานของเราที่บันทึกเวลาการเข้าถึงครั้งสุดท้ายเมื่อปิดเวิร์กบุ๊ก: Var Lineno: Integer; Codemodule; SDATE: = 'วันที่เข้าถึงล่าสุด:'+DateToStr (วันที่ ()); มาโครเพิ่มหน่วยไปยังส่วนการใช้งานก่อนหน้า: VBIDE2000 กุญแจสำคัญในรหัสนี้คือวัตถุ CodeModule Delphi4 และรุ่นก่อนหน้า Delphi4 ไม่ได้จัดเตรียมวัตถุ Texcelapplication และต้องมีการแนะนำไลบรารีประเภทเพื่อใช้เทคโนโลยี OLE Automation ความแตกต่างที่สำคัญระหว่างวิธีการทั้งสองนี้คือวิธีการสร้างการเชื่อมต่อกับโปรแกรมเซิร์ฟเวอร์ ; ไม่ทราบ); (unknown.QueryInterface (_application, excel)); จริง; ค่าใช้จ่ายความเร็วในการดำเนินการของส่วนยกเว้น ควรสังเกตว่าฟังก์ชั่นการร่วมกันของฟังก์ชั่นและชื่อคงที่บางชื่อที่สร้างขึ้นโดยเวอร์ชัน Delphi ที่แตกต่างกันอาจแตกต่างกันดังนั้นคุณควรตรวจสอบไลบรารีประเภทที่เกี่ยวข้อง ก่อนที่จะเรียกใช้วิธีการเลิกให้แน่ใจว่าได้ปล่อยตัวแปรเวิร์กบุ๊กและแผ่นงานทั้งหมดที่สร้างขึ้นในโปรแกรมมิฉะนั้น Excel อาจอยู่ในหน่วยความจำและเรียกใช้ (คุณสามารถกด Ctrl+Alt+del เพื่อดู) มีปัญหาเล็ก ๆ น้อย ๆ เกี่ยวกับการเรียก GetActiveObject เพื่อจับภาพอินสแตนซ์ของโปรแกรม นอกจากนี้หากคุณไม่ต้องการแนะนำไลบรารีประเภทคุณสามารถใช้การเชื่อมโยงล่าช้า แต่ช้ากว่ามาก ตัวอย่างต่อไปนี้ประกาศตัวแปรตัวแปรเพื่อเป็นตัวแทนของแอปพลิเคชัน Excel: Var Excel: Variant; . visible: = true; เมื่อใช้การเชื่อมโยงล่าช้าคอมไพเลอร์ไม่ได้ตรวจสอบวิธีการของวัตถุ Excel ที่เรียกว่า แต่ทิ้งงานเหล่านี้ไปยังโปรแกรมเซิร์ฟเวอร์เพื่อให้เสร็จสมบูรณ์ในระหว่างการดำเนินการด้วยวิธีนี้พารามิเตอร์เริ่มต้นจำนวนมากที่กำหนดโดย VBA ใช้งานได้ตามที่ควรจะเป็น XLS '); WS : = wbk.worksheets.item ['sheetname']; เพียงแค่คุณทำได้ด้วยตัวเอง: const xlwbatworksheet = -4167; ในที่สุดอย่าลืมที่จะปล่อยตัวแปรหลังจากปิด Excel: Excel: = ไม่ได้ออกแบบมา; Unit UNIT1; ขั้นตอนการสร้างสรรค์ (ผู้ส่ง: tobject); Button1Click (ผู้ส่ง: procedure procedure {private closexl; การใช้งาน {$ r *.dfm} ใช้ vbide2000; wksheet: _worksheet; แถว [1] .Commatext: = 'จางซาน, ชาย, 25,010-33775566'; , 18,061-7557381 '; แถว [4] .Commatext: = 'Sun Tao, หญิง, 31,3324559'; , LCID); TFORM1.WRITE2XLS; : = 1 ถึง ir ทำเพื่อ j: = 1 ถึง ic do Datas [I, J]: = StringGrid1.Cells [J-1, I-1]; .item [3,1], cells.item [ir+2, ic]]. ค่า: = data; Datas: = unassigned; = excel.activecell.column; DATAS: = Range [cells.item [1,1], cells.item [ir, ic]]. ค่า; ถึง IR-1 ทำเพื่อ j: = 0 ถึง IC-1 do cells [j, i]: = datas [i+1, j+1]; DATAS: unassigned; Namesheet; Aname: = wkbook.names.add ('ที่อยู่สมุดบัญชี', '= sheet1! $ a $ 3: $ d $ 7', emptyparam, emptyparam, emptyparam, emptyparam, emptyparam, embtyparam, emptyparam, emptyparam .Addformula; Aformula: = '= Rand ()'; ฟอนต์เริ่มผสาน (จริง); FontStyle: = Bold; รายการ [xlinsidehorizontal] .weight: = xlthin; VBComponents.item ('thisworkbook'). codemodule; : = cm.createVentProc ('beforeclose', 'Workbook'); "+sdate+'"); เอกสาร: = xlpapera4; topmargin: = 36; การปฐมนิเทศ: = 1; เราเริ่มต้น Openexl; Nameshet Formats;