VC操作excel 插入曲线

dy452876 2017-11-21 08:58:29
请教个问题:
使用OLE方式 操作 excel时,如何选取 不连续的点 画图?


比如 我选取 1,3,5画图,怎么弄啊?
get_range里貌似都是连续的,不能间隔着选取
...全文
141 6 点赞 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
赵4老师 2017-11-22
再供参考:
// TO DO: Edit the #import paths
//#pragma message ("Make sure you go to Tools.Options.Directories and add the paths to mso97.dll and vbeext1.olb.  Mso97.dll will usually be in c:\Program Files\Microsoft Office\Office, and vbeext1.olb will be in c:\Program Files\Common Files\Microsoft Shared\VBA")
#import "C:\\Program Files\\Common Files\\Microsoft Shared\\Office11\\mso.dll" no_namespace rename("DocumentProperties", "DocumentPropertiesXL")
#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\VBA6\\VBE6EXT.OLB" no_namespace
#import "C:\\Program Files\\Microsoft Office\\OFFICE11\\excel.exe" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") rename("DocumentProperties", "DocumentPropertiesXL") no_dual_interfaces

#pragma warning (disable:4192)

#include <stdio.h>
#include <tchar.h>

void dump_com_error(_com_error &e) {
    _tprintf(_T("Oops - hit an error!\n"));
    _tprintf(_T("\a\tCode = %08lx\n"), e.Error());
    _tprintf(_T("\a\tCode meaning = %s\n"), e.ErrorMessage());
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());
    _tprintf(_T("\a\tSource = %s\n"), (LPCTSTR) bstrSource);
    _tprintf(_T("\a\tDescription = %s\n"), (LPCTSTR) bstrDescription);
}

// If this is placed in the scope of the smart pointers, they must be
// explicitly Release(d) before CoUninitialize() is called.  If any reference
// count is non-zero, a protection fault will occur.
struct StartOle {
    StartOle() { CoInitialize(NULL); }
    ~StartOle() { CoUninitialize(); }
} _inst_StartOle;

int main() {
    using namespace Excel;

    _ApplicationPtr pXL;

    try {
        pXL.CreateInstance(L"Excel.Application");

        pXL->Visible = VARIANT_TRUE;

        WorkbooksPtr pBooks = pXL->Workbooks;
        _WorkbookPtr pBook  = pBooks->Add((long)xlWorksheet);
        _WorksheetPtr pSheet = pXL->ActiveSheet;

        RangePtr pRange;
        pRange = pSheet->Range["A21"];
        pRange->Value2 = 75L;
        //pRange->NumberFormatLocal = "@";

        Sleep(1000);
        pRange = pSheet->Range["20:20"];
        pRange->Insert( (long)Excel::xlDown );
        pRange->Merge();

        Sleep(1000);

        pBook->Saved = VARIANT_TRUE;
        pXL->Quit();
    } catch(_com_error &e) {
        dump_com_error(e);
        pXL->Quit();
    }
    return 0;
}
  • 打赏
  • 举报
回复
赵4老师 2017-11-22
竟然还能有用VBA for Excel能实现但用VC不能实现的功能?! 仅供参考:
//1.首先要将excel类添加到工程中。
//在ClassWizard中,【Add Class】,在Excel的安装目录找到Excel.exe(Microsoft2003是Excel.exe;2007应该又独立的lib库,这个没有验证),添加必要的几个类:
 // Excel应用对象
_Application  m_oExcelApp;   // Excel程序
_Worksheet  m_oWorkSheet;   // 工作表
_Workbook  m_oWorkBook;   // 工作簿
Workbooks  m_oWorkBooks;  // 工作簿集合
Worksheets  m_oWorkSheets;  // 工作表集合
Range  m_oCurrRange;   // 使用区域
//添加到工程中的文件是excel.h和excel.cpp。
//2.初始化Com库
if (CoInitialize(NULL)!=0) {
    AfxMessageBox("初始化COM支持库失败!");
    exit(1);
}
//3.读取文件中的数据
if (!m_oExcelApp.CreateDispatch( _T( "Excel.Application" ), NULL ) ) {
   ::MessageBox( NULL, _T( "创建Excel服务失败!" ), _T( "错误提示!" ), MB_OK | MB_ICONERROR);
   exit(1);
}

m_oExcelApp.SetVisible(FALSE);
m_oWorkBooks.AttachDispatch( m_oExcelApp.GetWorkbooks(), TRUE ); //没有这条语句,下面打开文件返回失败。

