⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sample9excel.c

📁 用CVI实现的EXCEL自动化服务器演示i
💻 C
📖 第 1 页 / 共 2 页
字号:
                
                if (ExcelWorkbookHandle) 
                {
                    ClearObjHandle (&ExcelRangeHandle);
                    ClearObjHandle (&ExcelSheetsHandle);
                    ClearObjHandle (&ExcelWorksheetHandle);
    
                    if (ExcelWorkbookHandle) 
                    {
                        // 没有保存就关闭
                        Excel_WorkbookClose (ExcelWorkbookHandle, NULL, CA_VariantBool (VFALSE), 
                            CA_DEFAULT_VAL, CA_VariantBool (VFALSE));
                       
                        ClearObjHandle (&ExcelWorkbookHandle);
                    }
    
                    ClearObjHandle (&ExcelWorkbooksHandle);
        
                    ExcelWorksheetHandle = 0;
                   
                }
            break;
    }
    return 0;   

}


// WriteDataToExcel 子函数

HRESULT WriteDataToExcel(void)
{
    VARIANT *vArray = NULL;
    LPSAFEARRAY MySafeArray = NULL;
    HRESULT error = 0;
    int i, j;

    SetWaitCursor (1);
    
    // Open new Range for Worksheet
    CA_VariantSetCString (&MyCellRangeV, EXCEL_ARRAY_OF_CELLS);
    Excel_WorksheetRange (ExcelWorksheetHandle, NULL, MyCellRangeV, CA_DEFAULT_VAL, &ExcelRangeHandle);
   
    // Make range Active    
    Excel_RangeActivate (ExcelRangeHandle, &ErrorInfo);
    

    //----------------------------------------------------------------
    // 1) Set all cells in Range to a single value of zero
    //----------------------------------------------------------------
    Excel_SetProperty (ExcelRangeHandle, &ErrorInfo, Excel_RangeValue2, CAVT_VARIANT, CA_VariantFloat (0.0));
    
    //----------------------------------------------------------------
    // 2) Set each cell in Range one at a time using an offset from 
    //    range's top left cell
    //----------------------------------------------------------------
    for (i=0;i<ROWS;i++)
    {
        for (j=0;j<COLUMNS;j++)
        {
            Excel_RangeItemPut (ExcelRangeHandle, &ErrorInfo, CA_VariantInt (i+1), CA_VariantInt (j+1), CA_VariantFloat ( sin(3.14*(i+1)/(ROWS+1)) * sin(3.14*(j+1)/(COLUMNS+1))) );
            
        }
    }    

    //----------------------------------------------------------------
    // 3) Set all cells at once using a SAFEARRAY in a VARIANT
    //----------------------------------------------------------------
    // Create a Variant Array and set each value
    vArray = (VARIANT *) calloc (ROWS*COLUMNS, sizeof(VARIANT));
    /*if (!vArray)
        goto Error; */
    
    for (i=0;i<ROWS;i++)
    {
        for (j=0;j<COLUMNS;j++)
        {
            CA_VariantSetDouble (&vArray[i*COLUMNS+j], sin(3.14*(i+1)/(ROWS+1)) * sin(3.14*(j+1)/(COLUMNS+1)));
            
        }
    }  
    
    // Create a SAFEARRAY
    CA_Array2DToSafeArray (vArray, CAVT_VARIANT, ROWS, COLUMNS, &MySafeArray);
    
    // Set SafeArray into a Variant to send to Excel
    CA_VariantSetSafeArray (&MyVariant, CAVT_VARIANT, MySafeArray);
    
    // Set Range with one call passing SAFEARRAY as Variant
    Excel_SetProperty (ExcelRangeHandle, &ErrorInfo, Excel_RangeValue2, CAVT_VARIANT, MyVariant);
   
Error:
    SetWaitCursor (0);
    
    // Free array of VARIANT
    if (vArray) 
    {
        for (i=0;i<ROWS;i++)
        {
            for (j=0;j<COLUMNS;j++)
            {
                CA_VariantClear (&vArray[i*COLUMNS+j]);
            }
        }    
        free(vArray);
    }            
    
    // Free SAFEARRAY in VARIANT        
    CA_VariantClear(&MyVariant);
    CA_VariantClear(&MyCellRangeV);
    
    // Clear Range Handle
    ClearObjHandle (&ExcelRangeHandle);

    if (error < 0) 
        ReportAppAutomationError (error);
        
    return error;
}

int CVICALLBACK WriteData (int panel, int control, int event,
        void *callbackData, int eventData1, int eventData2)
{
    switch (event) 
    {
        case EVENT_COMMIT:
            WriteDataToExcel();        
            break;
    }
    return 0;
}


// MakeChartInExcel子函数 

