Referência da solução Delphi + Word Essas são diversas funções que fiz durante o projeto. Vi que todo mundo está fazendo perguntas sobre o Word. Agora retire e compartilhe com todos. (Espero que alguns amigos possam adicionar novas funções ou transformá-las em pacotes ou bibliotecas, etc., para torná-las mais convenientes para todos usarem. Eu não tenho tempo, haha) Antes de usar, crie um arquivo WORD vazio como modelo de acordo com suas necessidades No modelo Vários formatos e textos são definidos no arquivo. Além disso, o parâmetro PRnWordTable é um controle do tipo TDBGridEh, obtido de Ehlib2.6. A função shFileCopy (usada para copiar arquivos) e a função guiInfo (usada para exibir uma caixa de mensagem) também foram escritas por mim e pelo. códigos também estão anexados. O código de exemplo é o seguinte: Funções de autocompletar código: 1. Substitua o texto "#TITLE#" no modelo de impressão por "Demo Code 1" 2. E insira o conteúdo atualmente exibido pelo controle DBGridEh1 no final do documento 3. Insira uma linha em branco no no final do documento 4. Insira uma nova linha de texto no final do documento 5. Remova as linhas em branco do documento if PrnWordBegin('C:/Print template.DOC','C:/Target file 1.DOC ') então comece PrnWordReplace('#TITLE#','Código de demonstração 1'); PrnWordTable('^p^p','^); p ',true); PrnWordSave; end ; // Impressão do Word (parte da declaração) wDoc,wApp:Variante; função PrnWordBegin(tempDoc,docName:String):boolean; função PrnWordReplace(docText,newText:String;bSimpleReplace:boolean=false):boolean; booleano;sobrecarga;função PrnWordInsert(var imgInsert:TImage;sBookMark:String=''):boolean;sobrecarga; função PrnWordInsert(var chartInsert:TChart;sBookMark:String=''):boolean;sobrecarga;função PrnWordTable(var dbG:TDBGridEh;sBookMark:String='' ):boolean; procedimento PrnWordSave; procedimento PrnWordEnd; // Impressão do Word (parte de implementação) { Função: Crie um novo arquivo de destino docName com base no arquivo de modelo tempDoc e abra o arquivo } function PrnWordBegin(tempDoc,docName:String):boolean;begin result:=false; //Copiar modelo if tempDoc<>'' then if; não shFileCopy(tempDoc, docName) então saia; //Conecte-se ao Word, tente wApp:=CreateOleObject('Word.application'); exceto guiInfo('Por favor, instale o Microsoft Word primeiro.'); exit; end; try //Abrir se tempDoc='' então começar //Cria um novo documento wDoc:=wApp.Document.Add; Documents. Open(docName); end except guiInfo('Falha ao abrir o modelo, verifique se o modelo está correto. ') ; wApp.Quit; exit end; wApp.Visible : =true; result:=true;end ; quando falso , o novo o texto é quebrado. Processando } função PrnWordReplace(docText,newText:String;bSimpleReplace:boolean=false):boolean;var i:Integer;begin if bSimpleReplace então comece //processamento simples, execute diretamente a operação de substituição tente wApp.Selection.Find.ClearFormatting; wApp.Selection.Find.Replacement.ClearFormatting; Texto :=novoTexto; wApp.Selection.Find.Forward := Verdadeiro; wdFindContinue;wApp.Selection.Find.Format := False; Find.MatchWildcards := Falso; wApp.Selection.Find.MatchAllWordForms := False; wApp.Selection.Find.Execute(Replace:=wdReplaceAll); Lines.Clear; reWord.Lines.Add(newText); try //Localize atrás da posição a ser substituída wApp.Selection.Find.ClearFormatting; wApp.Selection.Find.Text := docText; wApp.Selection.Find.Replacement.Text := ''; wApp.Selection.Find.Forward := True; .Find.Format := Falso; wApp.Selection.Find.MatchCase := Falso; wApp.Selection.Find.MatchWholeWord := Falso; wApp.Selection.Find.MatchByte := Verdadeiro; wApp.Selection.Find.MatchWildcards := Falso; MatchAllWordForms:=Falso; wApp.Selection.MoveRight(wdCharacter,1); //Iniciar a inserção linha por linha para i:=0 para reWord.Lines.Count-1 Begin //Inserir a linha atual wApp.Selection.InsertAfter(reWord.Lines[i ]) ; //Exceto a última linha, adicione automaticamente novas linhas se i<reWord.Lines.Count-1 then wApp.Selection.InsertAfter(#13); //Excluir a marca de substituição wApp.Selection.Find.ClearFormatting; wApp.Selection.Find.Replacement.ClearFormatting; wApp.Selection.Find.Text := wApp.Selection.Find.Replacement.Text := ''; .Selection.Find.Forward := Verdadeiro; wApp.Selection.Find.Wrap := wdFindContinue; wApp.Selection.Find.Format:= Falso; wApp.Selection.Find.MatchCase:= Falso; wApp.Selection.Find.MatchWholeWord:= verdadeiro; MatchWildcards := Falso; wApp.Selection.Find.MatchAllWordForms := False; wApp.Selection.Find.Execute(Replace:=wdReplaceAll); { Função: Imprimir o conteúdo atualmente exibido por TDBGridEh Com base no formato e conteúdo do controle TDBGridEh , uma tabela do Word é gerada automaticamente no marcador sBookMark no documento. Atualmente, ela pode suportar alinhamento de células e títulos de várias linhas (dois. linhas), totais inferiores e outros recursos. sBookMark : Word O nome do marcador a ser inserido na tabela } function PrnWordTable(var dbG:TDBGridEh;sBookMark:String=''):boolean;var iCol,iLine,i,j,k:Integer;wTable,wRange:Variant;iRangeEnd:longint;iTitleLine:Integer;getTextDisplay:boolean;titleSplit,titleCol:Integer; Inteiro;últimoTítulo:String;início result:=false; try //Calcula o número de colunas na tabela (excluindo colunas ocultas) iTitleLine:=1; //Sempre padrão para 1 iCol:=0 para i:=0 para dbG.Columns.Count-1; Comece if dbG.Columns[i].Visible então comece iCol:=iCol+1; dbG.DataSource.DataSet.Active then iLine:=dbG.DataSource.DataSet.RecordCount else iLine:=0;=iLine+iTitleLine+dbG.FooterRowCount //Posicione o ponto de inserção se sBookMark='' então comece // No final do documento iRangeEnd:=wDoc.Range.End-1; iRangeEnd:=0; wDoc.Range(iRangeEnd,iRangeEnd); end else start //No marcador wRange:=wDoc.Tables. Add(wRange,iGridLine,iCol); wTable.Columns.AutoFit; //Título da linha k:=1; j:=1 para dbG.Columns.Count Comece se dbG.Columns[j-1].Visible então comece se dbG.UseMultiTitle então comece 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); //Defina o alinhamento da célula se dbG.Columns[j-1].Title.Alignment=taCenter então wTable. Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphCenter senão se dbG.Columns[j-1].Title.Alignment=taRightJustify então wTable.Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphRight else se dbG.Columns[j-1].Title.Alignment=taLeftJustify então wTable.Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphJustify; k:=k+1; //Preencha cada linha se iLine>0 então comece dbG.DataSource.dataset.DisableControls; . DataSource.DataSet.First; para i:=1 para iLine Comece k:=1 para j:=1 para dbG.Columns.Count Comece se dbG.Columns[j-1].Visible então comece se dbG.Columns[j-1].FieldName<>'' then //Evite erros devido a colunas vazias comece //Se a coluna Se você tiver sua própria função de exibição de formatação, chame a função de exibição para obter a string de exibição getTextText:='' if Atribuído(dbG.DataSource.DataSet.FieldByName(dbG.Columns[j-1].FieldName).OnGetText) então comece 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 Begin //Use o conteúdo do banco de dados para exibir wTable.Cell(i+iTitleLine,k).Range.InsertAfter(dbG.DataSource.DataSet.FieldByName ( dbG.Columns[j-1].FieldName).AsString);