Référence de la solution Delphi + Word . Ce sont plusieurs fonctions que j'ai créées au cours du projet. J'ai vu que tout le monde se posait des questions sur Word. Maintenant, sortez-le et partagez-le avec tout le monde. (J'espère que certains amis pourront ajouter de nouvelles fonctions, ou les transformer en packages ou bibliothèques, etc., pour que tout le monde puisse les utiliser plus facilement. Je n'ai pas le temps moi-même, haha) Avant utilisation, créez un fichier WORD vide comme modèle selon vos besoins. Dans le modèle Différents formats et textes sont définis dans le fichier. De plus, le paramètre de PRnWordTable est un contrôle de type TDBGridEh, qui est extrait d'Ehlib2.6. La fonction shFileCopy (utilisée pour copier des fichiers) et la fonction guiInfo (utilisée pour afficher une boîte de message) sont également écrites par moi-même, et le les codes sont également joints. L'exemple de code est le suivant : Fonctions de complétion de code : 1. Remplacez le texte "#TITLE#" dans le modèle d'impression par "Demo Code 1" 2. Et insérez le contenu actuellement affiché par le contrôle DBGridEh1 à la fin du document 3. Insérez une ligne vierge à la fin du document 4. Insérer une nouvelle ligne de texte à la fin du document 5. Supprimer les lignes vides dans le document if PrnWordBegin('C:/Print template.DOC','C:/Target file 1.DOC ') puis commencez PrnWordReplace('#TITLE#','Code démo 1'); PrnWordTable(DBGridEh1); PrnWordInsert(''); PrnWordInsert('Ceci est une nouvelle ligne de texte'); p ',true); PrnWordSave; end; Le code source est le suivant : // Impression de mots (partie déclaration) wDoc,wApp:Variant; fonction PrnWordBegin(tempDoc,docName:String):boolean; fonction PrnWordReplace(docText,newText:String;bSimpleReplace:boolean=false):boolean; fonction PrnWordInsert(lineText:String;bNewLine:boolean=true) : booléen;surcharge; fonction PrnWordInsert(var imgInsert:TImage;sBookMark:String=''):booléen;surcharge; fonction PrnWordInsert(var chartInsert:TChart;sBookMark:String=''):booléen;surcharge; fonction PrnWordTable(var dbG:TDBGridEh;sBookMark:String='' ):boolean; procédure PrnWordSave; procédure PrnWordEnd //Impression de mots (partie implémentation) { Fonction : Créez un nouveau fichier cible docName basé sur le fichier modèle tempDoc et ouvrez le fichier } function PrnWordBegin(tempDoc,docName:String):boolean;begin result:=false; //Copier le modèle if tempDoc<>'' then if pas shFileCopy(tempDoc, docName) puis quittez ; //Connectez-vous à Word, essayez wApp:=CreateOleObject('Word.application'); sauf guiInfo('Veuillez d'abord installer Microsoft Word.'); exit; end; try //Ouvrir if tempDoc='' then start //Créer un nouveau document wDoc:=wApp.Document.Add; wDoc.SaveAs(docName); Documents. Open(docName); end; except guiInfo('Échec de l'ouverture du modèle, veuillez vérifier si le modèle est correct. '); wApp.Quit; exit; wApp.Visible:=true; result:=true;end; { Fonction : utiliser newText pour remplacer le contenu de docText bSimpleReplace : lorsque true, seul un remplacement simple est effectué . le texte est enveloppé. Traitement } function PrnWordReplace(docText,newText:String;bSimpleReplace:boolean=false):boolean;var i:Integer;begin if bSimpleReplace. puis commencez //Traitement simple, effectuez directement l'opération de remplacement try wApp.Selection.Find.ClearFormatting; wApp.Selection.Find.Replacement.ClearFormatting; wApp.Selection.Find.Text := docText; Texte :=nouveauTexte; wApp.Selection.Find.Forward := True; wdFindContinue; wApp.Selection.Find.Format := False; wApp.Selection.Find.MatchCase := False; Find.MatchWildcards := Faux; wApp.Selection.Find.MatchSoundsLike := Faux; wApp.Selection.Find.MatchAllWordForms := False; wApp.Selection.Find.Execute(Replace:=wdReplaceAll); result:=true; except result:=false; exit; Lines. Clear; reWord.Lines.Add(newText); try //Localiser derrière la position à remplacer wApp.Selection.Find.ClearFormatting; wApp.Selection.Find.Text := docText; wApp.Selection.Find.Replacement.Text := ''; wApp.Selection.Find.Forward := True; .Find.Format := Faux; wApp.Selection.Find.MatchCase := Faux; wApp.Selection.Find.MatchWholeWord := False; wApp.Selection.Find.MatchByte := True; wApp.Selection.Find.MatchWildcards := False; MatchAllWordForms := False; wApp.Selection.MoveRight(wdCharacter,1); //Commencer à insérer ligne par ligne pour i:=0 dans reWord.Lines.Count-1 Docommencer //Insérer la ligne actuelle wApp.Selection.InsertAfter(reWord.Lines[i ]) ; //Sauf la dernière ligne, ajoute automatiquement de nouvelles lignes si i<reWord.Lines.Count-1 then wApp.Selection.InsertAfter(#13); //Supprimer la marque de remplacement 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.MatchWholeWord := vrai; MatchWildcards := Faux; wApp.Selection.Find.MatchSoundsLike := Faux; wApp.Selection.Find.MatchAllWordForms := False; wApp.Selection.Find.Execute(Replace:=wdReplaceAll result:=true; { Fonction : Imprimer le contenu actuellement affiché par TDBGridEh. En fonction du format et du contenu du contrôle TDBGridEh , un tableau Word est automatiquement généré au niveau du signet sBookMark dans le document. Actuellement, il peut prendre en charge l'alignement des cellules, les titres multilignes (deux. lignes), totaux inférieurs et autres fonctionnalités. sBookMark : Word Le nom du signet à insérer dans le tableau } function PrnWordTable(var dbG:TDBGridEh;sBookMark:String=''):boolean;var iCol,iLine,i,j,k:Integer; wTable,wRange:Variant; iRangeEnd:longint; iGridLine,iTitleLine:Integer;getTextDisplay:boolean;titleList:TStringList;titleSplit,titleCol:Integer;lastTitleSplit,SubTitle : Entier;dernierTitre:Chaîne;début result:=false; try //Calculer le nombre de colonnes dans le tableau (à l'exclusion des colonnes masquées) iTitleLine:=1; //Toujours par défaut à 1 iCol:=0; Do start if dbG.Columns[i].Visible then start iCol:=iCol+1 end; //Calculer le nombre de lignes dans le tableau (hors colonnes masquées) if; dbG.DataSource.DataSet.Active then iLine:=dbG.DataSource.DataSet.RecordCount else iLine:=0; iGridLine:=iLine+iTitleLine+dbG.FooterRowCount; //Positionnez le point d'insertion si sBookMark='' alors commencez // En fin de document iRangeEnd:=wDoc.Range.End-1 if iRangeEnd<0 then iRangeEnd:=0; wRange:=wDoc.Range(iRangeEnd,iRangeEnd); end else start //Au signet wRange:=wDoc.Range.Goto(wdGoToBookmark,,,sBookMark); Add(wRange,iGridLine,iCol); wTable.Columns.AutoFit; //Titre de la ligne k:=1; j:=1 à dbG.Columns.Count Commencez si dbG.Columns[j-1].Visible puis commencez si dbG.UseMultiTitle puis commencez 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); //Définit l'alignement des cellules si dbG.Columns[j-1].Title.Alignment=taCenter alors wTable. Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphCenter sinon si dbG.Columns[j-1].Title.Alignment=taRightJustify puis wTable.Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphRight sinon si dbG.Columns[j-1].Title.Alignment=taLeftJustify alors wTable.Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphJustify; k:=k+1; end; //Remplissez chaque ligne si iLine>0 puis commencez dbG.DataSource.dataset.DisableControls; DataSource.DataSet.First; pour i:=1 à iLine Do start k:=1 pour j:=1 à . dbG.Columns.Count Commencez si dbG.Columns[j-1].Visible puis commencez si dbG.Columns[j-1].FieldName<>'' then //Évitez les erreurs dues aux colonnes vides commencez //Si la colonne Si vous disposez de votre propre fonction d'affichage de formatage, appelez la fonction d'affichage pour obtenir la chaîne d'affichage getTextText:=''; Assigned(dbG.DataSource.DataSet.FieldByName(dbG.Columns[j-1].FieldName).OnGetText) puis commencez 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 //Utiliser le contenu de la base de données pour afficher wTable.Cell(i+iTitleLine,k).Range.InsertAfter(dbG.DataSource.DataSet.FieldByName ( dbG.Columns[j-1].FieldName).AsString fin ;