Referencia de la solución Delphi + Word . Estas son varias funciones que hice durante el proyecto. Vi que todos estaban haciendo preguntas sobre Word. Ahora sácalo y compártelo con todos. (Espero que algunos amigos puedan agregar nuevas funciones, o convertirlas en paquetes o bibliotecas, etc., para que sea más conveniente para todos su uso. Yo no tengo tiempo, jaja) Antes de usarlo, cree un archivo WORD vacío como plantilla según sus necesidades. En la plantilla se configuran varios formatos y texto en el archivo. Además, el parámetro de PRnWordTable es un control de tipo TDBGridEh, que se toma de Ehlib2.6. La función shFileCopy (usada para copiar archivos) y la función guiInfo (usada para mostrar un cuadro de mensaje) también las escribí yo mismo. También se adjuntan códigos. El código de muestra es el siguiente: Funciones de finalización de código: 1. Reemplace el texto "#TITLE#" en la plantilla de impresión con "Código de demostración 1" 2. E inserte el contenido que muestra actualmente el control DBGridEh1 al final del documento 3. Inserte una línea en blanco en al final del documento 4. Inserte una nueva línea de texto al final del documento 5. Elimine las líneas en blanco del documento si PrnWordBegin('C:/Print template.DOC','C:/Target file 1.DOC ') entonces comienza PrnWordReplace('#TITLE#','Código de demostración 1'); PrnWordTable(DBGridEh1); PrnWordInsert(''); PrnWordInsert('Esta es una nueva línea de texto'); p ',true); PrnWordSave; final; el código fuente es el siguiente: // Impresión de palabras (parte de declaración) wDoc,wApp:Variante; función PrnWordBegin(tempDoc,docName:String):boolean; función PrnWordReplace(docText,newText:String;bSimpleReplace:boolean=false):boolean; función PrnWordInsert(lineText:String;bNewLine:boolean=true): booleano;sobrecarga; función PrnWordInsert(var imgInsert:TImage;sBookMark:String=''):boolean;sobrecarga; función PrnWordInsert(var chartInsert:TChart;sBookMark:String=''):boolean;sobrecarga; función PrnWordTable(var dbG:TDBGridEh;sBookMark:String='' ):boolean; procedimiento PrnWordSave; procedimiento PrnWordEnd; // Impresión de palabras (parte de implementación) { Función: crear un nuevo archivo de destino docName basado en el archivo de plantilla tempDoc y abrir el archivo } function PrnWordBegin(tempDoc,docName:String):boolean;begin result:=false //Copiar plantilla si tempDoc<>'' entonces si; no shFileCopy(tempDoc, docName) luego salga; //Conéctese a Word, intente con wApp:=CreateOleObject('Word.application'); excepto guiInfo('Instale Microsoft Word primero.'); salir; terminar; intentar //Abrir si tempDoc='' luego comenzar //Crear un nuevo documento wDoc:=wApp.Document.Add; wDoc.SaveAs(docName); Documentos. Open(docName); end; excepto guiInfo('Error al abrir la plantilla, verifique si la plantilla es correcta. '); wApp.Quit; exit; wApp.Visible:=true; result:=true;end; { Función: usar newText para reemplazar el contenido de docText : cuando es verdadero, solo se realiza un reemplazo simple, cuando es falso, el nuevo el texto está ajustado Procesando } función PrnWordReplace(docText,newText:String;bSimpleReplace:boolean=false):boolean;var i:Integer;begin if bSimpleReplace. luego comience // Procesamiento simple, realice directamente la operación de reemplazo. Pruebe wApp.Selection.Find.ClearFormatting; wApp.Selection.Find.Replacement.ClearFormatting; Texto :=nuevoTexto; wApp.Selection.Find.Forward := Verdadero; wApp.Selection.Find.Wrap := wdFindContinue; wApp.Selection.Find.Format:= Falso; wApp.Selection.Find.MatchCase:= Falso; wApp.Selection.Find.MatchWholeWord:= verdadero; Find.MatchWildcards:= Falso; wApp.Selection.Find.MatchSoundsLike:= Falso; wApp.Selection.Find.MatchAllWordForms:= False; wApp.Selection.Find.Execute(Replace:=wdReplaceAll); resultado:=true; excepto resultado:=false; Lines.Clear; reWord.Lines.Add(newText); intente // Ubique detrás de la posición a reemplazar wApp.Selection.Find.ClearFormatting; wApp.Selection.Find.Text := docText; wApp.Selection.Find.Replacement.Text := ''; wApp.Selection.Find.Forward := Verdadero; .Find.Format := Falso; wApp.Selection.Find.MatchCase := Falso; wApp.Selection.Find.MatchWholeWord:= Falso; wApp.Selection.Find.MatchByte:= Verdadero; wApp.Selection.Find.MatchWildcards:= Falso; MatchAllWordForms: = Falso; wApp.Selection.Find.Execute; wApp.Selection.MoveRight(wdCharacter,1); //Comience a insertar línea por línea para i:=0 para reWord.Lines.Count-1 Comenzar //Inserte la línea actual wApp.Selection.InsertAfter(reWord.Lines[i] ]) ; //Excepto por la última línea, agrega automáticamente nuevas líneas si i<reWord.Lines.Count-1 luego wApp.Selection.InsertAfter(#13); //Eliminar la marca de reemplazo wApp.Selection.Find.ClearFormatting; wApp.Selection.Find.Replacement.ClearFormatting; wApp.Selection.Find.Text := docText; .Selection.Find.Forward := Verdadero; wApp.Selection.Find.Wrap := wdFindContinue; wApp.Selection.Find.Format:= Falso; wApp.Selection.Find.MatchCase:= Falso; wApp.Selection.Find.MatchWholeWord:= verdadero; wApp.Selection.Find.MatchByte:= Verdadero; MatchWildcards := Falso; wApp.Selection.Find.MatchSoundsLike := Falso; wApp.Selection.Find.MatchAllWordForms:= Falso; wApp.Selection.Find.Execute(Replace:=wdReplaceAll); resultado:=verdadero excepto resultado:=falso; { Función: imprime el contenido que TDBGridEh muestra actualmente . Según el formato y el contenido del control TDBGridEh , se genera automáticamente una tabla de Word en el marcador sBookMark del documento. Actualmente, puede admitir alineación de celdas y títulos de varias líneas (dos). líneas), totales inferiores y otras características sBookMark : Word El nombre del marcador que se insertará en la tabla } function PrnWordTable(var dbG:TDBGridEh;sBookMark:String=''):boolean;var. iCol,iLine,i,j,k:Integer; wTable,wRange:Variant; iRangeEnd:longint; iGridLine,iTitleLine:Integer; getTextText:String;getTextDisplay:boolean;titleSplit,titleCol:Integer;lastTitleSplit,SubTitle: Entero; último título: cadena; comienzo result:=false; try //Calcula el número de columnas en la tabla (excluyendo las columnas ocultas) iTitleLine:=1; //Siempre es 1 por defecto iCol:=0 para i:=0 a dbG.Columns.Count-1; Empiece si dbG.Columns[i].Visible luego comience iCol:=iCol+1 end //Calcule el número de filas en la tabla (excluyendo las columnas ocultas) if; dbG.DataSource.DataSet.Active luego iLine:=dbG.DataSource.DataSet.RecordCount else iLine:=0; iGridLine:=iLine+iTitleLine+dbG.FooterRowCount //Coloque el punto de inserción si sBookMark='' luego comience // En Al final del documento iRangeEnd:=wDoc.Range.End-1 si iRangeEnd<0 entonces; iRangeEnd:=0; wRange:=wDoc.Range(iRangeEnd,iRangeEnd); fin si no comenzar //En el marcador wTable:=wDoc.Tables. Add(wRange,iGridLine,iCol); wTable.Columns.AutoFit; //Fila de título k:=1; j:=1 a dbG.Columns.Count Empiece si dbG.Columns[j-1].Visible, luego comience si dbG.UseMultiTitle y luego comience 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); //Establece la alineación de celdas si dbG.Columns[j-1].Title.Alignment=taCenter y luego wTable. Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphCenter si no dbG.Columns[j-1].Title.Alignment=taRightJustify luego wTable.Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphRight si no dbG.Columns[j-1].Title.Alignment=taLeftJustify entonces wTable.Cell(1,k).Range.ParagraphFormat.Alignment:=wdAlignParagraphJustify; k:=k+1; end; //Complete cada fila si iLine>0 luego comience dbG.DataSource.dataset.DisableControls; DataSource.DataSet.First; para i:=1 a iLine Comience k:=1 para j:=1 a. dbG.Columns.Count Empiece si dbG.Columns[j-1].Visible y luego comience si dbG.Columns[j-1].FieldName<>'' luego //Evita errores debido a columnas vacías comienza //Si la columna Si tiene su propia función de visualización de formato, llame a la función de visualización para obtener la cadena de visualización getTextText:=''; Asignado (dbG.DataSource.DataSet.FieldByName(dbG.Columns[j-1].FieldName).OnGetText) y luego comience 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 fin si no comenzar //Usar el contenido de la base de datos para mostrar wTable.Cell(i+iTitleLine,k).Range.InsertAfter(dbG.DataSource.DataSet.FieldByName); ( dbG.Columns[j-1].FieldName).AsString fin;