VC下如果操作Excel

来源:互联网 发布:手机麻将游戏源码 编辑:程序博客网 时间:2024/04/28 15:47
原文来自:点击打开链接
数据操作
      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的位置无数据(指的是区域空而非零)则程序抛出异常。