การอ้างอิงโซลูชัน Delphi + Word นี่คือฟังก์ชันหลายอย่างที่ฉันทำในระหว่างโปรเจ็กต์ ฉันเห็นว่าทุกคนถามคำถามเกี่ยวกับ Word ตอนนี้นำมันออกมาและแบ่งปันกับทุกคน (หวังว่าเพื่อน ๆ จะได้เพิ่มฟังก์ชั่นใหม่ ๆ หรือทำเป็น package หรือ libs เป็นต้น เพื่อให้ทุกคนใช้งานได้สะดวกขึ้น ผมเองก็ไม่มีเวลานะ 555) ก่อนใช้งานให้สร้างไฟล์ WORD เปล่าๆ ก่อน เป็นเทมเพลตตามความต้องการของคุณ ในเทมเพลต มีการตั้งค่ารูปแบบและข้อความต่าง ๆ ในไฟล์ นอกจากนี้ พารามิเตอร์ของ PRnWordTable คือตัวควบคุมประเภท TDBGridEh ซึ่งนำมาจาก Ehlib2.6 ฟังก์ชัน shFileCopy (ใช้ในการคัดลอกไฟล์) และฟังก์ชัน guiInfo (ใช้เพื่อแสดงกล่องข้อความ) ก็ถูกเขียนโดยตัวฉันเองเช่นกัน และ มีการแนบรหัสด้วย รหัสตัวอย่างจะเป็นดังนี้: ฟังก์ชั่นของการเติมโค้ดให้สมบูรณ์: 1. แทนที่ข้อความ "#TITLE#" ในเทมเพลตการพิมพ์ด้วย "Demo Code 1" 2. และแทรกเนื้อหาที่แสดงอยู่ในปัจจุบันโดยตัวควบคุม DBGridEh1 ไปที่ส่วนท้ายของเอกสาร 3. แทรกบรรทัดว่างที่ ส่วนท้ายของเอกสาร 4. แทรกบรรทัดข้อความใหม่ที่ส่วนท้ายของเอกสาร 5. ลบบรรทัดว่างในเอกสารออก ถ้า PrnWordBegin('C:/Print template.DOC','C:/Target file 1.DOC ') จากนั้นจึงเริ่มต้น PrnWordReplace('#TITLE#','รหัสสาธิต 1'); PrnWordTable(DBGridEh1); PrnWordInsert(''); PrnWordInsert('นี่คือบรรทัดใหม่ของข้อความ'); p 'จริง); PrnWordSave สิ้นสุด ; //การพิมพ์คำ (ส่วนประกาศ) wDoc,wApp:Variant; ฟังก์ชัน PrnWordBegin(tempDoc,docName:String):boolean; ฟังก์ชัน PrnWordReplace(docText,newText:String;bSimpleReplace:boolean=false):boolean; บูลีน; โอเวอร์โหลด; ฟังก์ชั่น PrnWordInsert (var imgInsert:TImage;sBookMark:String=''):boolean;overload; function PrnWordInsert(var chartInsert:TChart;sBookMark:String=''):boolean;overload; function PrnWordTable(var dbG:TDBGridEh;sBookMark:String='') ):boolean; ขั้นตอน PrnWordSave; // การพิมพ์คำ (ส่วนการใช้งาน) { ฟังก์ชั่น: สร้างไฟล์เป้าหมายใหม่ docName ตามไฟล์เทมเพลต tempDoc และเปิดไฟล์ } ฟังก์ชัน PrnWordBegin(tempDoc,docName:String):boolean;begin result:=false; //Copy template if tempDoc<>'' แล้ว if ไม่ใช่ shFileCopy(tempDoc, docName) จากนั้นออก; //เชื่อมต่อกับ Word ลอง wApp:=CreateOleObject('Word.application'); ยกเว้น guiInfo('กรุณาติดตั้ง Microsoft Word ก่อน'); exit; end; ลอง //Open if tempDoc='' จากนั้น start //สร้างเอกสารใหม่ wDoc:=wApp.Document.Add; wDoc.SaveAs(docName); Documents. Open(docName); end; ยกเว้น guiInfo('Failed to open the template, please check if the template is right. '); wApp.Quit; exit; wApp.Visible:=true; result:=true;end; { ฟังก์ชั่น: ใช้ข้อความใหม่ เพื่อแทนที่ เนื้อหา docText bSimpleReplace : เมื่อ เป็น จริง ข้อความถูกห่อไว้ การประมวลผล } ฟังก์ชัน PrnWordReplace(docText,newText:String;bSimpleReplace:boolean=false):boolean;var i:Integer;begin if bSimpleReplace จากนั้นเริ่มการประมวลผลแบบง่าย ๆ ดำเนินการแทนที่โดยตรง ลอง wApp.Selection.Find.ClearFormatting; wApp.Selection.Find.Replacement.ClearFormatting; wApp.Selection.Find.Text := docText.Find.Replacement ข้อความ :=newText; wApp.Selection.Find.Forward := True; wApp.Selection.Find.Wrap := wdFindContinue; wApp.Selection.Find.Format := False; wApp.Selection.Find.MatchCase := เท็จ; Find.MatchWildcards := False; wApp.Selection.Find.MatchSoundsLike := เท็จ; wApp.Selection.Find.MatchAllWordForms := False; wApp.Selection.Find.Execute(Replace:=wdReplaceAll); ผลลัพท์:=false; เส้น Clear; reWord.Lines.Add(newText); ลอง //ค้นหาตำแหน่งด้านหลังตำแหน่งที่จะแทนที่ wApp.Selection.Find.ClearFormatting; wApp.Selection.Find.Text := docText; wApp.Selection.Find.Replacement.Text := ''; wApp.Selection.Find.Forward := True; wApp.Selection.Find.Wrap := wdFindContinue; .Find.Format := False; wApp.Selection.Find.MatchCase := เท็จ; wApp.Selection.Find.MatchWholeWord := False; wApp.Selection.Find.MatchByte := True; wApp.Selection.Find.MatchWildcards := เท็จ; MatchAllWordForms := False; wApp.Selection.Find.Execute; wApp.Selection.MoveRight(wdCharacter,1); //เริ่มแทรกทีละบรรทัดสำหรับ i:=0 ถึง reWord.Lines.Count-1 เริ่ม // แทรกบรรทัดปัจจุบัน wApp.Selection.InsertAfter(reWord.Lines[i ]) ; // ยกเว้นบรรทัดสุดท้าย ให้เพิ่มบรรทัดใหม่โดยอัตโนมัติหาก i<reWord.Lines.Count-1 แล้วตามด้วย wApp.Selection.InsertAfter(#13); //ลบเครื่องหมายแทนที่ wApp.Selection.Find.ClearFormatting; wApp.Selection.Find.Replacement.ClearFormatting; wApp.Selection.Find.Text := docText; .Selection.Find.Forward := True; wApp.Selection.Find.Wrap := wdFindContinue; wApp.Selection.Find.Format := False; wApp.Selection.Find.MatchCase := False; wApp.Selection.Find.MatchWord := จริง; MatchWildcards := False; wApp.Selection.Find.MatchSoundsLike := เท็จ; wApp.Selection.Find.MatchAllWordForms := False; wApp.Selection.Find.Execute(แทนที่:=wdReplaceAll); { ฟังก์ชั่น: พิมพ์ เนื้อหาที่แสดงโดย TDBGridEh ในปัจจุบัน ตามรูปแบบและเนื้อหาของตัวควบคุม TDBGridEh ตาราง Word จะ ถูกสร้างขึ้นโดยอัตโนมัติที่ บุ๊กมาร์ก sBookMark ในเอกสาร ปัจจุบันสามารถรองรับการจัดตำแหน่งเซลล์ ชื่อหลายบรรทัด (two บรรทัด) ผลรวมด้านล่าง และคุณสมบัติอื่นๆ sBookMark : Word ชื่อของบุ๊กมาร์กที่จะแทรกลงในตาราง } ฟังก์ชัน PrnWordTable(var dbG:TDBGridEh;sBookMark:String=''):boolean;var iCol,iLine,i,j,k:Integer; wTable,wRange:Variant; iRangeEnd:longint; iGridLine,iTitleLine:Integer; getTextDisplay:บูลีน; จำนวนเต็ม;lastTitle:String;begin ผลลัพธ์:=false; ลอง //คำนวณจำนวนคอลัมน์ในตาราง (ไม่รวมคอลัมน์ที่ซ่อนอยู่) iTitleLine:=1; //ใช้ค่าเริ่มต้นเป็น 1 iCol:=0; เริ่มต้น if dbG.Columns[i].Visible จากนั้นเริ่มต้น iCol:=iCol+1; end; //คำนวณจำนวนแถวในตาราง (ไม่รวมคอลัมน์ที่ซ่อนอยู่) ถ้า dbG.DataSource.DataSet.Active จากนั้น iLine:=dbG.DataSource.DataSet.RecordCount มิฉะนั้น iLine:=0; iGridLine:=iLine+iTitleLine+dbG.FooterRowCount; //วางตำแหน่งจุดแทรกถ้า sBookMark='' จากนั้นเริ่มต้น // ในส่วนท้ายของเอกสาร iRangeEnd:=wDoc.Range.End-1; ถ้า iRangeEnd<0 แล้ว iRangeEnd:=0; wRange:=wDoc.Range(iRangeEnd,iRangeEnd); //ที่บุ๊กมาร์ก wDoc.Range.Goto(wdGoToBookmark,,,sBookMark); เพิ่ม (wRange, iGridLine, iCol); wTable.Columns.AutoFit; // แถวชื่อเรื่อง k:=1; j:=1 ถึง dbG.Columns.Count Do start if dbG.Columns[j-1].Visible จากนั้น start if dbG.UseMultiTitle จากนั้น start titleList:=strSplit(dbG.Columns[j-1].Title.Caption,' |'); wTable.Cell(1,k).Range.InsertAfter(titleList.Strings[0]); wTable.Cell(1,k).Range.InsertAfter(dbG.Columns[j-1].Title.Caption); //ตั้งค่าการจัดตำแหน่งเซลล์หาก dbG.Columns[j-1].Title.Alignment=taCenter แล้วตามด้วย wTable Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphCenter มิฉะนั้น ถ้า dbG.Columns[j-1].Title.Alignment=taRightJustify แล้ว wTable.Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphRight อย่างอื่นถ้า dbG.Columns[j-1].Title.Alignment=taLeftJustify แล้ว wTable.Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphJustify; k:=k+1; end; //กรอกในแต่ละแถวถ้า iLine>0 แล้วเริ่ม dbG.DataSource.dataset.DisableControls; . DataSource.DataSet.First; สำหรับ i:=1 ถึง iLine เริ่ม k:=1; dbG.Columns.Count Do start if dbG.Columns[j-1].Visible then start if dbG.Columns[j-1].FieldName<>'' ดังนั้น //หลีกเลี่ยงข้อผิดพลาดเนื่องจากคอลัมน์ว่างเริ่มต้น //หากคอลัมน์ หากคุณมีฟังก์ชันการแสดงผลการจัดรูปแบบของคุณเอง ให้เรียกใช้ฟังก์ชันการแสดงผลเพื่อรับสตริงการแสดงผล getTextText:=''; Assigned(dbG.DataSource.DataSet.FieldByName(dbG.Columns[j-1].FieldName).OnGetText) จากนั้นเริ่มต้น dbG.DataSource.DataSet.FieldByName(dbG.Columns[j-1].FieldName).OnGetText(dbG.DataSource.DataSet.FieldByName(dbG.Columns[j-1].FieldName),getTextText,getTextDisplay); wTable.Cell(i+iTitleLine,k).Range.InsertAfter(getTextText); end else start //ใช้เนื้อหาฐานข้อมูลเพื่อแสดง wTable.Cell(i+iTitleLine,k).Range.InsertAfter(dbG.DataSource.DataSet.FieldByName ( dbG.Columns[j-1].FieldName).AsString); สิ้นสุด;