VC下如果操作Excel

原文来自:点击打开链接
数据操作
      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 的位置无数据(指的是区域空而非零)则程序抛出异常。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
源代码 void CExcelTestDlg::OnExceltest() { // TODO: Add your control notification handler code here _Application ExcelApp; Workbooks wbsMyBooks; _Workbook wbMyBook; Worksheets wssMysheets; _Worksheet wsMysheet; Range rgMyRge; //创建Excel 服务器(启动Excel) if (!ExcelApp.CreateDispatch("Excel.Application",NULL)) { AfxMessageBox("创建Excel服务失败!"); exit(1); } //利用模板文件建立新文档 wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true); wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t("g:\\exceltest\\MyTemplate.xlt"))); //得到worksheets wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true); //得到sheet1 wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true); //得到全部的cells,此时,rgMyRge是cells的集合 rgMyRge.AttachDispatch(wsMysheet.GetCells(),true); //设置一行一列的单元的值 rgMyRge.SetItem(_variant_t((long)1),_variant_t((long)1),_variant_t("This is a Excel Test Program!")); //得到所有的列 rgMyRge.AttachDispatch(wsMysheet.GetColumns(),true); //设置第一列 rgMyRge.AttachDispatch(rgMyRge.GetItem(_variant_t((long)1),vtMissing).pdispVal,true); //设置列宽 rgMyRge.SetColumnWidth(_variant_t((long)200)); //调用模版预先存放的宏 ExcelApp.Run(_variant_t("CopyRow"),_variant_t((long)10),vtMissing,vtMissing, vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing, vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing, vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing, vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing); //打印浏览 wbMyBook.SetSaved(true); ExcelApp.SetVisible(true); wbMyBook.PrintPreview(_variant_t(false)); //释放内存 rgMyRge.ReleaseDispatch(); wsMysheet.ReleaseDispatch(); wssMysheets.ReleaseDispatch(); wbMyBook.ReleaseDispatch(); wbsMyBooks.ReleaseDispatch(); ExcelApp.ReleaseDispatch(); } MFC调用excel
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值