原文来自:点击打开链接
数据操作
数据操作
1
.获取
sheet
。
void GetSheet(char* pSheetName,_Worksheet& excelSheet)
{
excelSheet.AttachDispatch(excelSheets.GetItem(_variant_t(pSheetName)));
}
_Worksheet dataSheet;
GetSheet("
数据
",dataSheet);
注意:
sheet
名称必须在文件中存在,否则程序抛出异常。为了适应不同文件的操作,此处的
sheet
名称可通过配置文件进行动态配置。
2.
获取
range
void GetRange(_Worksheet excelSheet,Range& excelRange)
{
excelRange.AttachDispatch(excelSheet.GetCells());
}
Range dataRange;
GetRange(dataSheet,dataRange);
3
.指定行列的数据获取
#define LV(x) _variant_t(long(x))
#define SV(x) _variant_t(x)
。
…
…
bool GetData(int row,int col)
{
range.AttachDispatch(dataSheet.GetCells());
range.AttachDispatch(range.GetItem(LV(row),LV(col)).pdispVal);
COleVariant vResult =range.GetValue2();
if(vResult.vt==VT_EMPTY)
return false;
return true;
}
4.
数据的填写
Void SetValue(int row,int col,char* pData)
{
dataRange.SetItem(LV(row),LV(col),SV(pData));
}
5.
数据区域的拷贝
假如有一个表格高度变量是
dTableHeight
,宽度变量是
dTableWidth,
将其拷贝若干份,每个表格之间相隔一行实现代码如下:
Int row = 1
Range rgMyRge2, rgMyRge3
For(int I = 0 ; I < n;i++)
{
rgMyRge2.AttachDispatch( dataRange.GetItem( COleVariant((long)(row)) , COleVariant((long)1)).pdispVal, true);
rgMyRge3.AttachDispatch(rgMyRge2.GetResize(COleVariant((long)dTableHeight ),COleVariant((long) dTableWidth)) );
rgMyRge3.Copy( dataRange.GetItem(LV((long)( row + dTableHeight)),LV( long(1) ) ) );
row = row + dTableHeight + 1;
}
图表操作
Excel
提供了功能强大的图表处理功能,我们可以轻而易举的绘制各类统计报表。如下图所示我们将对局有固定模版的图表进行处理。
1.
获得图表
_Worksheet chartSheet;
GetSheet("
曲线图
",chartSheet);
void GetChart(_Worksheet excelSheet,int dChatNo,_Chart& excelChart)
{
ChartObjects objCharts;
ChartObject objChart;
COleVariant vOpt(DISP_E_PARAMNOTFOUND, VT_ERROR);
objCharts = excelSheet.ChartObjects(vOpt);
objChart = objCharts.Item(COleVariant((short)dChatNo));
excelChart.AttachDispatch( objChart.GetChart(),true);
}
_Chart resultchart;
GetChart(chartSheet,ChartNo,resultchart);
注意:变量
ChartNo
表示图表的排序值,即属于一个
sheet
中的第几个图表,该排序值是根据用户创建图表的顺序自动生成的。
2.
设定曲线
要实现曲线的,就必须准确的描述曲线。曲线描述信息是一个序列化的字符串,它包含四个部分,每个部分之间依靠逗号分隔:
1.
图表的
title.
2.
图表的
x
周描述信息
3.
显示曲线所基于的数据区域描述
4.
单一图表内的曲线排序值(曲线
id
)
其中某些项目可以不设,系统将取默认值,最终形成的序列化格式如下:
=SERIES("
示例
",
数据
!$A$4:$A$34,
数据
!$C$4:$C$34,1),
也可以省略指定
x
坐标
=SERIES("
示例
", ,
数据
!$C$4:$C$34,1)
。
void SetChartSeriesSource( _Chart excelChart , short series_id , char *pParamLine)
{
Series oSeries;
oSeries = excelChart.SeriesCollection(COleVariant((short)series_id));
oSeries.SetFormula(pParamLine);
}
char szParamLine[1024];
sprintf(rgnline,"=SERIES(/"%s/",,%s!$%s$%d:$%s$%d,%d)", "
数据
",
pDataName,pCol,row,pCol,dIndexRow[i] , 1);
SetChartSeriesSource(excelChart , 1 , szParamLine);
注意:设定的数据内不得出现没有值得现象。比如基于数据区域
a1:a100
形成一条曲线,若
a30
的位置无数据(指的是区域空而非零)则程序抛出异常。