简体   繁体   English

从c ++ xll中的excel接收矩阵,修改它并返回它

[英]Receive a matrix from excel in c++ xll, modifying it and returning it

I coded up an xll function receiving a matrix from excel, modifying it a returning it : 我编写了一个从excel接收矩阵的xll函数,将其修改为返回它:

__declspec(dllexport) LPXLOPER12 WINAPI ZZZZUpdateArray1(LPXLOPER12 arrayin)
{
    if (arrayin->xltype == xltypeMulti | xlbitDLLFree)
    {
        double ScaleFactor = 2.0;
        int rows = arrayin->val.array.rows;
        int cols = arrayin->val.array.columns;
        static XLOPER12 xlArray;
        xlArray.val.array.lparray = reinterpret_cast<LPXLOPER12>(::new XLOPER12[rows * cols] /*::malloc(rows * cols * sizeof(XLOPER12))*/);
        for (int r = 0; r<rows; r++)
        {
            for (int c = 0; c<cols; c++)
            {
                if ((arrayin->val.array.lparray + ((r* cols) + c))->xltype == xltypeNum)
                {
                    XLOPER12* var = xlArray.val.array.lparray + ((r* cols) + c);
                    var->xltype = xltypeNum;
                    var->val.num = ScaleFactor*(arrayin->val.array.lparray + ((r* cols) + c))->val.num ;
                }
            }
        }
        return static_cast<LPXLOPER12>(&xlArray);
    }
    return arrayin;
}

but it crashes on 但它崩溃了

if ((arrayin->val.array.lparray + ((r* cols) + c))->xltype == xltypeNum)

If I am for instance taking a 5*5 matrix from excel, at debug I see it having 19 rows and 20 colums, what happened !? 如果我从excel中获取一个5 * 5矩阵,在调试中我看到它有19行和20列,发生了什么!

Is it maybe because when I receive the LPXLOPER12 arrayin , it represents an excel range, way more complicated than a 5*5 matrix. 是因为当我收到LPXLOPER12 arrayin ,它代表了一个excel范围,比5 * 5矩阵更复杂。 How to access the 5*5 matrix it contains, then ? 如何访问它包含的5 * 5矩阵呢?

  • Use the Excel code Q to register the input argument. 使用Excel代码Q注册输入参数。
  • You need to declare properly the return variable : 您需要正确声明返回变量:

     // initialize the return variable xlArray.val.array.rows = rows; xlArray.val.array.columns = cols; xlArray.xltype = xltypeMulti | xlbitDLLFree; 

I took the ujsgeyrr1f0d0d0r0h1h0j0j_juj code´s to make one to test my application. 我拿了ujsgeyrr1f0d0d0r0h1h0j0j_juj代码来测试我的应用程序。 I think it can be useful. 我觉得它很有用。 I´ve used codes from another references also. 我也使用过其他参考文献的代码。

    __declspec(dllexport) LPXLOPER12 WINAPI Array_In_Out(LPXLOPER12 ExMatriz)

{ {

     static XLOPER12 xlMatriz;  // variável de retorno


try
{

    int rows = ExMatriz->val.array.rows;
    int cols = ExMatriz->val.array.columns;
    xlMatriz.xltype = xltypeMulti | xlbitDLLFree;
    xlMatriz.val.array.rows = rows;
    xlMatriz.val.array.columns = cols;


    // ======= VERIFICACAO DOS DADOS DE ENTRADA ==============


    if (ExMatriz->xltype != xltypeRef       &&
        ExMatriz->xltype != xltypeSRef  &&
        ExMatriz->xltype != xltypeMulti)
    {
        xlMatriz.xltype = xltypeErr;
        xlMatriz.val.err = xlerrValue;

        return (LPXLOPER12)&xlMatriz;
    }



    static XLOPER12 MatrizMulti, tempTypeMulti;
    LPXLOPER12 Matrizptr;

    tempTypeMulti.xltype = xltypeInt;
    tempTypeMulti.val.w = xltypeMulti;

    if (xlretUncalced ==
        Excel12(xlCoerce, (LPXLOPER12)&MatrizMulti, 2, (LPXLOPER12)ExMatriz,
        (LPXLOPER12)&tempTypeMulti))
    {
        return 0;
    }


    Matrizptr = MatrizMulti.val.array.lparray;

    // verify that the entire ExMatriz are nums

    for (int r = 0; r < rows; r++)
    {
        for (int c = 0; c < cols; c++)
        {


            if ((Matrizptr + ((r* cols) + c))->xltype != xltypeNum)  // verifica se os valores são numericos
            {


                if (Matrizptr->xltype == xltypeErr)
                {

                    xlMatriz.xltype = xltypeErr;
                    xlMatriz.val.err = Matrizptr->val.err;

                    return (LPXLOPER12)&xlMatriz;
                }
                else
                {

                    xlMatriz.xltype = xltypeErr;
                    xlMatriz.val.err = xlerrValue;

                    return (LPXLOPER12)&xlMatriz;
                }

            }


        }
    }



    xlMatriz.val.array.lparray = reinterpret_cast<LPXLOPER12>(::new XLOPER12[rows * cols]); //new XLOPER12[rows*cols];


    for (int r = 0; r < rows; r++)
    {

        for (int c = 0; c < cols; c++)
        {

            xlMatriz.val.array.lparray + ((r* cols) + c);

            ExMatriz->val.array.lparray + ((r* cols) + c);

            xlMatriz.val.num = ExMatriz->val.num;         // coloca os valores de entrada na variável de saída !!!

        }
    }



    return static_cast<LPXLOPER12>(&xlMatriz);


    //return (LPXLOPER12)&xlMatriz;

}
catch (std::exception& e)
{
    xlMatriz.xltype = xltypeErr;
    xlMatriz.val.err = xlerrNA;
    return  (LPXLOPER12)&xlMatriz;
}

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM