简易电子表格的设计Word文件下载.docx
《简易电子表格的设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《简易电子表格的设计Word文件下载.docx(17页珍藏版)》请在冰点文库上搜索。
SetName()
CYCOleFont:
GetSize()
SetSize()
SetBold()
SetItalic()
SetUnderline()
CPicture:
GetHandle()
GetHPal()
SetHPal()
GetType()
利用这些函数将可视化表格绘制出来。
第二,定义函数CChild:
OnClickMsflexgrid1()将可视化表格打印出来。
同时利用两个for循环,在行和列上分别将A~Z,“和”“最大值”“最小值”“平均值”“行排序”“列排序”“读取”“保存”等字符串显示出来。
第三,使表格成为可编辑状态。
通过if(lRow>
m_FlexGrid.GetRows()||lRow==0)判断点击是否有效。
若有效,则获取FlexGrid控件的窗口矩形并将其转换为客户区矩形,以像素为单位计算选中格的左上角的坐标和选中格的尺寸,形成选中个所在的矩形区域并转换成相对对话框的坐标。
然后获取单元格内容,改变大小并移到选中格位置,显示文本。
第四,求和。
定义函数CChild:
OnButton1()。
先判断是行还是列需要求和,在将所在行(或列)的所有数加起来得到sum并显示。
为方便存取,利用可以将字符转换成浮点数的函数atof和可以将浮点数转换成字符的函数gcvt把获取到的单元格内容来回转换。
第五,求最值。
分别定义函数CChild:
OnButton2()和CChild:
OnButton3()求最大值和最小值。
先判断是行还是列需要求最值,将所在行(或列)的第一个数存放在max(或min)中,并将此数与后面的数次比较。
求最大值时,如果前面的数比后面的数大,则继续向下比较。
否则,将大的数存到max中。
求最小值时,如果前面的数比后面的数小,则继续向下比较。
否则,将小的数存到min中。
比较结束之后,将最终的max(或min)输出。
第六,定义函数CChild:
OnButton8()求平均值。
由于第四步已经求得了所在行(或列)的和sum,因此直接利用sum除以col或row即可得到平均值。
第七,定义函数CChild:
OnButton6()和函数CChild:
OnButton7()进行行(列)排序。
先利用函数current_col=m_FlexGrid.GetCol()获取鼠标所在的列的值,将所在列的所有值存入temp数组,利用选择排序法将temp数组中所有数据进行排序,并将排好序的数组的值重新传回表格。
同理,利用函数current_row=m_FlexGrid.GetRow()获取鼠标所在的列的值,将所在列的所有值存入temp数组,利用选择排序法将temp数组中所有数据进行排序,并将排好序的数组的值重新传回表格。
选择排序法部分的代码为:
for(inti=1;
i<
row;
i++)
{
intlow=i;
for(intj=row;
j>
i;
j--)
{
if(temp[j]<
temp[low])
low=j;
}
doubletp;
tp=temp[i];
temp[i]=temp[low];
temp[low]=tp;
}
第八,定义函数CChild:
OnButton4()和CChild:
OnButton5()进行表格数据的存储和读取。
第九,程序的优化:
建立函数CShezhi:
OnOK(),使表格的行列数可以自行定义。
其主要内容如下:
CDialog:
OnOK();
CChilddlg;
dlg.row=m_row;
dlg.col=m_col;
dlg.DoModal();
4.2程序代码
#include"
stdafx.h"
excel.h"
Child.h"
#include"
ExcelDoc.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
voidCChild:
OnClickMsflexgrid1()//打印表格
{
charc[10];
for(inti=1;
=col;
c[1]='
\0'
;
c[0]=65+(i-1)%26;
m_FlexGrid.SetTextMatrix(0,i,c);
//行输出A~Z
};
charq[]="
和"
charw[]="
最大值"
chare[]="
最小值"
charr[]="
平均值"
m_FlexGrid.SetTextMatrix(0,col+1,q);
//输出字符串“和”
m_FlexGrid.SetTextMatrix(0,col+2,w);
//输出字符串“最大值”
m_FlexGrid.SetTextMatrix(0,col+3,e);
//输出字符串“最小值”
m_FlexGrid.SetTextMatrix(0,col+4,r);
//输出字符串“平均值”
for(i=1;
=row;
gcvt(i,10,c);
m_FlexGrid.SetTextMatrix(i,0,c);
//列输出A~Z
m_FlexGrid.SetTextMatrix(row+1,0,q);
m_FlexGrid.SetTextMatrix(row+2,0,w);
m_FlexGrid.SetTextMatrix(row+3,0,e);
//输出字符串“最小值”
m_FlexGrid.SetTextMatrix(row+4,0,r);
//输出字符串“平均值”
/*****使表格成为可编辑状态*****/
longlCol=m_FlexGrid.GetColSel();
//获取点击的行号
longlRow=m_FlexGrid.GetRowSel();
//获取点击的列号
if(lRow>
m_FlexGrid.GetRows()||lRow==0)//判断点击是否有效
return;
CRectrect;
m_FlexGrid.GetWindowRect(&
rect);
//获取FlexGrid控件的窗口矩形
ScreenToClient(&
//转换为客户区矩形
CDC*pDC=GetDC();
//MSFlexGrid控件的函数的长度单位是“缇(twips)”,需要将其转化为像素,1440缇=1英寸
//计算象素点和缇的转换比例
intnTwipsPerDotX=1440/pDC->
GetDeviceCaps(LOGPIXELSX);
intnTwipsPerDotY=1440/pDC->
GetDeviceCaps(LOGPIXELSY);
//计算选中格的左上角的坐标(象素为单位)
longy=m_FlexGrid.GetRowPos(lRow)/nTwipsPerDotY;
longx=m_FlexGrid.GetColPos(lCol)/nTwipsPerDotX;
//计算选中格的尺寸(象素为单位)。
加1是实际调试中,发现加1后效果更好
longwidth=m_FlexGrid.GetColWidth(lCol)/nTwipsPerDotX+1;
longheight=m_FlexGrid.GetRowHeight(lRow)/nTwipsPerDotY+1;
//形成选中个所在的矩形区域
CRectrc(x,y,x+width,y+height);
//转换成相对对话框的坐标
rc.OffsetRect(rect.left+1,rect.top+1);
CStringstrValue=m_FlexGrid.GetTextMatrix(lRow,lCol);
//获取单元格内容
m_Edit.ShowWindow(SW_SHOW);
//显示控件
m_Edit.MoveWindow(rc);
//改变大小并移到选中格位置
m_Edit.SetWindowText(strValue);
//显示文本
m_Edit.SetFocus();
//获取焦点
}
/*****输入完毕后使edit空间隐藏,并返回值*****/
OnKillfocusEdit1()
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringstrInput;
GetDlgItemText(IDC_EDIT1,strInput);
//获取输入框内容
m_FlexGrid.SetText(strInput);
//设置单元格内容
m_Edit.ShowWindow(SW_HIDE);
/*****求和*****/
OnButton1()
Addyourcontrolnotificationhandlercodehere//求和
doublesum=0;
chart[10];
longcurrent_col=m_FlexGrid.GetCol();
longcurrent_row=m_FlexGrid.GetRow();
if(col+1==current_col)//行求和
{//用col+1判断是行还是列需要求和
for(inti=1;
i++)
sum+=atof(m_FlexGrid.GetTextMatrix(current_row,i));
//atof是将字符转换成浮点数的函数
gcvt(sum,10,t);
//gcvt是将浮点数转换成字符的函数
m_FlexGrid.SetTextMatrix(current_row,col+1,t);
//求和结束后将结果显示
if(row+1==current_row)//列求和
{//用row+1判断是行还是列需要求和
sum=0;
sum+=atof(m_FlexGrid.GetTextMatrix(i,current_col));
//gcvt是将浮点数转换成字符的函数
m_FlexGrid.SetTextMatrix(row+1,current_col,t);
//求和结束后将结果显示
/*****求最大值*****/
OnButton2()
doublemax;
inti=1;
if(col+2==current_col)//指向当前行,求最大值
{//用col+2判断是行还是列需要求最大值
max=atof(m_FlexGrid.GetTextMatrix(i,current_col));
//将当前的第一个值赋给max
for(i=1;
if(max<
atof(m_FlexGrid.GetTextMatrix(current_row,i)))
//max与后面的数进行比较
max=atof(m_FlexGrid.GetTextMatrix(current_row,i));
//如果max小于后面的数,则将该数重新赋给max
gcvt(max,10,t);
m_FlexGrid.SetTextMatrix(current_row,col+2,t);
//将max显示
elseif(row+2==current_row)//指向当前列,求最大值
{//用row+2判断是行还是列需要求最大值
i=1;
max=atof(m_FlexGrid.GetTextMatrix(current_row,i));
atof(m_FlexGrid.GetTextMatrix(i,current_col)))
//max与后面的数进行比较
max=atof(m_FlexGrid.GetTextMatrix(i,current_col));
gcvt(max,10,t);
m_FlexGrid.SetTextMatrix(row+2,current_col,t);
//将max显示
/*****最小值*****/
OnButton3()
doublemin;
//指向当前行,求最小值
if(col+3==current_col)//用col+3判断是行还是列需要求最小值
min=atof(m_FlexGrid.GetTextMatrix(i,col));
//将当前的第一个值赋给min
if(min>
atof(m_FlexGrid.GetTextMatrix(current_row,i)))
//min与后面的数进行比较
min=atof(m_FlexGrid.GetTextMatrix(current_row,i));
//如果min小于后面的数,则将该数重新赋给min
gcvt(min,10,t);
m_FlexGrid.SetTextMatrix(current_row,current_col,t);
//将min显示
elseif(row+3==current_row)//指向当前列,求最小值
{//用row+3判断是行还是列需要求最小值
min=atof(m_FlexGrid.GetTextMatrix(i,current_col));
atof(m_FlexGrid.GetTextMatrix(i,current_col)))
min=atof(m_FlexGrid.GetTextMatrix(i,current_col));
gcvt(min,10,t);
/*****读取存储的值*****/
OnButton4()
externdoublemem[20][20];
//将数组的值一次存入表格
externdoublem_r;
externdoublem_c;
=m_r;
for(intj=1;
j<
=m_c;
j++)
gcvt(mem[i][j],10,t);
m_FlexGrid.SetTextMatrix(i,j,t);
}
/*****存储表格的值******/
OnButton5()
for(intj=1;
mem[i][j]=atof(m_FlexGrid.GetTextMatrix(i,j));
m_r=row;
//用全局变量记录表格的行列数
m_c=col;
EndDialog(0);
/*****列排序*****/
OnButton6()
//获取鼠标所在的列的值
doubletemp[20];
for(intk=1;
k<
k++)//将所在列的所有值存入temp数组
temp[k]=atof(m_FlexGrid.GetTextMatrix(k,current_col));
//用选择排序排列
for(intm=1;
m<
m++)
gcvt(temp[m],10,t);
//将排好序的数组的值重新传回表格
m_FlexGrid.SetTextMatrix(m,current_col,t);
/*****行排序*****/
OnButton7()
//获取表格所在的行
k++)
temp[k]=atof(m_FlexGrid.GetTextMatrix(current_row,k));
//将所在行的值存入数组
for(intj=col;
temp[low])//用选择排序法排序
//将排好序的数组的值回传表格
m_FlexGrid.SetTextMatrix(current_row,m,t);
/*****求平均值*****/
OnButton8()
doubleave;
doublem;
if(current_col==col+4)//用col+4判断是行还是列需要求平均值
m=atof(m_FlexGrid.GetTextMatrix(current_row,col+1));
//利用前面求的的和(COL+1)m直接进行求平均
ave=m/col;
gcvt(ave,10,t);
m_FlexGrid.SetTextMatrix(current_row,col+4,t);
elseif(r