LPDISPATCH lpDisp = NULL;
COleVariant covTrue((short)TRUE);
COleVariant covFalse((short)FALSE);
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
Range  oCurCell;

// 打开文件
lpDisp = m_oWorkBooks.Open( strFilePath,
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing) );
// 获得活动的WorkBook( 工作簿 )
m_oWorkBook.AttachDispatch( lpDisp, TRUE );
// 获得活动的WorkSheet( 工作表 )
m_oWorkSheet.AttachDispatch( m_oWorkBook.GetActiveSheet(), TRUE );
// 获得使用的区域Range( 区域 )
m_oCurrRange.AttachDispatch( m_oWorkSheet.GetUsedRange(), TRUE );

// 获得使用的行数
long lgUsedRowNum = 0;
m_oCurrRange.AttachDispatch( m_oCurrRange.GetRows(), TRUE );
lgUsedRowNum = m_oCurrRange.GetCount();
// 获得使用的列数
long lgUsedColumnNum = 0;
m_oCurrRange.AttachDispatch( m_oCurrRange.GetColumns(), TRUE );
lgUsedColumnNum = m_oCurrRange.GetCount();
// 读取Sheet的名称
CString strSheetName = m_oWorkSheet.GetName();

//得到全部Cells,此时,CurrRange是cells的集合
m_oCurrRange.AttachDispatch( m_oWorkSheet.GetCells(), TRUE );

// 遍历整个Excel表格
 CStringArray* arrayStr;
arrayStr = new CStringArray[lgUsedRowNum];
for ( int i = 0; i < lgUsedRowNum; i++) {
    for ( int j = 1; j <= lgUsedColumnNum; j++) {
        oCurCell.AttachDispatch( m_oCurrRange.GetItem( COleVariant( (long)(i + 1)), COleVariant( (long)j ) ).pdispVal, TRUE );
        VARIANT varItemName = oCurCell.GetText();
        CString strItemName;
        strItemName = varItemName.bstrVal;
      //AfxMessageBox( strItemName );
        // 判断是否是合并的单元格
        VARIANT varMerge = oCurCell.GetMergeCells();
        if ( varMerge.boolVal == -1 ) {
          //AfxMessageBox( _T( "是合并的单元格!" ) );
        } else if ( varMerge.boolVal == 0 ) {
          //AfxMessageBox( _T( "不是合并的单元格!" ) );
        }
        arrayStr[i].Add( strItemName );
    }
}

// 更新列表控件数据
m_pExcelOperDlg->initListCtrlColumn( lgUsedColumnNum );
m_pExcelOperDlg->updateListCtrlData( arrayStr, lgUsedRowNum );

// 释放二维数组
delete[] arrayStr;

// 关闭
m_oWorkBook.Close( covOptional, COleVariant( strFilePath ), covOptional );
m_oWorkBooks.Close();
// 释放
m_oCurrRange.ReleaseDispatch();
m_oWorkSheet.ReleaseDispatch();
m_oWorkSheets.ReleaseDispatch();
m_oWorkBook.ReleaseDispatch();
m_oWorkBooks.ReleaseDispatch();
m_oExcelApp.ReleaseDispatch();
m_oExcelApp.Quit();  // 这条语句是退出Excel程序,任务管理器中的EXCEL进程会自动结束。
  • 打赏
  • 举报
回复
dy452876 2017-11-22
引用 4 楼 zhao4zhong1 的回复:
竟然还能有用VBA for Excel能实现但用VC不能实现的功能?! 仅供参考:
//1.首先要将excel类添加到工程中。
//在ClassWizard中,【Add Class】,在Excel的安装目录找到Excel.exe(Microsoft2003是Excel.exe;2007应该又独立的lib库,这个没有验证),添加必要的几个类:
 // Excel应用对象
_Application  m_oExcelApp;   // Excel程序
_Worksheet  m_oWorkSheet;   // 工作表
_Workbook  m_oWorkBook;   // 工作簿
Workbooks  m_oWorkBooks;  // 工作簿集合
Worksheets  m_oWorkSheets;  // 工作表集合
Range  m_oCurrRange;   // 使用区域
//添加到工程中的文件是excel.h和excel.cpp。
//2.初始化Com库
if (CoInitialize(NULL)!=0) {
    AfxMessageBox("初始化COM支持库失败!");
    exit(1);
}
//3.读取文件中的数据
if (!m_oExcelApp.CreateDispatch( _T( "Excel.Application" ), NULL ) ) {
   ::MessageBox( NULL, _T( "创建Excel服务失败!" ), _T( "错误提示!" ), MB_OK | MB_ICONERROR);
   exit(1);
}

