Author: UNKNOWN
* * * http://kosh.datateamsys.com/~danny/OOo/VisualFoxPro-OOo/LibOOo-2003-11-17-01.prg *############################################################ * Public API * High level routines. *############################################################ * Return .T. if OpenOffice.org is installed. * Return .F. if not installed. FUNCTION OOoIsInstalled() LOCAL oServiceManager oServiceManager = .NULL. LOCAL cOldErrHandler cOldErrHandler = ON( "ERROR" ) ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) ) oServiceManager = OOoGetServiceManager() ON ERROR &cOldErrHandler * If we could create a Service Manager, * then OpenOffice.org must be installed. RETURN NOT ISNULL( oServiceManager ) ENDFUNC * Easy way to create a new Draw document. FUNCTION OOoCreateNewDrawDocument() LOCAL oDrawDoc oDrawDoc = OOoOpenURL( "private:factory/sdraw" ) RETURN oDrawDoc ENDFUNC * Easy way to create a new Writer document. FUNCTION OOoCreateNewWriterDocument() LOCAL oWriterDoc oWriterDoc = OOoOpenURL( "private:factory/swriter" ) RETURN oWriterDoc ENDFUNC * Easy way to create a new Calc document. FUNCTION OOoCreateNewCalcDocument() LOCAL oCalcDoc oCalcDoc = OOoOpenURL( "private:factory/scalc" ) RETURN oCalcDoc ENDFUNC * Easy way to create a new Impress document. FUNCTION OOoCreateNewImpressDocument() LOCAL oImpressDoc oImpressDoc = OOoOpenURL( "private:factory/simpress" ) RETURN oImpressDoc ENDFUNC FUNCTION OOoOpenFile( cFilename ) LOCAL cURL cURL = OOoConvertToURL( cFilename ) LOCAL oDoc oDoc = OOoOpenURL( cURL ) RETURN oDoc ENDFUNC PROCEDURE OOoTerminateProgram() LOCAL oDesktop oDesktop = OOoGetDesktop() oDesktop.Terminate() =__OOoReleaseCachedVars() ENDPROC * Convert a local filename to an OOo URL. FUNCTION OOoConvertToURL( cFilename ) * Ensure leading slash. IF LEFT( cFilename, 1 ) != "/" cFileName = "/" + cFileName ENDIF LOCAL cURL cURL = CHRTRAN( cFilename, "\", "/" ) && change backslashes to forward slashes. cURL = "file://" + cURL RETURN cURL ENDFUNC *############################################################ * Draw specific tools *############################################################ * Page zero is the first page. * Once you have a drawing document, obtain one of its pages. FUNCTION OOoGetDrawPage( oDrawDoc, nPageNum ) LOCAL oPages oPages = oDrawDoc.GetDrawPages() LOCAL oPage oPage = oPages.GetByIndex( nPageNum ) RETURN oPage ENDFUNC * Given a draw document, create a shape. * The shape must be added to the draw page, by calling * the draw page's Add() method. * The oPosition and oSize arguments are optional, but you may * pass a Point and Size struct for these arguments. FUNCTION OOoMakeRectangleShape( oDrawDoc, oPosition, oSize ) LOCAL oShape oShape = OOoMakeShape( oDrawDoc, "com.sun.star.drawing.RectangleShape", oPosition, oSize ) RETURN oShape ENDFUNC FUNCTION OOoMakeEllipseShape( oDrawDoc, oPosition, oSize ) LOCAL oShape oShape = OOoMakeShape( oDrawDoc, "com.sun.star.drawing.EllipseShape", oPosition, oSize ) RETURN oShape ENDFUNC FUNCTION OOoMakeLineShape( oDrawDoc, oPosition, oSize ) LOCAL oShape oShape = OOoMakeShape( oDrawDoc, "com.sun.star.drawing.LineShape", oPosition, oSize ) RETURN oShape ENDFUNC FUNCTION OOoMakeTextShape( oDrawDoc, oPosition, oSize ) LOCAL oShape oShape = OOoMakeShape( oDrawDoc, "com.sun.star.drawing.TextShape", oPosition, oSize ) RETURN oShape ENDFUNC * Create and return a Point struct. FUNCTION OOoPosition( nX, nY ) LOCAL oPoint oPoint = OOoCreateStruct( "com.sun.star.awt.Point" ) oPoint.X = nX oPoint.Y = nY RETURN oPoint ENDFUNC * Create and return a Size struct. FUNCTION OOoSize( nWidth, nHeight ) LOCAL oSize oSize = OOoCreateStruct( "com.sun.star.awt.Size" ) oSize.Width = nWidth oSize.Height = nHeight RETURN oSize ENDFUNC * Given a shape, alter its position. PROCEDURE OOoSetPosition( oShape, nX, nY ) LOCAL oPosition oPosition = oShape.Position oPosition.X = nX oPosition.Y = nY oShape.Position = oPosition ENDPROC * Given a shape, alter its size. PROCEDURE OOoSetSize( oShape, nWidth, nHeight ) LOCAL oSize oSize = oShape.Size oSize.Width = nWidth oSize.Height = nHeight oShape.Size = oSize ENDPROC * Given a draw document, create a shape. * Optional: oPosition, oSize can receive a Point or Size struct. FUNCTION OOoMakeShape( oDrawDoc, cShapeClassName, oPosition, oSize ) LOCAL oShape oShape = oDrawDoc.CreateInstance( cShapeClassName ) IF (TYPE([oPosition])="O") AND (NOT ISNULL( oPosition )) oShape.Position = oPosition ENDIF IF (TYPE([oSize])="O") AND (NOT ISNULL( oSize )) oShape.Size = oSize ENDIF RETURN oShape ENDFUNC *############################################################ * Color conversion utilities * -------------------------- * Visual FoxPro and OpenOffice.org do not represent * color values the same way. * Conversion routines in both directions are provided * to keep things easy. * In addition, extremely convenient HSV routines are provided. * See LibGraphics for discussion of HSV color model. *############################################################ * Similar to VFP's built in RGB() function. * Pass in R,G,B values and out comes an OpenOffice.org color value. * Note that this is DIFFERENT from how VFP constructs color values. FUNCTION OOoRGB( nRed, nGreen, nBlue ) RETURN BITOR( BITOR( BITLSHIFT( nRed, 16 ), BITLSHIFT( nGreen, 8 ) ), nBlue ) ENDFUNC * Translate between a Visual FoxPro color and an OpenOffice.org color * by using a simple formula. * Pass in a VFP color, out comes an OOo color. And vice versa. FUNCTION OOoColor( nColor ) LOCAL nTranslatedColor nTranslatedColor = (INT( nColor / 65536 )) + (INT( INT( nColor / 256 ) % 256 ) * 256) + (INT( nColor % 256 ) * 65536) RETURN nTranslatedColor ENDFUNC * Extract the Red component from an OpenOffice.org color. * SImilar to the RGBRed() function in LibGraphics. FUNCTION OOoRed( nOOoColor ) * RETURN INT( nOOoColor / 65536 ) RETURN BITRSHIFT( BITAND( nOOoColor, 0x00FF0000 ), 16 ) ENDFUNC * Extract the Green component from an OpenOffice.org color. * SImilar to the RGBGreen() function in LibGraphics. FUNCTION OOoGreen( nOOoColor ) * RETURN INT( INT( nOOoColor / 256 ) % 256 ) RETURN BITRSHIFT( BITAND( nOOoColor, 0x0000FF00 ), 8 ) ENDFUNC * Extract the Blue component from an OpenOffice.org color. * SImilar to the RGBBlue() function in LibGraphics. FUNCTION OOoBlue( nOOoColor ) * RETURN INT( nOOoColor % 256 ) RETURN BITAND( nOOoColor, 0x000000FF ) ENDFUNC * Convenient way to construct an OOo color from HSV components. * See LibGraphics for information about HSV. * Note nHue is a number from 0.0 to 1.0. FUNCTION OOoHSV( nHue, nSaturation, nBrightness ) LOCAL nColor nColor = MakeHSVColor( nHue * 6.0, nSaturation, nBrightness ) nColor = OOoColor( nColor ) RETURN nColor ENDFUNC * Convenient way to extract the Hue component from an OOo color. * See LibGraphics for information about HSV. * Note nHue is a number from 0.0 to 1.0. FUNCTION OOoHue( nOOoColor ) RETURN HSVHue( OOoColor( nOOoColor ) ) / 6.0 ENDFUNC * Convenient way to extract the Saturation component from an OOo color. * See LibGraphics for information about HSV. FUNCTION OOoSaturation( nOOoColor ) RETURN HSVSaturation( OOoColor( nOOoColor ) ) ENDFUNC * Convenient way to extract the Brightness component from an OOo color. * See LibGraphics for information about HSV. FUNCTION OOoBrightness( nOOoColor ) RETURN HSVValue( OOoColor( nOOoColor ) ) ENDFUNC *############################################################ PROCEDURE DoNothing__ErrorHandler( pnError, pcErrMessage, pnLineNo, pcProgramFileSys16, pcProgram, pcErrorParamSys2018 ) ENDPROC * Return the OpenOffice.org service manager object. * Cache it in a global variable. * Create it if not already cached. FUNCTION OOoGetServiceManager() IF (TYPE([goOOoServiceManager])!="O") OR ISNULL( goOOoServiceManager ) PUBLIC goOOoServiceManager goOOoServiceManager = CREATEOBJECT( "com.sun.star.ServiceManager" ) ENDIF RETURN goOOoServiceManager ENDFUNC * Sugar coated routine to ask the service manager to * create you an instance of some other OpenOffice.org UNO object. FUNCTION OOoServiceManager_CreateInstance( cServiceName ) LOCAL oServiceManager oServiceManager = OOoGetServiceManager() LOCAL oInstance oInstance = .NULL. LOCAL cOldErrHandler cOldErrHandler = ON( "ERROR" ) ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) ) oInstance = oServiceManager.createInstance( cServiceName ) ON ERROR &cOldErrHandler IF ISNULL( oInstance ) =__OOoReleaseCachedVars() oServiceManager = OOoGetServiceManager() oInstance = oServiceManager.createInstance( cServiceName ) ENDIF RETURN oInstance ENDFUNC * Sugar coated routine to create any UNO struct. * Use the Bridge_GetStruct() feature of the OLE-UNO bridge. FUNCTION OOoCreateStruct( cTypeName ) LOCAL oServiceManager oServiceManager = OOoGetServiceManager() LOCAL oStruct oStruct = .NULL. LOCAL cOldErrHandler cOldErrHandler = ON( "ERROR" ) ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) ) oStruct = oServiceManager.Bridge_GetStruct( cTypeName ) ON ERROR &cOldErrHandler IF ISNULL( oStruct ) =__OOoReleaseCachedVars() oServiceManager = OOoGetServiceManager() oStruct = oServiceManager.Bridge_GetStruct( cTypeName ) ENDIF RETURN oStruct ENDFUNC * Return the OpenOffice.org desktop object. * Cache it in a global variable. * Create it if not already cached. FUNCTION OOoGetDesktop() IF (TYPE([goOOoDesktop])!="O") OR ISNULL( goOOoDesktop ) PUBLIC goOOoDesktop goOOoDesktop = OOoServiceManager_CreateInstance( "com.sun.star.frame.Desktop" ) COMARRAY( goOOoDesktop, 10 ) ENDIF RETURN goOOoDesktop ENDFUNC *!* * Return an instance of com.sun.star.reflection.CoreReflection. *!* * Cache it in a global variable. *!* * Create it if not already cached. *!* FUNCTION OOoGetCoreReflection() *!* IF (TYPE([goOOoCoreReflection])!="O") OR ISNULL( goOOoCoreReflection ) *!* PUBLIC goOOoCoreReflection *!* goOOoCoreReflection = OOoServiceManager_CreateInstance( "com.sun.star.reflection.CoreReflection" ) *!* COMARRAY( goOOoCoreReflection, 10 ) *!* ENDIF *!* RETURN goOOoCoreReflection *!* ENDFUNC *!* * Create a UNO struct object and return it. *!* * This routine is now obsolete. *!* * See a superior implementation of this routine elsewhere *!* * which uses the Bridge_GetStruct() feature of the OLE-UNO bridge. *!* FUNCTION OOoCreateStruct( cTypeName ) *!* * Ask service manager for a CoreReflection object. *!* LOCAL oCoreReflection *!* oCoreReflection = OOoGetCoreReflection() *!* *!* * Get the IDL Class for the type name. *!* LOCAL oXIdlClass *!* oXIdlClass = .NULL. *!* LOCAL cOldErrHandler *!* cOldErrHandler = ON( "ERROR" ) *!* ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) ) *!* oXIdlClass = oCoreReflection.forName( cTypeName ) *!* ON ERROR &cOldErrHandler *!* *!* IF ISNULL( oXIdlClass ) *!* =__OOoReleaseCachedVars() *!* oCoreReflection = OOoGetCoreReflection() *!* oXIdlClass = oCoreReflection.forName( cTypeName ) *!* ENDIF *!* *!* * Create a variable to hold the created Struct. *!* * Assign it some initial value. *!* LOCAL oStruct *!* oStruct = CREATEOBJECT( "relation" ) && assign some kind of object initially *!* * Ask the class definition to create an instance. *!* oXIdlClass.CreateObject( @oStruct ) *!* *!* RETURN oStruct *!* ENDFUNC * Create a com.sun.star.beans.PropertyValue struct and return it. FUNCTION OOoPropertyValue( cName, uValue, nHandle, nState ) LOCAL oPropertyValue oPropertyValue = OOoCreateStruct( "com.sun.star.beans.PropertyValue" ) oPropertyValue.Name = cName oPropertyValue.Value = uValue IF TYPE([nHandle])="N" oPropertyValue.Handle = nHandle ENDIF IF TYPE([nState])="N" oPropertyValue.State = nState ENDIF RETURN oPropertyValue ENDFUNC * Open or Create a document from it's URL. * New documents are created by URL's such as: * private:factory/sdraw * private:factory/swriter * private:factory/scalc * private:factory/simpress FUNCTION OOoOpenURL( cURL ) * LOCAL oPropertyValue * oPropertyValue = OOoCreateStruct( "com.sun.star.beans.PropertyValue" ) * LOCAL ARRAY aNoArgs[1] * aNoArgs[1] = oPropertyValue * aNoArgs[1].Name = "ReadOnly" * aNoArgs[1].Value = .F. * These two lines replace the alternate version above, * which are left commented for the insight they provide. LOCAL ARRAY aNoArgs[1] aNoArgs[1] = OOoPropertyValue( "Hidden", .F. ) LOCAL oDesktop oDesktop = OOoGetDesktop() LOCAL oDoc oDoc = oDesktop.LoadComponentFromUrl( cURL, "_blank", 0, @ aNoargs ) * Make sure that arrays passed to this document are passed zero based. COMARRAY( oDoc, 10 ) RETURN oDoc ENDFUNC PROCEDURE __OOoReleaseCachedVars() RELEASE goOOoServiceManager, goOOoDesktop, goOOoCoreReflection ENDPROC *############################################################ * Experimental stuff *SET PROCEDURE TO LibOOo ADDITIVE *oDoc = OOoOpenFile( GetDesktopFolderPathname() + "test.sxw" ) * This is an attempt to print a document. PROCEDURE PrintExperiment( oDoc ) LOCAL ARRAY aArgs[1] aArgs[1] = OOoPropertyValue( "CopyCount", 1, -1, 0 ) * aArgs[1] = OOoPropertyValue( "Collate", .F. ) oDoc.Print( @ aArgs ) ENDPROC *############################################################ PROCEDURE TestOOoDraw() * Create a drawing. LOCAL oDoc oDoc = OOoCreateNewDrawDocument() * Get the first page of the drawing. LOCAL oPage oPage = OOoGetDrawPage( oDoc, 0 ) LOCAL nHue, nSaturation, nBrightness LOCAL nRow, nCol LOCAL oShape * Now let's draw some rectangles. *----- * Notes about HSV color notation. * Imagine hue is a "rainbow" of colors, from 0.0 to 1.0. * 0.0 is red, then you progress to orange, yellow, green, blue, purple, and * then back to red again. (Not like a real rainbow.) 1.0 is red also. * HSV colors are easy for HUMANS, while RGB colors are easy for COMPUTERS. * Quick, what is the RGB for Pink? Brown? * In HSV, you would think Pink is a low-saturation red at full brightness, * thus you could say H=0.0, S=0.5, B=1.0; and that's off the top of my head. * Brown is a low brightness Orange, so H=0.0888, S=1.0, B=0.6; right out of thin air. * Need a highly contrasting color? Easy in HSV coordinates. * Just pick the opposite hue, maybe maximize saturation (opposite of other color), * and maybe also a min or max brightness. Can't easily come up with highly * contrasting colors in RGB coordinates in RGB space. * Need to "soften" colors? Take each HSV coordinate, and lower the saturation * by 10 %. * Need to "darken" colors? Lower the brightness of each pixel by 10 %. *----- * Let's vary the hue and saturation, while keeping the brightness constant. * But you could vary any two parameters, while keeping the third constant. nBrightness = 1.0 && full brightness FOR nRow = 0 TO 9 FOR nCol = 0 TO 9 * Create a shape oShape = OOoMakeRectangleShape( oDoc ) * Calculate color nHue = nCol / 9 && hue varies *across* by column nSaturation = nRow / 9 && saturation varies *down* by row * set color of shape * oShape.FillColor = OOoRGB( 255, 255, 255 ) oShape.FillColor = OOoHSV( nHue, nSaturation, nBrightness ) * Position and size the shape OOoSetSize( oShape, 500, 500 ) && 1/2 cm by 1/2 cm OOoSetPosition( oShape, 1000 + nCol * 600, 1000 + nRow * 600 ) * Add shape to page oPage.Add( oShape ) ENDFOR ENDFOR * Let's vary the hue and saturation, while keeping the brightness constant. * This time, we'll use less-brightness * But you could vary any two parameters, while keeping the third constant. nBrightness = 0.7 && less brightness FOR nRow = 0 TO 9 FOR nCol = 0 TO 9 * Create a shape oShape = OOoMakeRectangleShape( oDoc ) * Calculate color nHue = nCol / 9 && hue varies *across* by column nSaturation = nRow / 9 && saturation varies *down* by row * set color of shape oShape.FillColor = OOoHSV( nHue, nSaturation, nBrightness ) * Position and size the shape OOoSetSize( oShape, 500, 500 ) && 1/2 cm by 1/2 cm OOoSetPosition( oShape, 9000 + nCol * 600, 1000 + nRow * 600 ) * Add shape to page oPage.Add( oShape ) ENDFOR ENDFOR * Let's vary the hue and brightness, while keeping the saturation constant. * But you could vary any two parameters, while keeping the third constant. nSaturation = 1.0 && full saturation FOR nRow = 0 TO 9 FOR nCol = 0 TO 9 * Create a shape oShape = OOoMakeRectangleShape( oDoc ) * Calculate color nHue = nRow / 9 && hue varies *down* by row nBrightness = nCol / 9 && brightness varies *across* by column * set color of shape oShape.FillColor = OOoHSV( nHue, nSaturation, nBrightness ) * Position and size the shape OOoSetSize( oShape, 500, 500 ) && 1/2 cm by 1/2 cm OOoSetPosition( oShape, 1000 + nCol * 600, 9000 + nRow * 600 ) * Add shape to page oPage.Add( oShape ) ENDFOR ENDFOR * Let's vary the saturation and brightness, while keeping the hue constant. * The hue will be yellow. * But you could vary any two parameters, while keeping the third constant. nHue = 0.1666 && yellow FOR nRow = 0 TO 9 FOR nCol = 0 TO 9 * Create a shape oShape = OOoMakeRectangleShape( oDoc ) * Calculate color nSaturation = nRow / 9 && saturation varies *down* by row nBrightness = nCol / 9 && brightness varies *across* by column * set color of shape oShape.FillColor = OOoHSV( nHue, nSaturation, nBrightness ) * Position and size the shape OOoSetSize( oShape, 500, 500 ) && 1/2 cm by 1/2 cm OOoSetPosition( oShape, 9000 + nCol * 600, 9000 + nRow * 600 ) * Add shape to page oPage.Add( oShape ) ENDFOR ENDFOR * Gee, you don't suppose someone out there could take the knowledge represented * by this code and figure out how to make OpenOffice.org draw bar charts? ENDPROC PROCEDURE TestOOoCalc() * Create a spreadsheet. LOCAL oDoc oDoc = OOoCreateNewCalcDocument() * Get first sheet LOCAL oSheet oSheet = oDoc.getSheets().getByIndex( 0 ) * Plug in some stuff... oSheet.getCellByPosition( 0, 0 ).setFormula( "Month" ) oSheet.getCellByPosition( 1, 0 ).setFormula( "Sales" ) oSheet.getCellByPosition( 0, 1 ).setFormula( "Jan" ) oSheet.getCellByPosition( 0, 2 ).setFormula( "Feb" ) oSheet.getCellByPosition( 0, 3 ).setFormula( "Mar" ) oSheet.getCellByPosition( 0, 4 ).setFormula( "Apr" ) oSheet.getCellByPosition( 0, 5 ).setFormula( "May" ) oSheet.getCellByPosition( 0, 6 ).setFormula( "Jun" ) oSheet.getCellByPosition( 1, 1 ).setValue( 3826 ) oSheet.getCellByPosition( 1, 2 ).setValue( 3504 ) oSheet.getCellByPosition( 1, 3 ).setValue( 2961 ) oSheet.getCellByPosition( 1, 4 ).setValue( 2504 ) oSheet.getCellByPosition( 1, 5 ).setValue( 2102 ) oSheet.getCellByPosition( 1, 6 ).setValue( 1756 ) LOCAL ARRAY aOneArg[1] LOCAL cFile, cURL * cFile = GetDesktopFolderPathname()+"example" cFile = "c:\example" * Now save the spreadsheet. cURL = OOoConvertToURL( cFile + ".sxw" ) aOneArg[1] = OOoPropertyValue( "Overwrite", .T. ) oDoc.storeToUrl( cURL, @ aOneArg ) * Now save it as Excel cURL = OOoConvertToURL( cFile + ".xls" ) aOneArg[1] = OOoPropertyValue( "FilterName", "MS Excel 97" ) oDoc.storeToUrl( cURL, @ aOneArg ) ENDPROC PROCEDURE CreateHueRainbow() * Create a drawing. LOCAL oDoc oDoc = OOoCreateNewDrawDocument() * Get the first page of the drawing. LOCAL oPage oPage = OOoGetDrawPage( oDoc, 0 ) LOCAL nHue, nSaturation, nBrightness LOCAL nCol LOCAL oShape * Now let's draw some rectangles. * Let's vary the hue and saturation, while keeping the brightness constant. * But you could vary any two parameters, while keeping the third constant. nBrightness = 1.0 && full brightness nSaturation = 1.0 && full saturation FOR nCol = 0 TO 200 * Create a shape oShape = OOoMakeRectangleShape( oDoc ) * Calculate color nHue = nCol / 200 && hue varies *across* by column * set color of shape * oShape.FillColor = OOoRGB( 255, 255, 255 ) oShape.FillColor = OOoHSV( nHue, nSaturation, nBrightness ) * Position and size the shape OOoSetSize( oShape, 52, 2000 ) && 0.05 cm by 2 cm OOoSetPosition( oShape, 1000 + nCol * 50, 1000 ) oShape.LineStyle = 0 * Add shape to page oPage.Add( oShape ) ENDFOR LOCAL cFile, cURL * cFile = GetDesktopFolderPathname()+"hue rainbow" cFile = "c:\hue rainbow" cURL = OOoConvertToURL( cFile + ".sxd" ) LOCAL ARRAY aOneArg[1] aOneArg[1] = OOoPropertyValue( "Overwrite", .T. ) oDoc.storeAsUrl( cURL, @ aOneArg ) * oDoc.dispose() ENDPROC
*** Here is a very similar Visual FoxPro - Open Office example that..... *** 1. Creates an OOo Calc spreadsheet *** 2. Puts some strings into it. *** 3. Puts some numbers into it. *** 4. Puts some dates into it (as formulas) *** 5. Saves it in Calc format (as C:\Example.sxw) *** 6. Saves it in Excel format (as C:\Example.xls) *** 7. Closes the document -- but this line is commented to leave the spreadsheet open in OOo *** Code: VfpOOoCalcExample() PROCEDURE VfpOOoCalcExample() * Create a spreadsheet. LOCAL oDoc oDoc = OOoOpenURL( "private:factory/scalc" ) * Get first sheet LOCAL oSheet oSheet = oDoc.getSheets().getByIndex( 0 ) *----- * Put some sales figures onto the sheet. oSheet.getCellByPosition( 0, 0 ).setString( "Month" ) oSheet.getCellByPosition( 1, 0 ).setString( "Sales" ) oSheet.getCellByPosition( 2, 0 ).setString( "End Date" ) oSheet.getCellByPosition( 0, 1 ).setString( "Jan" ) oSheet.getCellByPosition( 0, 2 ).setString( "Feb" ) oSheet.getCellByPosition( 0, 3 ).setString( "Mar" ) oSheet.getCellByPosition( 0, 4 ).setString( "Apr" ) oSheet.getCellByPosition( 0, 5 ).setString( "May" ) oSheet.getCellByPosition( 0, 6 ).setString( "Jun" ) oSheet.getCellByPosition( 0, 7 ).setString( "Jul" ) oSheet.getCellByPosition( 0, 8 ).setString( "Aug" ) oSheet.getCellByPosition( 0, 9 ).setString( "Sep" ) oSheet.getCellByPosition( 0, 10 ).setString( "Oct" ) oSheet.getCellByPosition( 0, 11 ).setString( "Nov" ) oSheet.getCellByPosition( 0, 12 ).setString( "Dec" ) oSheet.getCellByPosition( 1, 1 ).setValue( 3826.37 ) oSheet.getCellByPosition( 1, 2 ).setValue( 3504.21 ) oSheet.getCellByPosition( 1, 3 ).setValue( 2961.45 ) oSheet.getCellByPosition( 1, 4 ).setValue( 2504.12 ) oSheet.getCellByPosition( 1, 5 ).setValue( 2713.98 ) oSheet.getCellByPosition( 1, 6 ).setValue( 2448.17 ) oSheet.getCellByPosition( 1, 7 ).setValue( 1802.13 ) oSheet.getCellByPosition( 1, 8 ).setValue( 2203.22 ) oSheet.getCellByPosition( 1, 9 ).setValue( 1502.54 ) oSheet.getCellByPosition( 1, 10 ).setValue( 1207.68 ) oSheet.getCellByPosition( 1, 11 ).setValue( 1819.71 ) oSheet.getCellByPosition( 1, 12 ).setValue( 986.03 ) oSheet.getCellByPosition( 2, 1 ).setFormula( "=DATE(2004;01;31)" ) oSheet.getCellByPosition( 2, 2 ).setFormula( "=DATE(2004;02;29)" ) oSheet.getCellByPosition( 2, 3 ).setFormula( "=DATE(2004;03;31)" ) oSheet.getCellByPosition( 2, 4 ).setFormula( "=DATE(2004;04;30)" ) oSheet.getCellByPosition( 2, 5 ).setFormula( "=DATE(2004;05;31)" ) oSheet.getCellByPosition( 2, 6 ).setFormula( "=DATE(2004;06;30)" ) oSheet.getCellByPosition( 2, 7 ).setFormula( "=DATE(2004;07;31)" ) oSheet.getCellByPosition( 2, 8 ).setFormula( "=DATE(2004;08;31)" ) oSheet.getCellByPosition( 2, 9 ).setFormula( "=DATE(2004;09;30)" ) * Note that these last three dates are not set as DATE() function calls. oSheet.getCellByPosition( 2, 10 ).setFormula( "10/31/2004" ) oSheet.getCellByPosition( 2, 11 ).setFormula( "11/30/2004" ) oSheet.getCellRangeByName( "C13" ).setFormula( "12/31/2004" ) *----- * Format the date cells as dates. oFormats = oDoc.getNumberFormats() oLocale = OOoCreateStruct( "com.sun.star.lang.Locale" ) * com.sun.star.util.NumberFormat.DATE = 2 nDateKey = oFormats.getStandardFormat( 2, oLocale ) oCell = oSheet.getCellRangeByName( "C2:C13" ) oCell.NumberFormat = nDateKey LOCAL ARRAY aOneArg[1] LOCAL cFile, cURL * cFile = GetDesktopFolderPathname()+"example" cFile = "c:\example" * Now save the spreadsheet. cURL = OOoConvertToURL( cFile + ".sxw" ) aOneArg[1] = OOoMakePropertyValue( "Overwrite", .T. ) oDoc.storeToUrl( cURL, @ aOneArg ) * Now save it as Excel cURL = OOoConvertToURL( cFile + ".xls" ) aOneArg[1] = OOoMakePropertyValue( "FilterName", "MS Excel 97" ) oDoc.storeToUrl( cURL, @ aOneArg ) * Close the document. * oDoc.close( 1 ) && TRUE ENDPROC * Open or Create a document from it's URL. * New documents are created by URL's such as: * private:factory/sdraw * private:factory/swriter * private:factory/scalc * private:factory/simpress FUNCTION OOoOpenURL( cURL ) * LOCAL oPropertyValue * oPropertyValue = OOoCreateStruct( "com.sun.star.beans.PropertyValue" ) * LOCAL ARRAY aNoArgs[1] * aNoArgs[1] = oPropertyValue * aNoArgs[1].Name = "ReadOnly" * aNoArgs[1].Value = .F. * These two lines replace the alternate version above, * which are left commented for the insight they provide. LOCAL ARRAY aNoArgs[1] aNoArgs[1] = OOoMakePropertyValue( "Hidden", .F. ) LOCAL oDesktop oDesktop = OOoGetDesktop() LOCAL oDoc oDoc = oDesktop.LoadComponentFromUrl( cURL, "_blank", 0, @ aNoargs ) * Make sure that arrays passed to this document are passed zero based. COMARRAY( oDoc, 10 ) RETURN oDoc ENDFUNC * Create a com.sun.star.beans.PropertyValue struct and return it. FUNCTION OOoMakePropertyValue( cName, uValue, nHandle, nState ) LOCAL oPropertyValue oPropertyValue = OOoCreateStruct( "com.sun.star.beans.PropertyValue" ) oPropertyValue.Name = cName oPropertyValue.Value = uValue IF TYPE([nHandle])="N" oPropertyValue.Handle = nHandle ENDIF IF TYPE([nState])="N" oPropertyValue.State = nState ENDIF RETURN oPropertyValue ENDFUNC * Sugar coated routine to create any UNO struct. * Use the Bridge_GetStruct() feature of the OLE-UNO bridge. FUNCTION OOoCreateStruct( cTypeName ) LOCAL oServiceManager oServiceManager = OOoGetServiceManager() LOCAL oStruct oStruct = .NULL. LOCAL cOldErrHandler cOldErrHandler = ON( "ERROR" ) ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) ) oStruct = oServiceManager.Bridge_GetStruct( cTypeName ) ON ERROR &cOldErrHandler IF ISNULL( oStruct ) =__OOoReleaseCachedVars() oServiceManager = OOoGetServiceManager() oStruct = oServiceManager.Bridge_GetStruct( cTypeName ) ENDIF RETURN oStruct ENDFUNC * Return the OpenOffice.org desktop object. * Cache it in a global variable. * Create it if not already cached. FUNCTION OOoGetDesktop() IF (TYPE([goOOoDesktop])!="O") OR ISNULL( goOOoDesktop ) PUBLIC goOOoDesktop goOOoDesktop = OOoServiceManager_CreateInstance( "com.sun.star.frame.Desktop" ) COMARRAY( goOOoDesktop, 10 ) ENDIF RETURN goOOoDesktop ENDFUNC * Return the OpenOffice.org service manager object. * Cache it in a global variable. * Create it if not already cached. FUNCTION OOoGetServiceManager() IF (TYPE([goOOoServiceManager])!="O") OR ISNULL( goOOoServiceManager ) PUBLIC goOOoServiceManager goOOoServiceManager = CREATEOBJECT( "com.sun.star.ServiceManager" ) ENDIF RETURN goOOoServiceManager ENDFUNC * Sugar coated routine to ask the service manager to * create you an instance of some other OpenOffice.org UNO object. FUNCTION OOoServiceManager_CreateInstance( cServiceName ) LOCAL oServiceManager oServiceManager = OOoGetServiceManager() LOCAL oInstance oInstance = .NULL. LOCAL cOldErrHandler cOldErrHandler = ON( "ERROR" ) ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) ) oInstance = oServiceManager.createInstance( cServiceName ) ON ERROR &cOldErrHandler IF ISNULL( oInstance ) =__OOoReleaseCachedVars() oServiceManager = OOoGetServiceManager() oInstance = oServiceManager.createInstance( cServiceName ) ENDIF RETURN oInstance ENDFUNC PROCEDURE DoNothing__ErrorHandler( pnError, pcErrMessage, pnLineNo, pcProgramFileSys16, pcProgram, pcErrorParamSys2018 ) ENDPROC PROCEDURE __OOoReleaseCachedVars() RELEASE goOOoServiceManager, goOOoDesktop, goOOoCoreReflection ENDPROC * Convert a local filename to an OOo URL. FUNCTION OOoConvertToURL( cFilename ) * Ensure leading slash. IF LEFT( cFilename, 1 ) != "/" cFileName = "/" + cFileName ENDIF LOCAL cURL cURL = CHRTRAN( cFilename, "\", "/" ) && change backslashes to forward slashes. cURL = "file://" + cURL RETURN cURL ENDFUNC
LOCAL loOfcMgr, loDesktop, loDocument, args(1), loCoreReflection,; loPropertyValue,loText,loCursor, oDisp, oct1, oSourceframe * Create the Service Manger and Desktop loOfcMgr = CreateObject("com.sun.star.ServiceManager") loDesktop = loOfcMgr.createInstance("com.sun.star.frame.Desktop") ** The args array is an array of "PropertyValue - objects - create by invoking OO.o reflection loCoreReflection = loOfcMgr.createInstance("com.sun.star.reflection.CoreReflection" ) loPropertyValue = CREATEOBJECT("Empty") loCoreReflection.forName("com.sun.star.beans.PropertyValue"). createobject(@loPropertyValue) args[1] = loPropertyValue args[1].name = "ReadOnly" args[1].value = .F. * Tell VFP to pass arrays to the loDesktop object as zero-based, by reference COMARRAY(loDesktop,10) * Open a new empty writer document loDocument = loDesktop.loadComponentFromURL("private:factory/swriter","_blank", 0, @args) ** Insert sample Text loText=loDocument.getText() && Create text object * Create a cursor object (position pointer) loCursor= loText.createTextCursor() ** loCursor.CharHeight = 16 loCursor.CharWeight = 100 loText.insertString(loCursor, "my text", .F.)
Document: OpenOffice Automation by Andreas Ahammer
Document: Programming OpenOffice with Visual Basic
Document: StarOffice Programmer's Tutorial
Nice to hear about open office automation.
ReplyDeleteVisual Foxpro Migration and Foxpro Migration