View Raw SPL
/*****************************************************************************
*                                                                            *
*   XLGET.SPL    Copyright (C) 2001-2007 DSP Development Corporation         *
*                               All Rights Reserved                          *
*                                                                            *
*   Author:      Randy Race                                                  *
*                                                                            *
*   Synopsis:    Gets a range of data from Excel via Automation              *
*                                                                            *
*   Revisions:   17 Aug 2001  RRR  Creation                                  *
*                14 Sep 2001  RRR  support for sheet names                   *
*                 1 May 2007  RRR  range verification                        *
*                                                                            *
*****************************************************************************/


#if @HELP_XLGET

    XLGET

    Purpose: Returns a range of values from Excel via ActiveX Automation

    Syntax:  XLGET("rangestr", "bookname", sheet)

              rangestr - a string, Excel input range, defaults to
                         "A1", the first cell

              bookname - an optional string, Excel Workbook name, defaults to
                         "" (empty) indicating use current Workbook

                 sheet - an optional integer or string, Excel Sheet number,
                         or sheet name, defaults to 1, the first sheet if
                         bookname is specified, else the current sheet


    Returns: A series, string or scalar if a single value is requested

    Example:
             W1: rand(10, 3);

             xlput("A1:C10", W1);

             W2: xlget("A1:C10");

             W1 == W2 is all ones, that is W1 and W2 are equivalent. The data
             is retrieved from the current Sheet of the current Workbook.


    Example:
             W1: rand(10, 3);

             xlput("A1:C10", W1, "Book2", 2);

             W2: xlget("A1:C10", "Book2", 2);

             W1 == W2 is all ones, that is W1 and W2 are equivalent. The data
             is retrieved from the second Sheet of Workbook Book2.


    Remarks:
             If Excel is already running, XLGET attempts to connect to
             the running instance of Excel, otherwise XLGET connects
             to a new instance of Excel.

             Numeric data is transferred as double precision values.

    See Also:
             Xlclear
             Xlinit
             Xlput
             Xlsave
             Xlsaveas
#endif



/* get data from a range of Excel cells */
xlget(rangestr, bookname, sheet)
{
        local s, xl, ta;

        if (argc < 3)
        {
                if (argc < 2)
                {
                        if (argc < 1)
                        {
                                rangestr = "A1";
                        }

                        bookname = "";
                }

                /* if we have a bookname, use first sheet, else default to current */
                if (strlen(bookname) > 0) sheet = 1;
                else sheet = 0;
        }

        if (not(isstring(rangestr)))
        {
                error("xlget: input range string required");
        }

        if (not(isstring(bookname)))
        {
                error("xlget: bookname must be a string or empty string");
        }

        /* connect to Excel if necessary */
        xl = xlconnect();

        /* check input range */
        range = xlget_getrange(xl, bookname, sheet, rangestr);

        if (not(isobject(range)))
        {
                error(sprintf("xlget - invalid range: %s", rangestr));
        }

        /* do not transpose */
        ta = getconf("activex_array_transpose");
        setconf("activex_array_transpose", "0");

        s = range.value;

        setconf("activex_array_transpose", ta);

        return(s);
}



/* get a range object */
xlget_getrange(xl, bookname, sheet, rangestr)
{
        local sheetlen, xlrange = 0;

        /* see if sheet is a string or numeric */
        if (isstring(sheet))
        {
                sheetlen = strlen(sheet);
        }
        else
        {
                sheetlen = sheet;
        }

        /* now select the range */
        if (strlen(bookname) > 1)
        {
                /* use specified workbook and worksheet */
                xlrange = xl.workbooks(bookname).worksheets(sheet).range(rangestr);
        }
        else
        {
                /* use current workbook */
                if (sheetlen > 0)
                {
                        /* use specified sheet */
                        xlrange = xl.worksheets(sheet).range(rangestr);
                }
                else
                {
                        /* use current sheet */
                        xlrange = xl.range(rangestr);
                }
        }

        return(xlrange);
}