m_oExcelApp.SetVisible(FALSE);
m_oWorkBooks.AttachDispatch( m_oExcelApp.GetWorkbooks(), TRUE ); //没有这条语句,下面打开文件返回失败。

LPDISPATCH lpDisp = NULL;
COleVariant covTrue((short)TRUE);
COleVariant covFalse((short)FALSE);
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
Range  oCurCell;

// 打开文件
lpDisp = m_oWorkBooks.Open( strFilePath,
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing),
    _variant_t(vtMissing) );
// 获得活动的WorkBook( 工作簿 )
m_oWorkBook.AttachDispatch( lpDisp, TRUE );
// 获得活动的WorkSheet( 工作表 )
m_oWorkSheet.AttachDispatch( m_oWorkBook.GetActiveSheet(), TRUE );
// 获得使用的区域Range( 区域 )
m_oCurrRange.AttachDispatch( m_oWorkSheet.GetUsedRange(), TRUE );

// 获得使用的行数
long lgUsedRowNum = 0;
m_oCurrRange.AttachDispatch( m_oCurrRange.GetRows(), TRUE );
lgUsedRowNum = m_oCurrRange.GetCount();
// 获得使用的列数
long lgUsedColumnNum = 0;
m_oCurrRange.AttachDispatch( m_oCurrRange.GetColumns(), TRUE );
lgUsedColumnNum = m_oCurrRange.GetCount();
// 读取Sheet的名称
CString strSheetName = m_oWorkSheet.GetName();

//得到全部Cells,此时,CurrRange是cells的集合
m_oCurrRange.AttachDispatch( m_oWorkSheet.GetCells(), TRUE );

// 遍历整个Excel表格
 CStringArray* arrayStr;
arrayStr = new CStringArray[lgUsedRowNum];
for ( int i = 0; i < lgUsedRowNum; i++) {
    for ( int j = 1; j <= lgUsedColumnNum; j++) {
        oCurCell.AttachDispatch( m_oCurrRange.GetItem( COleVariant( (long)(i + 1)), COleVariant( (long)j ) ).pdispVal, TRUE );
        VARIANT varItemName = oCurCell.GetText();
        CString strItemName;
        strItemName = varItemName.bstrVal;
      //AfxMessageBox( strItemName );
        // 判断是否是合并的单元格
        VARIANT varMerge = oCurCell.GetMergeCells();
        if ( varMerge.boolVal == -1 ) {
          //AfxMessageBox( _T( "是合并的单元格!" ) );
        } else if ( varMerge.boolVal == 0 ) {
          //AfxMessageBox( _T( "不是合并的单元格!" ) );
        }
        arrayStr[i].Add( strItemName );
    }
}

// 更新列表控件数据
m_pExcelOperDlg->initListCtrlColumn( lgUsedColumnNum );
m_pExcelOperDlg->updateListCtrlData( arrayStr, lgUsedRowNum );

// 释放二维数组
delete[] arrayStr;

// 关闭
m_oWorkBook.Close( covOptional, COleVariant( strFilePath ), covOptional );
m_oWorkBooks.Close();
// 释放
m_oCurrRange.ReleaseDispatch();
m_oWorkSheet.ReleaseDispatch();
m_oWorkSheets.ReleaseDispatch();
m_oWorkBook.ReleaseDispatch();
m_oWorkBooks.ReleaseDispatch();
m_oExcelApp.ReleaseDispatch();
m_oExcelApp.Quit();  // 这条语句是退出Excel程序,任务管理器中的EXCEL进程会自动结束。
多谢赵老师回复,我也觉得 实现 是一定 可以实现的,就是还没找到 方法。。
  • 打赏
  • 举报
回复
dy452876 2017-11-22
引用 2 楼 zhao4zhong1 的回复:
创建一个新Sheet,里面内容是旧Sheet的1,3,5行的数据,然后按照新Sheet的数据生成图表?
这样啊,,感觉不够便利。 我看EXCELL宏的代码,感觉就是range,select几个函数用用就搞定了,但是VC里,找不到类似的用法。。。
  • 打赏
  • 举报
回复
赵4老师 2017-11-22
创建一个新Sheet,里面内容是旧Sheet的1,3,5行的数据,然后按照新Sheet的数据生成图表?
  • 打赏
  • 举报
回复
dy452876 2017-11-22
顶下
  • 打赏
  • 举报
回复
相关推荐
发帖
VC/MFC
加入

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2017-11-21 08:58
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……