积极答复者
在excel中,"将数据有效性应用于单元格",如何在VS2008中,用程序代码来实现?

问题
答案
-
MFC的COleDispatchDriver的派生类在调用封装的方法返回对象时已经AddRef你不需要再加个引用计数。另外你用MFC的封装类的话,返回值应该传递给一个COleDispatch的派生类的构造函数,名字应该是CValidation之类。你也可以直接调用返回的IDispatch的Invoke函数,调用其Add方法。 参考Validation对象的文档。
Visual C++ MVP- 已标记为答案 XieYide 2016年11月17日 5:15
全部回复
-
-
版主:
您好!
上午按你说的那样我试了下。我没有你说的这个方法。“range.validation.add”。
我的开发环境是,VS2008+EXCEL2013,用的是OLE库。
请见如下代码块。。请版主帮我看看。我还要添加些什么吗?实在是不知道怎么办了。都没有你说的那个方法。请再指点我。再详细点。谢谢啊。
我加载的头文件有“
#include "CApplication.h"
#include "CWorksheets.h"
#include "CWorksheet.h"
#include "CWorkbooks.h"
#include "CWorkbook.h"
#include "CRange.h"
#include "CRanges.h"
#include "CFont0.h":
*
Function:SetCellFormatFormulaSequence
Discription:设置某一列的格式有效性条件为序列 个呼 组呼 全呼
Input: NONE
return:无
*/
void CExcelInterface::SetCellFormatFormulaSequence(CString sDataSource,int startRow, int endRow, int nCol)//设置单元格公式格式
{
//int col = 3;
CStringArray arrstr;
int i;
arrstr.Add(_T("个呼"));
arrstr.Add(_T("组呼"));
arrstr.Add(_T("全呼"));
m_range = m_Worksheet.get_Range(COleVariant(IndexToString(startRow,nCol)),COleVariant(IndexToString(endRow,nCol)));
m_range.get_Validation()->AddRef();
m_range.put_FormulaR1C1Local(COleVariant(arrstr.GetAt(0)));
//m_range.get_Validation()
}/////////////////////////////////////////////
CExcelInterface::CExcelInterface(void)
{
if(AfxOleGetMessageFilter() == NULL)
{
if(!AfxOleInit())
{
m_ExcelOLEValid = FALSE;
//AfxMessageBox(_T("初始化OLE库失败!"));
return;
}
}
/*if(!OpenExcelEngine())
{
return;
}*/
//设置EXCEL可见或隐藏
m_ExcelAPP.put_Visible(FALSE);
m_ExcelAPP.put_UserControl(TRUE);
m_ExcelAPP.put_DisplayFullScreen(FALSE);
m_ExcelAPP.put_DisplayAlerts(FALSE);
lpDisp = NULL;
m_ExcelOLEValid = TRUE;
}
CExcelInterface::~CExcelInterface(void)
{
CloseExcelEngine();
}
BOOL CExcelInterface::ExcelInterfaceisValid()//EXCEL服务器是否可用
{
return (m_ExcelOLEValid);
}
BOOL CExcelInterface::OpenExcelEngine(BOOL bExcelWorkMode, CString cstrfilename)//打开EXCEL服务器
{
if(!m_ExcelAPP.CreateDispatch(_T("Excel.Application"),NULL))
{
AfxMessageBox(_T("启动Excel服务器失败!"));
return FALSE;
}
if(bExcelWorkMode == EXCEL_IMPORT)
{
m_Workbooks.AttachDispatch(m_ExcelAPP.get_Workbooks(),TRUE);
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
lpDisp = m_Workbooks.Open(cstrfilename,covOptional,covOptional,covOptional,covOptional,
covOptional,covOptional,covOptional,covOptional,covOptional,
covOptional,covOptional,covOptional,covOptional,covOptional);
if(lpDisp)
{
//得到Workbook
m_Workbook.AttachDispatch(lpDisp);
//得到Worksheets
m_Worksheets.AttachDispatch((m_Workbook.get_Worksheets()));
//得到当前活跃sheet
//此操作如果单元格正处于编辑状态中,此操作不能返回,会一直等待
lpDisp = m_Workbook.get_ActiveSheet();
m_Worksheet.AttachDispatch(lpDisp);
}
else
{
return FALSE;
}
}
return TRUE;
}
-
MFC的COleDispatchDriver的派生类在调用封装的方法返回对象时已经AddRef你不需要再加个引用计数。另外你用MFC的封装类的话,返回值应该传递给一个COleDispatch的派生类的构造函数,名字应该是CValidation之类。你也可以直接调用返回的IDispatch的Invoke函数,调用其Add方法。 参考Validation对象的文档。
Visual C++ MVP- 已标记为答案 XieYide 2016年11月17日 5:15
-
版主:
您好!
我还有一个问题。还望你解答。代码段如下:
#include "CApplication.h"
下面的黑体是我的数据有效性为序列的数据源,此数据源在另一表为‘数据项’的A2:A4。分别为个呼,组呼,全呼。这个表已经生成了。没有问题。你帮我看看。这个数据源作为参数传进去到如下函数时有个问题。断言出错。
#include "CWorksheets.h"
#include "CWorksheet.h"
#include "CWorkbooks.h"
#include "CWorkbook.h"
#include "CValidation.h"
#include "CRange.h"
#include "CRanges.h"
#include "CFont0.h"
//
typedef enum {
xlValidateInputOnly = 0x00,
xlValidateWholeNumber = 0x01,
xlValidateDecimal = 0x02,
xlValidateList = 0x03,
xlValidateDate = 0x04,
xlValidateTime = 0x05,
xlValidateTextLength = 0x06,
xlValidateCustom = 0x07
}XIDVTYPE;
typedef enum {
xlValidAlertStop = 0x01,
xlValidAlertWarning = 0x02,
xlValidAlertInformation = 0x03
}XIDVAlertStyle;
typedef enum {
xlBetween = 0x01,
xlNotBetween = 0x02,
xlEqual = 0x03,
xlNotEqual = 0x04,
xlGreater = 0x05,
xlGreaterEqual = 0x07,
xlLess = 0x06,
xlLessEqual = 0x08
}XIFormatConditionOperatorType;
//
sDataSource = _T("=INDIRECT(数据项!$A$2:$A$4)");
m_ExcelInterface.SetCellFormatFormulaSequence(xlValidateList,sDataSource,2,1000,3);
/*
Function:SetCellFormatFormulaSequence
Discription:设置某一列的格式有效性条件为序列 个呼 组呼 全呼
Input: NONE
return:无
*/
void CExcelInterface::SetCellFormatFormulaSequence(XIDVTYPE nXIDVType, CString sFormula1, int startRow, int endRow, int nCol)//设置单元格公式格式
{
LPDISPATCH lpValidRange;
m_range = m_Worksheet.get_Range(COleVariant(IndexToString(startRow,nCol)),COleVariant(IndexToString(endRow,nCol)));
lpValidRange = m_range.get_Validation();
m_WorkRangeValid.AttachDispatch(lpValidRange);
m_WorkRangeValid.Delete();
m_WorkRangeValid.Modify(COleVariant((long)nXIDVType),COleVariant((long)xlValidAlertStop),COleVariant((long)xlBetween),COleVariant(sFormula1),COleVariant(sFormula1));
}在Modify的Formula2我没有参数,那我要设置为什么。程序运行到这一句时出错 。
请帮我看看。