Ken,
I've kept a distance from Word automation after hearing of compatibility
headaches, but I couldn't resist in a few cases. Just took at look and I see
that in these cases I'm creating a new doc, and none involves a reference to
an existing file (new/empty or prev existing) for the operation.
FWIW, two examples follow below.
Bill
A small example
IF ISNULL(THISFORM.oWord)
THISFORM.oWord=CREATEOBJECT("Word.Application")
ENDIF
oDoc=THISFORM.oWord.Documents.Add()
THISFORM.simplECHART1.editCopy()
THISFORM.oWord.Selection.PasteSpecial(.F., .F., 0, .F., 3)
oDoc.PrintOut
oDoc.Close(0)
RELEASE oDoc
oDoc = .null.
A larger example, a prg that generates HTML doc for table descriptions using
Word
**********************************************************************
* Program/Method....: TABLEDOC.PRG
* Purpose....: The DBC Documentation Tool
* Uses WORD to generate an HTML doc file
* Uses the FIELDS table to obtain field descriptions
**********************************************************************
* based on: http://www.inquiry.com/techtips/vfox_pro/10min/10min0600.asp
* This tool creates a Microsoft Word file that documents a VFP database.
*!* When you run the code below, you are prompted to choose a DBC file
to
*!* document. After you choose a DBC file, it creates a Word file with
the
*!* same name but with the .doc extension. This file contains a Word
table
*!* for every VFP table in the database. The output looks like the
following:
PARAMETERS whattodoc
PUBLIC tzipname,tsgname,tzipfname
public targetf,tzipname,caliasb,ccurdir
targetf = "c:\vls\bldlib\cl\rec_formats"
tzipfname = "c:\vls\bldlib\cl\samplib\recformats.zip"
caliasb = ALIAS()
ccurdir = CURDIR()
q_ans = MESSAGEBOX("This procedure"+CHR(13)+CHR(13)+ ;
"1. Requires MS Word"+CHR(13)+ ;
"2. Can be restarted any time"+CHR(13)+ ;
"3. Creates record format HTML files for the input table"+CHR(13)+ ;
"4. Places HTML files -> C:\VLS\BLDLIB\CL\REC_FORMATS"+CHR(13)+ ;
"5. And ZIPPED -> C:\VLS\BLDLIB\CL\SAMPLIB\RECFORMATS.ZIP"+CHR(13)+ ;
"Proceed?",4,m_product)
IF q_ans <> 6
RETURN
ENDIF
=MESSAGEBOX("IMPORT the saved HTML file into the RoboHelp topic, ;
and then in Robohelp select TOOLS-> OPTIONS and select USE DEFAULT ;
EDITOR instead of AUTO SELECT so RoboHelp can work with this WORD ;
created file",0,m_product)
IF EMPTY(whattodoc)
whattodoc = ' '
ENDIF
DO case
CASE ATC('allprofs',whattodoc) <> 0
DO doc_all_profs_tables
CASE ATC('dbc',whattodoc) <> 0
DO docdbc WITH whattodoc
CASE ATC('dbf',whattodoc) <> 0
DO docdbf WITH whattodoc
OTHERWISE
DO docdbf WITH whattodoc
endcase
CD (ccurdir)
IF !EMPTY(caliasb)
SELECT (caliasb)
endif
release targetf,tzipname,caliasb,ccurdir
RETURN
*
---------------------------------------------------------------------------
* Document all DBFs in PROFS ... creating an Word generred HTML file
* with the structure and field descriptions for the DBF
*
---------------------------------------------------------------------------
procedure doc_all_profs_tables
LOCAL clnames
cd (z_profs) && get into source files PROFS folder
dimension clnames(500)
prof_files = adir(clnames,"*.dbf")
IF prof_files = 0
=MESSAGEBOX("No DBFs found in PROFS",0,m_product)
RETURN
ENDIF
* =asort(clnames,aelement(clnames,1,1),0,1) && sort into
descending order
* m_iver = clnames(1) && e.g. ZC010028.EXE
FOR n = 1 TO prof_files
DO docdbf WITH clnames(n,1)
IF z_esc
EXIT
endif
ENDFOR
* The HTML files are in the target folder
DO zipup && move result files into samplib ZIP file
STORE .f. TO z_esc
RELEASE clnames
RETURN
*
---------------------------------------------------------------------------
* Document a DBF ... create a word doc with the structure of the DBF
PROCEDURE docdbf
PARAMETERS cdbfname
#DEFINE wdToggle 9999998
#DEFINE wdCharacter 1
#DEFINE wdStory 6
#DEFINE wdMove 0
#DEFINE wdExtend 1
LOCAL lcDBCFile, loWord, loSelection, loDoc
LOCAL loTable, lnTable, lnTableCount
LOCAL ARRAY laTables[1], laFields[1]
lcDBFFile = cdbfname
IF !DIRECTORY(targetf)
MD (targetf)
ENDIF
IF EMPTY(lcdbFfile)
lcDBFFile = GETFILE("DBF", ;
"Select a DBF to Document", ;
"Select", ;
0,;
"Select a DBF to Document")
endif
IF EMPTY(lcDBFFile)
MESSAGEBOX("No Database Chosen")
RETURN
ENDIF
IF !FILE(lcdbffile)
=MESSAGEBOX(lcdbffile+" doesn't exist",0,m_product)
STORE .t. TO z_esc
RETURN
endif
*-- Fill an array with the names of
*-- the tables in the chosen DBC and
*-- then sort it by name
*!* OPEN DATABASE (lcDBCFile)
*!* lnTableCount = ADBOBJECTS(laTables,"TABLE")
*!* =ASORT(laTables,1)
loWord = CREATEOBJECT("Word.Application")
IF varTYPE(loWord) <> 'O'
=MESSAGEBOX("Unable to create an instance of Microsoft Word",0,m_product)
STORE .t. TO z_esc
RETURN
endif
loWord.Visible = .T.
loDoc = loWord.Documents.Add()
loSelection = loWord.Selection
loSelection.TypeText("Documentation for "+TRIM(lcDBFFile))
loSelection.TypeText(CHR(13))
loSelection.TypeText(CHR(13))
*!* FOR lnTable = 1 TO lnTableCount
*-- create a small header
loSelection.TypeText(CHR(13))
loSelection.TypeText("Table: ")
*-- Make the name of the table bold
*-- by toggling Bold on, typing the text,
*-- and then toggling Bold off
loSelection.Font.Bold = wdToggle
* loSelection.TypeText(laTables[lnTable])
* loSelection.TypeText(DBF())
loSelection.TypeText(cdbfname)
loSelection.Font.Bold = wdToggle
loSelection.TypeText(CHR(13))
loSelection.TypeText("Field Listing:")
loSelection.TypeText(CHR(13))
loSelection.TypeText(CHR(13))
loSelection.MoveLeft(wdCharacter,1)
*-- Open the table about to be
*-- documented and get its structural
*-- information
SELECT 0
USE (lcDBFFile) again
lnFieldCount = AFIELDS(laFields)
=ASORT(lafields)
*-- Create a Word table with the number of rows
*-- equal to the number of fields in the
*-- VFP table + 1. The extra row is for the
*-- column headers
* loTable = loDoc.Tables.Add(loSelection.Range,lnFieldCount+8,4)
loTable = loDoc.Tables.Add(loSelection.Range,lnFieldCount+1,5)
&& add 1 field for DESC
loTable.Cell(1,1).Range.Text = "Name"
loTable.Cell(1,2).Range.Text = "Description"
c2width = lotable.cell(1,2).width
lotable.cell(1,2).width = c2width * 2.2
loTable.Cell(1,3).Range.Text = "Type"
loTable.Cell(1,4).Range.Text = "Length"
loTable.Cell(1,5).Range.Text = "Dec"
* Fill in the rows of the Word table with field information
FOR lnField = 1 TO lnFieldCount
loTable.Cell(lnField+1,1).Range.Text = laFields[lnField,1]
loTable.Cell(lnField+1,2).Range.Text = getdesc(laFields[lnField,1])
&& get description
x3 = lotable.cell(lnField+1,2).width
lotable.cell(lnField+1,2).width = c2width * 2.2 && widen
desc column
loTable.Cell(lnField+1,3).Range.Text = laFields[lnField,2]
loTable.Cell(lnField+1,4).Range.Text =
ALLTRIM(STR(laFields[lnField,3]))
loTable.Cell(lnField+1,5).Range.Text =
ALLTRIM(STR(laFields[lnField,4]))
ENDFOR
* Add lines at the end of the table showing # fields, # records and today's
datetime
*!*
*!* lnfield = lnfield + 4
*!* lotable.cell(lnfield+1,1).range.text =
ALLTRIM(STR(FCOUNT(ALIAS())))+" fields"
*!* lnfield = lnfield + 1
*!* lotable.cell(lnfield+1,1).range.text =
ALLTRIM(STR(reccount(ALIAS())))+" records"
*!* lnfield = lnfield + 1
*!* lotable.cell(lnfield+1,1).range.text = 'As of '+TTOC(DATETIME())
*-- Jump to end of document
* The table is closed now. Add more stuff below the table
loSelection.MoveEnd(wdStory)
loSelection.Start = loSelection.End
loSelection.TypeText(CHR(13))
loSelection.TypeText(CHR(13))
loSelection.TypeText(ALLTRIM(STR(FCOUNT(ALIAS())))+" fields")
loSelection.TypeText(CHR(13))
loSelection.TypeText(ALLTRIM(STR(reccount(ALIAS())))+" records")
loSelection.TypeText(CHR(13))
loSelection.TypeText('As of '+TTOC(DATETIME()))
* Name .DOC file the same name as the DBF name, with an .HTM extension
* e.g. c:\vls\profs\html\comgrab.htm
lcsavedfile = ADDBS(targetf)+JUSTstem(lcdbffile)+'.htm'
* make sure file to be saved doesn't exist
IF FILE(lcsavedfile)
SET SAFETY OFF
ERASE (lcsavedfile)
SET SAFETY ON
ENDIF
* for SAVEAS doc, see http://msdn.microsoft.com/en-us/library/aa662158.aspx
loDoc.SaveAs(lcSavedFile,8) && for WORD 2000 -
can't use filtered html for some reason, but 8 (heavy html) works
* I had word 2002 on the gateway
machine, which works with 10 (smaller0
* loDoc.SaveAs(lcSavedFile,10) && 10 is filtered HTML, see
http://www.xefteri.com/articles/show.cfm?id=22
lodoc.Close
loWord.Quit()
lodoc = .null.
loword = .null.
USE
RETURN
* ----------------------------------------------------------------------
FUNCTION getdesc
PARAMETERS fieldn
LOCAL caliasb
caliasb = ALIAS()
IF !USED('theflds')
DO connect WITH 'fields'
ENDIF
IF z_esc
STORE .f. TO z_esc
RETURN '??? FIELDS table not available'
ENDIF
SELECT theflds
LOCATE FOR UPPER(TRIM(name)) == UPPER(TRIM(fieldn)) .and. !EMPTY(desc)
* .and. UPPER(TRIM(
LOCATE FOR UPPER(TRIM(name)) == UPPER(TRIM(fieldn)) .and. !EMPTY(desc)
IF FOUND()
SELECT (caliasb)
RETURN TRIM(theflds.desc)
ELSE
SELECT (caliasb)
RETURN ' ... '
ENDIF
SELECT (caliasb)
RETURN '???'
* -----------------------------------------------
PROCEDURE zipup
* Change below code to use right folders
* put result in BLDLIB\CL\SAMPLIB\xxxxxx.zip
CD (targetf) && get into target folder holding
CSV files
IF FILE(tzipfname)
SET safety OFF
ERASE (tzipfname)
SET SAFETY ON
ENDIF
* ZIP targetf "c:\vls\bldlib\cl\samplib\sampcsvs\*.csv"
* and
* move
* into tzipname "c:\vls\bldlib\cl\samplib\sampcsvs.zip"
go_lmutils.zip_using_fll(targetf,tzipfname) && zip
* Erase the CSV's and the work folder
CD (targetf)
SET safety OFF
ERASE *.htm
SET SAFETY ON
CD "c:\vls\bldlib\cl"
RD (targetf)
return
*
---------------------------------------------------------------------------
* Document a DBC ... create a word doc with the structure of
* each table in the DBC
*
----------------------------------------------------------------------------
PROCEDURE docdbc
PARAMETERS cdbcname
#DEFINE wdToggle 9999998
#DEFINE wdCharacter 1
#DEFINE wdStory 6
#DEFINE wdMove 0
#DEFINE wdExtend 1
LOCAL lcDBCFile, loWord, loSelection, loDoc
LOCAL loTable, lnTable, lnTableCount
LOCAL ARRAY laTables[1], laFields[1]
lcDBCFile = cdbcname
IF EMPTY(lcdbcfile)
lcDBCFile = GETFILE("DBC", ;
"Select a Database to Document", ;
"Select", ;
0,;
"Select a Database to Document")
endif
IF EMPTY(lcDBCFile)
MESSAGEBOX("No Database Chosen")
RETURN
ENDIF
*-- Fill an array with the names of
*-- the tables in the chosen DBC and
*-- then sort it by name
OPEN DATABASE (lcDBCFile)
lnTableCount = ADBOBJECTS(laTables,"TABLE")
=ASORT(laTables,1)
loWord = CREATEOBJECT("Word.Application")
loWord.Visible = .T.
loDoc = loWord.Documents.Add()
loSelection = loWord.Selection
loSelection.TypeText("Documentation for "+lcDBCFile)
loSelection.TypeText(CHR(13))
loSelection.TypeText(CHR(13))
FOR lnTable = 1 TO lnTableCount
*-- create a small header
loSelection.TypeText(CHR(13))
loSelection.TypeText("Table: ")
*-- Make the name of the table bold
*-- by toggling Bold on, typing the text,
*-- and then toggling Bold off
loSelection.Font.Bold = wdToggle
loSelection.TypeText(laTables[lnTable])
loSelection.Font.Bold = wdToggle
loSelection.TypeText(CHR(13))
loSelection.TypeText("Field Listing:")
loSelection.TypeText(CHR(13))
loSelection.TypeText(CHR(13))
loSelection.MoveLeft(wdCharacter,1)
*-- Open the table about to be
*-- documented and get its structural
*-- information
USE (laTables[lnTable])
lnFieldCount = AFIELDS(laFields)
*-- Create a Word table with the number of rows
*-- equal to the number of fields in the
*-- VFP table + 1. The extra row is for the
*-- column headers
loTable = loDoc.Tables.Add(loSelection.Range,lnFieldCount+1,4)
loTable.Cell(1,1).Range.Text = "Name"
loTable.Cell(1,2).Range.Text = "Type"
loTable.Cell(1,3).Range.Text = "Length"
loTable.Cell(1,4).Range.Text = "Dec"
*-- Fill in the rows of the Word table with
*-- the field information
FOR lnField = 1 TO lnFieldCount
loTable.Cell(lnField+1,1).Range.Text = ;
laFields[lnField,1]
loTable.Cell(lnField+1,2).Range.Text = ;
laFields[lnField,2]
loTable.Cell(lnField+1,3).Range.Text = ;
ALLTRIM(STR(laFields[lnField,3]))
loTable.Cell(lnField+1,4).Range.Text = ;
ALLTRIM(STR(laFields[lnField,4]))
ENDFOR
*-- Jump to end of document
loSelection.MoveEnd(wdStory)
loSelection.Start = loSelection.End
ENDFOR
*-- Name .DOC file the same as the DBC name
*-- Remove .DBC from end of DBC name
lcSavedFile = SUBSTRC(lcDBCFile,1,LENC(lcDBCFile)-4)
loDoc.SaveAs(lcSavedFile,10)
loWord.Quit()
USE
CLOSE DATABASE
return
_______________________________________________
Post Messages to: [email protected]
Subscription Maintenance: http://leafe.com/mailman/listinfo/profox
OT-free version of this list: http://leafe.com/mailman/listinfo/profoxtech
Searchable Archive: http://leafe.com/archives/search/profox
This message:
http://leafe.com/archives/byMID/profox/d2199efe190e406eaaaa1f4acf4eb...@bills
** All postings, unless explicitly stated otherwise, are the opinions of the
author, and do not constitute legal or medical advice. This statement is added
to the messages for those lawyers who are too stupid to see the obvious.