HRESULT MakeChartInExcel(void)
{
    LPSAFEARRAY MySafeArray;
    HRESULT error = 0;
    int i, j;
    VARIANT *vArray = NULL;
    int dim1Size, dim2Size;

    SetWaitCursor (1);
    
    // Open new Range for Worksheet
    error = CA_VariantSetCString (&MyCellRangeV, EXCEL_ARRAY_OF_CELLS);
    error = Excel_WorksheetRange (ExcelWorksheetHandle, NULL, MyCellRangeV, CA_DEFAULT_VAL, &ExcelRangeHandle);
    CA_VariantClear(&MyCellRangeV);
    if (error<0) goto Error;
    
    // Open new Chart Collection for Worksheet
    status = Excel_WorksheetChartObjects (ExcelWorksheetHandle, NULL, CA_DEFAULT_VAL, &ExcelChartsHandle);
    if (status<0) goto Error;
    
    // 建立一张信徒
    status = Excel_ChartObjectsAdd (ExcelChartsHandle, NULL, 175.0, 175.0,
                                    300.0, 200.0, &ExcelChartObjHandle);
    if (status<0) goto Error;


    status = Excel_GetProperty (ExcelChartObjHandle, NULL, Excel_ChartObjectChart, CAVT_OBJHANDLE, &ExcelChartHandle);
    if (status<0) goto Error;

    // Use Chart Wizard to setup Chart
    status = CA_VariantSetCString (&MyVariant, "Chart #1");
    status = CA_GetDispatchFromObjHandle (ExcelRangeHandle, &MyDispatch);  // Get dispatch for range
    status = Excel_ChartChartWizard (ExcelChartHandle, &ErrorInfo,
                                     CA_VariantDispatch (MyDispatch),
                                     CA_VariantLong(ExcelConst_xl3DSurface),
                                     CA_DEFAULT_VAL,
                                     CA_VariantInt(ExcelConst_xlRows),
                                     CA_DEFAULT_VAL,
                                     CA_DEFAULT_VAL,
                                     CA_DEFAULT_VAL, 
                                     MyVariant,
                                     CA_DEFAULT_VAL,
                                     CA_DEFAULT_VAL,
                                     CA_DEFAULT_VAL);
    CA_VariantClear(&MyVariant);
    if (status<0) goto Error;

    // Lets get the current rotation value
    status = Excel_GetProperty (ExcelChartHandle, NULL, Excel_ChartRotation, CAVT_VARIANT, &MyVariant);
    if (status<0) goto Error;
    CA_VariantClear(&MyVariant);

Error:
    SetWaitCursor (0);
    CA_VariantClear(&MyCellRangeV);
    CA_VariantClear(&MyVariant);
    ClearObjHandle (&ExcelRangeHandle);
    ClearObjHandle (&ExcelChartHandle);
    ClearObjHandle (&ExcelChartObjHandle);
    ClearObjHandle (&ExcelChartsHandle);
    
    if (error < 0) 
        ReportAppAutomationError (error);

    return error;
}

//画图
int CVICALLBACK MakeChart (int panel, int control, int event,
        void *callbackData, int eventData1, int eventData2)
{
    switch (event)
        {
        case EVENT_COMMIT:
            MakeChartInExcel();
            break;
        }
    
    return 0;
    
}

//退出主界面

int CVICALLBACK Quit (int panel, int control, int event,
        void *callbackData, int eventData1, int eventData2)
{
    switch (event) {
        case EVENT_COMMIT:
            QuitUserInterface (0);
            break;
    }
    return 0;
}

// SaveDocument 子函数 

static HRESULT SaveDocument (CAObjHandle ExcelWorksheetHandle, char *fileName)
{   
    HRESULT error = 0;
    VARIANT fileNameVt;
    
    CA_VariantSetEmpty (&fileNameVt);
    caErrChk (CA_VariantSetCString (&fileNameVt, fileName));

Error:
    CA_VariantClear (&fileNameVt);
    if (error < 0) 
        ReportAppAutomationError (error);

    return error;
}



// ClearObjHandle 子函数 

HRESULT ClearObjHandle(CAObjHandle *objHandle)
{
    HRESULT error = 0;
    if ((objHandle) && (*objHandle))
    {
        error = CA_DiscardObjHandle (*objHandle);
        *objHandle = 0;
    }
    return error;    
}    



// ReportWordAutomationError 子函数 

static void ReportAppAutomationError (HRESULT hr)
{
    char errorBuf[256];
    
    if (hr < 0) {
        CA_GetAutomationErrorString (hr, errorBuf, sizeof (errorBuf));
        MessagePopup (APP_AUTOMATION_ERR, errorBuf);
    }
    return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -