⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 celldoc.cpp

📁 类似Excel的设计器源代码,基本实现电子图表的功能
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		
		int nRows=m_ArrayRow.GetSize();
		int i;
		for(i=0;i<nRows;i++)
		{
			pRow=m_ArrayRow[i];
			if(pRow!=NULL)
			{
				pObj=new CCellObj();
				pRow->m_ArrayCell.Add(pObj);
			}
		}
		return TRUE;
	}

	m_warrayCol.InsertAt(nIndex,72);//add Fix Col
	CCellRow *pRow;
	CCellObj *pObj;
		
	int nRows=m_ArrayRow.GetSize();
	int i;
	for(i=0;i<nRows;i++)
	{
		pRow=m_ArrayRow[i];
		if(pRow!=NULL)
		{
			pObj=new CCellObj();
			pRow->m_ArrayCell.InsertAt(nIndex,pObj);
		}
	}
	return TRUE;
}

BOOL CCellDoc::DelRow(int nIndex)//
{
	if((nIndex <0)||(nIndex >=m_warrayRow.GetSize()))
		return FALSE;
	
	m_warrayRow.RemoveAt(nIndex);//del Fix

	if((nIndex <0)||(nIndex >=m_ArrayRow.GetSize()))
		return TRUE;

	CCellRow *pRow=m_ArrayRow[nIndex];
	m_ArrayRow.RemoveAt(nIndex);//del cellrow
	if(pRow!=NULL)
		delete pRow;
	return TRUE;
}

BOOL CCellDoc::DelCol(int nIndex)//
{
	if((nIndex <0)||(nIndex >=m_warrayCol.GetSize()))
		return FALSE;

	m_warrayCol.RemoveAt(nIndex);
	
	CCellRow *pRow;
	CCellObj *pObj;

	int nRows=m_ArrayRow.GetSize();
	int i;
	for(i=0;i<nRows;i++)
	{
		pRow=m_ArrayRow[i];
		if(pRow!=NULL)
		{
			if((nIndex >=0)&&(nIndex < pRow->m_ArrayCell.GetSize()))
			{
				pObj=pRow->m_ArrayCell[nIndex];
				pRow->m_ArrayCell.RemoveAt(nIndex);
				if(pObj!=NULL)
					delete pObj;
			}
		}
	}		
	return TRUE;	
}

//ret=CELL_DATA_XXX
int CCellDoc::GetCellVal(int nRow,int nCol,DOUBLE *pdblVal)//取单元格值
{
	CCellObj *pCell;
	pCell=this->GetCell(nRow,nCol);
	if(pCell==NULL)
		return CELL_DATA_NODATA;

	if(IsDigtal(pCell->m_szDef))
	{
		if(pCell->m_dwFlags & CELL_DATAOK)
		{
			*pdblVal=pCell->m_dblVal;
			return CELL_DATA_NOERR;
		}
		return CELL_DATA_NOTREADY;
	}
	int funNo;
	funNo=GetFunction(pCell->m_szDef);
	if(funNo==FUN_ERROR)
		return CELL_DATA_FUNERROR;
	else if(funNo==FUN_NONE)
		return CELL_DATA_NODATA;
	else
	{
		if(pCell->m_dwFlags & CELL_DATAOK)
		{
			*pdblVal=pCell->m_dblVal;
			return CELL_DATA_NOERR;
		}
		return CELL_DATA_NOTREADY;
	}
	return CELL_DATA_NODATA;
}

