📄 celldoc.cpp
字号:
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 + -