Search code examples
visual-foxprofoxpro

How to convert visual foxpro 6 report to word


I have used following code to show a report.

select mem_no,com_name,owner,owner_cate,iif(empty(photo),"c:\edrs\memphoto\void.JPG",iif(file(photo),photo,"c:\edrs\memphoto\void.JPG")) as photo from own1  into curs own

REPO FORM c:\edrs\reports\rptsearch.frx TO PRINT PREVIEW NOCONS

Here rptsearch.frx contains some image. The following code export data to excel except image.

COPY TO "c:\documents and settings\administrator\desktop\a.xls" TYPE XLS

In case of image it shows only the path name. Now I need to know how I can convert this report in word so that I can have the images in the word report.


Solution

  • It looks like that you are creating a simple list with pictures. One of the easiest ways to do that is to use automation. ie:

    Select mem_no,com_name,owner,owner_cate,;
        iif(Empty(photo) Or !File(photo),"c:\edrs\memphoto\void.JPG",photo) As photo ;
        from own1  ;
        into Curs crsData ;
        nofilter
    
    #Define wdWord9TableBehavior 1
    #Define wdAutoFitWindow 2
    #Define wdStory 6
    #Define wdCollapseEnd 0
    #Define wdCellAlignVerticalCenter 1
    #Define CR Chr(13)
    
    Local Array laCaptions[5]
    laCaptions[1] = 'Mem No'
    laCaptions[2] = 'Com Name'
    laCaptions[3] = 'Owner'
    laCaptions[4] = 'Owner Cate'
    laCaptions[5] = 'Photo'
    
    Local nRows, nCols, ix
    nRows = Reccount('crsData')+1
    nCols = Fcount('crsData')+1
    
    oWord = Createobject('Word.Application')
    With m.oWord
        oDocument = .Documents.Add
        With m.oDocument.Tables.Add( m.oWord.Selection.Range, m.nRows, m.nCols)
            .BorderS.InsideLineStyle = .F.
            .BorderS.OutsideLineStyle = .F.
    
            For ix=1 To Alen(laCaptions)
                **** Add captions *****
                .Cell(1,m.ix).Range.InsertAfter( laCaptions[m.ix] )
            Endfor
    
            Select crsData
            Scan
                For ix=1 To Fcount()-1 && last one is photo path
                    **** Add values to the different cells *****
                    .Cell(Recno()+1,m.ix).Range.InsertAfter( Eval(Field(m.ix)) )
                Endfor
                lcPhoto = crsData.photo
                If File(m.lcPhoto) && Add photo if any
                    oDocument.InlineShapes.AddPicture( m.lcPhoto, .T., .T.,;
                        .Cell(Recno()+1,Fcount()).Range)
                Endif
                .Rows(Recno()+1).Cells.VerticalAlignment = wdCellAlignVerticalCenter
            Endscan
        Endwith
    
        .Visible = .T.
    Endwith
    

    However, sending data to word this way would suffer from performance if you have many rows. You can use this for small data like an employee table or so. With larger data, instead of using automation, you could simply create an HTML document and word would open an HTML document.