程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> VC實現類似EXCEL的報表類庫

VC實現類似EXCEL的報表類庫

編輯:關於VC++

此代碼是一個電子表格類庫,還不是很完善,希望大家給多點意見和建議,我會盡快把相應功能豐富進去的。我的信箱:[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:用類庫做的樣例

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved