此代碼是一個電子表格類庫,還不是很完善,希望大家給多點意見和建議,我會盡快把相應功能豐富進去的。我的信箱:[email protected]
現在這個sample不是很完整,我也正在完善中,相應的函數接口到時我會整理成一個文檔發布給大家。
聲明:
對於此代碼中可能引用了其他網站上的一些技術,如果侵犯了相關作者的權益請盡快聯系我,我會刪除其中不合適部分。也請下載此代碼的人尊重代碼的原作者的意願。若下載者要使用此代碼請自行征求原作者的意見。
1.12版本現支持單元格合並,文本對齊方式,字體,字體顏色,表格線定制,單元格讀寫權控制,列排序,動態增刪行列,支持通過剪貼板同其他軟件間的數據進行交互,支持單元格圖形顯示。可根據開發者需要進行二次開發,類庫提供比較豐富的開發接口類函數,支持類似EXCEL的所見機所得的打印預覽。
在下一版本中作者還將加入單元格公式計算,數據庫綁定,圖表顯示,支持HTML文件存儲。
以下為單元格公式解析的部分代碼,大家感興趣可以看一下!
CString CGridCtrl::ParserExpression(CString strExpression)
{
CString strSign; //運算符
CString strRetu;
CString strTmp2;
CString strTmp3;
LPCSTR lpstr;
char strTmp[200];
long nTmp;//,nRetu;
long i,nLen,nStatus;
int nRow,nCol;
strExpression.MakeUpper();
nLen = strExpression.GetLength();
strSign = "+,-,*,/,(,)";
strRetu = "";
nStatus = 0 ; // 0 初始狀態\遇到加減括號等符號 1 字母開始 2 數值開始
nTmp = -1;
memset(strTmp,0,200);
lpstr = strExpression;
for ( i=1; i=0 )||(i+1 >=nLen)) //是運算符號
{
if ((i+1 >= nLen)&&((strExpression.GetAt(i)>=''''0'''') &&
(strExpression.GetAt(i)<=''''9'''')))
{
nStatus = 2;
nTmp++;
strTmp[nTmp] = lpstr[i];//strExpression.GetAt(i);
}
if ((nStatus==2)&&(strExpression.GetAt(i)==''''('''')) nStatus=1;
if ( nStatus==1 ) //非單元格和正常計算數,直接拼串返回
{
strTmp3 = "";
strTmp3.Format("%s",strTmp);
strRetu = strRetu + strTmp3;
}
else if ( nStatus == 2) //正常單元格對象或者數字
{
//項 strRetu = strRetu + "<" + _T(strTmp) + ">";
if (!IsValidCol(strTmp))
{
//return "#NAME!";
strTmp3 = "";
strTmp3.Format("%s",strTmp);
strRetu = strRetu + "(" + strTmp3 + ")";
}
else
{
nRow = 0; nCol = 0;
// strTmp = ParserCell() 遞歸
// MessageBox(strTmp,"ooo",1);
strTmp2.Format("%s",strTmp);
CCellID cell;
if (ConvertStrToCellID(strTmp2,cell))
{
// MessageBox(strTmp,"ooo1111",1);
strTmp3 = ParserCell(cell.row,cell.col);
sprintf(strTmp,"%s",strTmp3.GetBuffer(strTmp3.GetLength()));
strTmp3 = "";
strTmp3.Format("%s",strTmp);
strRetu = strRetu + "(" + strTmp3 + ")";
}
else
return "#INVALID!";
//strRetu = strRetu + "<" + _T(strTmp) + ">";
// MessageBox(strTmp,"ooo2222",1);
}
}
nStatus = 0;
nTmp = -1 ;
memset(strTmp,0,200);
if (!((i+1 >= nLen)&&((strExpression.GetAt(i)>=''''0'''') &&
(strExpression.GetAt(i)<=''''9''''))))
{
strTmp3 = "";
strTmp3.Format("%c",lpstr[i]);//strExpression.GetAt(i));
strRetu = strRetu + strTmp3;
}
}
else if ((strExpression.GetAt(i)>=''''A'''') && (strExpression.GetAt(i)<=''''Z''''))
{
nStatus = 1;
nTmp++;
strTmp[nTmp] = strExpression.GetAt(i);
}
else if ((strExpression.GetAt(i)>=''''0'''') && (strExpression.GetAt(i)<=''''9''''))
{
nStatus = 2;
nTmp++;
strTmp[nTmp] = lpstr[i];//strExpression.GetAt(i);
}
}
return strRetu;
}
圖像1:用類庫做的樣例