//lpszArgs去掉了()如:A1:G1,F2,G4
BOOL CCellDoc::CalFun_Sum(LPCTSTR lpszArgs,DOUBLE *pdblVal)//求和
{
	DOUBLE dblVal=0,dblt;
	int nRow1,nRow2,nCol1,nCol2,i,nLen;
	CString szArgs=lpszArgs,szt;

	char ct;
	szArgs.TrimLeft();
	szArgs.TrimRight();
	szArgs.MakeUpper();
	szt="";
	nLen=szArgs.GetLength();
	for(i=0;i<nLen;i++)
	{
		ct=szArgs[i];
		if(ct==',')
		{
			int rcNum=ParaseRowColArg(szt,
					 &nRow1,&nCol1,
					 &nRow2,&nCol2);//解析字符串表示的行列值;//返回0,1,2表示解析的个数
			if(rcNum==0)
				return FALSE;
			else if(rcNum==1)//一个参数
			{
				if(CELL_DATA_NOERR!=GetCellVal(nRow1,nCol1,&dblt))
					return FALSE;
				dblVal+=dblt;
				szt="";
				continue;
			}
			else
			{
				for(int c=nCol1;c<=nCol2;c++)
				{
					for(int r=nRow1;r<=nRow2;r++)
					{
						if(CELL_DATA_NOERR!=GetCellVal(r,c,&dblt))
							return FALSE;
						dblVal+=dblt;
					}
				}
				szt="";
				continue;
			}
		}
		else
			szt+=ct;
	}
	if(!szt.IsEmpty())
	{
		int rcNum=ParaseRowColArg(szt,
					 &nRow1,&nCol1,
					 &nRow2,&nCol2);//解析字符串表示的行列值;//返回0,1,2表示解析的个数
		if(rcNum==0)
			return FALSE;
		else if(rcNum==1)//一个参数
		{
			if(CELL_DATA_NOERR!=GetCellVal(nRow1,nCol1,&dblt))
				return FALSE;
			dblVal+=dblt;
			szt="";
			
		}
		else
		{
			for(int c=nCol1;c<=nCol2;c++)
			{
				for(int r=nRow1;r<=nRow2;r++)
				{
					if(CELL_DATA_NOERR!=GetCellVal(r,c,&dblt))
						return FALSE;
					dblVal+=dblt;
				}
			}
			szt="";
			
		}
	}
	*pdblVal=dblVal;
	return TRUE;
}

BOOL CCellDoc::CalFun_Average(LPCTSTR lpszArgs,DOUBLE *pdblVal)//求平均值
{
	
	int nCellNum=0;
	DOUBLE dblVal=0,dblt;
	int nRow1,nRow2,nCol1,nCol2,i,nLen;
	CString szArgs=lpszArgs,szt;

	char ct;
	szArgs.TrimLeft();
	szArgs.TrimRight();
	szArgs.MakeUpper();
	szt="";
	nLen=szArgs.GetLength();
	for(i=0;i<nLen;i++)
	{
		ct=szArgs[i];
		if(ct==',')
		{
			int rcNum=ParaseRowColArg(szt,
					 &nRow1,&nCol1,
					 &nRow2,&nCol2);//解析字符串表示的行列值;//返回0,1,2表示解析的个数
			if(rcNum==0)
				return FALSE;
			else if(rcNum==1)//一个参数
			{
				if(CELL_DATA_NOERR!=GetCellVal(nRow1,nCol1,&dblt))
					return FALSE;
				dblVal+=dblt;
				nCellNum++;
				szt="";
				continue;
			}
			else
			{
				for(int c=nCol1;c<=nCol2;c++)
				{
					for(int r=nRow1;r<=nRow2;r++)
					{
						if(CELL_DATA_NOERR!=GetCellVal(r,c,&dblt))
							return FALSE;
						dblVal+=dblt;
						nCellNum++;
					}
				}
				szt="";
				continue;
			}
		}
		else
			szt+=ct;
	}
	if(!szt.IsEmpty())
	{
		int rcNum=ParaseRowColArg(szt,
					 &nRow1,&nCol1,
					 &nRow2,&nCol2);//解析字符串表示的行列值;//返回0,1,2表示解析的个数
		if(rcNum==0)
			return FALSE;
		else if(rcNum==1)//一个参数
		{
			if(CELL_DATA_NOERR!=GetCellVal(nRow1,nCol1,&dblt))
				return FALSE;
			dblVal+=dblt;
			nCellNum++;
			szt="";
			
		}
		else
		{
			for(int c=nCol1;c<=nCol2;c++)
			{
				for(int r=nRow1;r<=nRow2;r++)
				{
					if(CELL_DATA_NOERR!=GetCellVal(r,c,&dblt))
						return FALSE;
					dblVal+=dblt;
					nCellNum++;
				}
			}
			szt="";
			
		}
	}
	*pdblVal=dblVal/nCellNum;
	return TRUE;

}

