📄 sample9excel.c
字号:
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 + -