Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2095682
  • 博文数量: 909
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 12260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-06 20:50
文章分类

全部博文(909)

文章存档

2008年(909)

我的朋友

分类:

2008-05-06 21:49:03

一起学习
类似EXCEL的报表类库

作者:朱志雄

下载源代码

  此代码是一个电子表格类库,还不是很完善,希望大家给多点意见和建议,我会尽快把相应功能丰富进去的。我的信箱:zzxiong@citiz.net 现在这个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:用类库做的样例



  下载本文示例代码


类似EXCEL的报表类库类似EXCEL的报表类库类似EXCEL的报表类库类似EXCEL的报表类库类似EXCEL的报表类库类似EXCEL的报表类库类似EXCEL的报表类库类似EXCEL的报表类库类似EXCEL的报表类库类似EXCEL的报表类库类似EXCEL的报表类库类似EXCEL的报表类库

阅读(224) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~