BOOL CCellDoc::CalFun_Max(LPCTSTR lpszArgs,DOUBLE *pdblVal)//求最大
{
	int nCellNum=0;
	DOUBLE dblVal=0,dblt;
	int nRow1,nRow2,nCol1,nCol2,i,nLen;
	CString szArgs=lpszArgs,szt;

	char ct;
	szArgs.TrimLeft();
	szArgs.TrimRight();
	szArgs.MakeUpper();
	szt="";
	nLen=szArgs.GetLength();
	for(i=0;i<nLen;i++)
	{
		ct=szArgs[i];
		if(ct==',')
		{
			int rcNum=ParaseRowColArg(szt,
					 &nRow1,&nCol1,
					 &nRow2,&nCol2);//解析字符串表示的行列值;//返回0,1,2表示解析的个数
			if(rcNum==0)
				return FALSE;
			else if(rcNum==1)//一个参数
			{
				if(CELL_DATA_NOERR!=GetCellVal(nRow1,nCol1,&dblt))
					return FALSE;
				if(nCellNum==0)
					dblVal=dblt;
				else
				{	
					if(dblVal<dblt)
						dblVal=dblt;
				}
				nCellNum++;
				szt="";
				continue;
			}
			else
			{
				for(int c=nCol1;c<=nCol2;c++)
				{
					for(int r=nRow1;r<=nRow2;r++)
					{
						if(CELL_DATA_NOERR!=GetCellVal(r,c,&dblt))
							return FALSE;
						if(nCellNum==0)
							dblVal=dblt;
						else
						{	
							if(dblVal<dblt)
								dblVal=dblt;
						}
						nCellNum++;
					}
				}
				szt="";
				continue;
			}
		}
		else
			szt+=ct;
	}
	if(!szt.IsEmpty())
	{
		int rcNum=ParaseRowColArg(szt,
					 &nRow1,&nCol1,
					 &nRow2,&nCol2);//解析字符串表示的行列值;//返回0,1,2表示解析的个数
		if(rcNum==0)
			return FALSE;
		else if(rcNum==1)//一个参数
		{
			if(CELL_DATA_NOERR!=GetCellVal(nRow1,nCol1,&dblt))
				return FALSE;
			if(nCellNum==0)
				dblVal=dblt;
			else
			{	
				if(dblVal<dblt)
					dblVal=dblt;
			}
			nCellNum++;
			szt="";
			
		}
		else
		{
			for(int c=nCol1;c<=nCol2;c++)
			{
				for(int r=nRow1;r<=nRow2;r++)
				{
					if(CELL_DATA_NOERR!=GetCellVal(r,c,&dblt))
						return FALSE;
					if(nCellNum==0)
						dblVal=dblt;
					else
					{	
						if(dblVal<dblt)
							dblVal=dblt;
					}
					nCellNum++;
				}
			}
			szt="";
			
		}
	}
	*pdblVal=dblVal;
	return TRUE;
}
BOOL CCellDoc::CalFun_Min(LPCTSTR lpszArgs,DOUBLE *pdblVal)//求最小
{
	int nCellNum=0;
	DOUBLE dblVal=0,dblt;
	int nRow1,nRow2,nCol1,nCol2,i,nLen;
	CString szArgs=lpszArgs,szt;

	char ct;
	szArgs.TrimLeft();
	szArgs.TrimRight();
	szArgs.MakeUpper();
	szt="";
	nLen=szArgs.GetLength();
	for(i=0;i<nLen;i++)
	{
		ct=szArgs[i];
		if(ct==',')
		{
			int rcNum=ParaseRowColArg(szt,
					 &nRow1,&nCol1,
					 &nRow2,&nCol2);//解析字符串表示的行列值;//返回0,1,2表示解析的个数
			if(rcNum==0)
				return FALSE;
			else if(rcNum==1)//一个参数
			{
				if(CELL_DATA_NOERR!=GetCellVal(nRow1,nCol1,&dblt))
					return FALSE;
				if(nCellNum==0)
					dblVal=dblt;
				else
				{	
					if(dblVal>dblt)
						dblVal=dblt;
				}
				nCellNum++;
				szt="";
				continue;
			}
			else
			{
				for(int c=nCol1;c<=nCol2;c++)
				{
					for(int r=nRow1;r<=nRow2;r++)
					{
						if(CELL_DATA_NOERR!=GetCellVal(r,c,&dblt))
							return FALSE;
						if(nCellNum==0)
							dblVal=dblt;
						else
						{	
							if(dblVal>dblt)
								dblVal=dblt;
						}
						nCellNum++;
					}
				}
				szt="";
				continue;
			}
		}
		else
			szt+=ct;
	}
	if(!szt.IsEmpty())
	{
		int rcNum=ParaseRowColArg(szt,
					 &nRow1,&nCol1,
					 &nRow2,&nCol2);//解析字符串表示的行列值;//返回0,1,2表示解析的个数
		if(rcNum==0)
			return FALSE;
		else if(rcNum==1)//一个参数
		{
			if(CELL_DATA_NOERR!=GetCellVal(nRow1,nCol1,&dblt))
				return FALSE;
			if(nCellNum==0)
				dblVal=dblt;
			else
			{	
				if(dblVal>dblt)
					dblVal=dblt;
			}
			nCellNum++;
			szt="";
			
		}
		else
		{
			for(int c=nCol1;c<=nCol2;c++)
			{
				for(int r=nRow1;r<=nRow2;r++)
				{
					if(CELL_DATA_NOERR!=GetCellVal(r,c,&dblt))
						return FALSE;
					if(nCellNum==0)
						dblVal=dblt;
					else
					{	
						if(dblVal>dblt)
							dblVal=dblt;
					}
					nCellNum++;
				}
			}
			szt="";
			
		}
	}
	*pdblVal=dblVal;
	return TRUE;
}

void CCellDoc::SetAllDataNoReady(void)//设置所有数据无效
{
	int nRows=m_ArrayRow.GetSize();
	int i,j,nCols;
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			pObj->m_dwFlags &= ~CELL_DATAOK;
		}
	}
}

void CCellDoc::SetDigtalCellData(void)//设置数据单元数据
{
	int nRows=m_ArrayRow.GetSize();
	int i,j,nCols;
	CString szt;
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			if(IsDigtal(pObj->m_szDef))
			{
				pObj->m_szDef.TrimLeft();
				pObj->m_szDef.TrimRight();
				pObj->m_dblVal=atof(pObj->m_szDef);
				
				pObj->m_dwFlags |= CELL_DATAOK;
			}
		}
	}
}

int  CCellDoc::CalAllFunCell(void)//返回未计算的个数
{
	int nNoCal=0;
	int nRows=m_ArrayRow.GetSize();
	int i,j,nCols;
	CString szt;
	for(i=0;i<nRows;i++)
	{
		CCellRow *pRow=m_ArrayRow[i];
		if(pRow==NULL)
			continue;
		nCols=pRow->m_ArrayCell.GetSize();
		for(j=0;j<nCols;j++)
		{
			CCellObj *pObj;
			pObj=pRow->m_ArrayCell[j];
			
			if(IsTxt(pObj->m_szDef))//文本
				continue;
			if(IsDigtal(pObj->m_szDef))
				continue;
			if(pObj->m_dwFlags & CELL_DATAOK)
				continue;
			
			pObj->m_szDef.TrimLeft();
			pObj->m_szDef.TrimRight();
			int nFunNo=GetFunction(pObj->m_szDef);
			if(nFunNo==FUN_NONE)
				continue;
			else if(nFunNo==FUN_ERROR)
				continue;
			else if(nFunNo==FUN_SUM)
			{
				szt="";	
				int nLen=pObj->m_szDef.GetLength();
				BOOL bs=FALSE;
				for(int k=0;k<nLen;k++)
				{
					char ct=pObj->m_szDef[k];
					if(ct=='(')
					{
						bs=TRUE;
						continue;
					}
					if(ct==')')
						break;
					if(bs)
						szt+=ct;
				}
				DOUBLE dblVal;
				if(CalFun_Sum(szt,&dblVal))
				{
					pObj->m_dblVal=dblVal;
					pObj->m_dwFlags |= CELL_DATAOK;
					CString szdotfmt;
					szdotfmt.Format("%C%C%d%C",'%','.',pObj->m_lDot,'f');
					pObj->m_szDisp.Format(szdotfmt,dblVal);
				}
				else
					nNoCal++;
			}//SUM

			else if(nFunNo==FUN_AVERAGE)
			{
				szt="";	
				int nLen=pObj->m_szDef.GetLength();
				BOOL bs=FALSE;
				for(int k=0;k<nLen;k++)
				{
					char ct=pObj->m_szDef[k];
					if(ct=='(')
					{
						bs=TRUE;
						continue;
					}
					if(ct==')')
						break;
					if(bs)
						szt+=ct;
				}
				DOUBLE dblVal;
				if(CalFun_Average(szt,&dblVal))
				{
					pObj->m_dblVal=dblVal;
					pObj->m_dwFlags |= CELL_DATAOK;
					CString szdotfmt;
					szdotfmt.Format("%C%C%d%C",'%','.',pObj->m_lDot,'f');
					pObj->m_szDisp.Format(szdotfmt,dblVal);
				}
				else
					nNoCal++;
			}//AVERAGE

			else if(nFunNo==FUN_MAX)
			{
				szt="";	
				int nLen=pObj->m_szDef.GetLength();
				BOOL bs=FALSE;
				for(int k=0;k<nLen;k++)
				{
					char ct=pObj->m_szDef[k];
					if(ct=='(')
					{
						bs=TRUE;
						continue;
					}
					if(ct==')')
						break;
					if(bs)
						szt+=ct;
				}
				DOUBLE dblVal;
				if(CalFun_Max(szt,&dblVal))
				{
					pObj->m_dblVal=dblVal;
					pObj->m_dwFlags |= CELL_DATAOK;
					CString szdotfmt;
					szdotfmt.Format("%C%C%d%C",'%','.',pObj->m_lDot,'f');
					pObj->m_szDisp.Format(szdotfmt,dblVal);
				}
				else
					nNoCal++;
			}//MAX
			else if(nFunNo==FUN_MIN)
			{
				szt="";	
				int nLen=pObj->m_szDef.GetLength();
				BOOL bs=FALSE;
				for(int k=0;k<nLen;k++)
				{
					char ct=pObj->m_szDef[k];
					if(ct=='(')
					{
						bs=TRUE;
						continue;
					}
					if(ct==')')
						break;
					if(bs)
						szt+=ct;
				}
				DOUBLE dblVal;
				if(CalFun_Min(szt,&dblVal))
				{
					pObj->m_dblVal=dblVal;
					pObj->m_dwFlags |= CELL_DATAOK;
					CString szdotfmt;
					szdotfmt.Format("%C%C%d%C",'%','.',pObj->m_lDot,'f');
					pObj->m_szDisp.Format(szdotfmt,dblVal);
				}
				else
					nNoCal++;
			}//MIN
			else if(nFunNo==FUN_CURDATE)
			{
				
			}
		}//cols
	}//rows
	return nNoCal;
}

int CCellDoc::ReCalAll(void)//计算所有
{
	SetAllDataNoReady();//请标志
	SetDigtalCellData();//设置数据单元数据
	int nNocal=0,nNocalLast=0;
	for(int i=0;i<15;i++)
	{
		nNocal=CalAllFunCell();//返回未计算的个数
		if(nNocal==0)
			break;
		if(nNocal == nNocalLast)
			break;
		nNocalLast=nNocal;
	}
	UpdateAllViews(NULL);
	return i+1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -