简易电子表格的设计

简易电子表格的设计

问题描述

设计一个支持基本计算统计功能和其它一些表格管理/处理功能的软件,使用
户可在该软件的支持下,用交互方式进行表格建立、数据输入、数据编辑及其它
一些表格操作。即类似于简易Execel表格处理软件。

基本要求

(1)建立表格:建立空白表格,同时在屏幕上显示,使其处于可输入数据的状
态。用户可指定新建表格的行列数。
(2)输入数据与编辑数据:通过键盘将数据输入到显示在屏幕上的电子表格上。
(3)基本统计计算:可选择按行或列合计、求平均、求最大最小。
(4)排序:使任意指定的行或列中的数据按大小(升或降)排列,对字符型数据,
还可选择大小写敏感。
(5)表格保存:使电子表格以磁盘文件的方式存储在磁盘上,并可随时读入,
供继续处理。
*(6)公式支持:单元格内可输入公式(表达式),使对应单元格的最终内容为公
式的计算结果。公式最基本的形式是算术计算公式,可按名引用其它单元格。

算法思路

void MyExcel::on_ConfirmButton_pressed()
{
    int calculate_row=-1;
    int calculate_column=-1;

    if(ui->RCBox->currentText()=="行")
    {
        calculate_row=ui->lineEdit->text().toInt();
        if(calculate_row<1||calculate_row>ui->tableWidget->columnCount())
         {
             QMessageBox::about(this,"Warning","输入错误的行数");
         }

    }
    else if(ui->RCBox->currentText()=="列")
     {
        calculate_column=ui->lineEdit->text().toInt();
        if(calculate_column<1||calculate_column>ui->tableWidget->columnCount())
         {
             QMessageBox::about(this,"Warning","输入错误的列数");
         }

    }
    if(ui->FunctionBox->currentText()=="合计")
    {
        if(calculate_row!=-1)
        {
            if(SumColumnPos==-1)
            {
                SumColumnPos=ui->tableWidget->columnCount();
                ui->tableWidget->insertColumn(ui->tableWidget->columnCount());
                //计算某一行的合计时,就是插入新的一列,专门用于计算合计的
            }
            double sum=0;
            for(int i=0;i<Column;i++)
            {
                if(ui->tableWidget->item(calculate_row-1,i)==0)
                {
                    QMessageBox::about(this,"Warning","有格没有被定义");
                    break;
                }
                else{
                   sum=sum+ui->tableWidget->item(calculate_row-1,i)->text().toDouble();
                }
                qDebug()<<sum;

            }
            QTableWidgetItem *SUM=new QTableWidgetItem(QString::number(sum));
            ui->tableWidget->setItem(calculate_row-1,SumColumnPos,SUM);
        }
        else if(calculate_column!=-1)
        {
            if(SumRowPos==-1)
            {
                SumRowPos=ui->tableWidget->rowCount();
                 ui->tableWidget->insertRow(ui->tableWidget->rowCount());
                 //就是插入新的一行,专门用于计算合计的
            }
            double sum=0;
            for(int i=0;i<Row;i++)
            {
                if(ui->tableWidget->item(i,calculate_column-1)==0)
                {
                    QMessageBox::about(this,"Warning","有格没有被定义");
                    break;
                }
                else{
                   sum=sum+ui->tableWidget->item(i,calculate_column-1)->text().toDouble();
                }
                qDebug()<<sum;
            }
            QTableWidgetItem *SUM=new QTableWidgetItem(QString::number(sum));
            ui->tableWidget->setItem(SumRowPos,calculate_column-1,SUM);
        }
    }


    else if(ui->FunctionBox->currentText()=="求平均")
        {
        if(calculate_row!=-1)
        {
            if(AverageColumnPos==-1)
            {
                AverageColumnPos=ui->tableWidget->columnCount();
                ui->tableWidget->insertColumn(ui->tableWidget->columnCount());
                //计算某一行的平均时,就是插入新的一列,专门用于计算合计的
            }
            double sum=0;
            for(int i=0;i<Column;i++)
            {
                if(ui->tableWidget->item(calculate_row-1,i)==0)
                {
                    QMessageBox::about(this,"Warning","有格没有被定义");
                    break;
                }
                else{
                   sum=sum+ui->tableWidget->item(calculate_row-1,i)->text().toDouble();
                }
                qDebug()<<sum;

            }
            QTableWidgetItem *Average=new QTableWidgetItem(QString::number(sum/Column));
            ui->tableWidget->setItem(calculate_row-1,AverageColumnPos,Average);
        }
        else if(calculate_column!=-1)
        {
            if(AverageRowPos==-1)
            {
                AverageRowPos=ui->tableWidget->rowCount();
                ui->tableWidget->insertRow(ui->tableWidget->rowCount());
                //计算某一行的平均时,就是插入新的一列,专门用于计算合计的
            }
            double sum=0;
            for(int i=0;i<Row;i++)
            {
                if(ui->tableWidget->item(i,calculate_column-1)==0)
                {
                    QMessageBox::about(this,"Warning","有格没有被定义");
                    break;
                }
                else{
                   sum=sum+ui->tableWidget->item(i,calculate_column-1)->text().toDouble();
                }
                qDebug()<<sum;
            }
            QTableWidgetItem *Average=new QTableWidgetItem(QString::number(sum/Row));
            ui->tableWidget->setItem(AverageRowPos,calculate_column-1,Average);
        }
    }
    else if(ui->FunctionBox->currentText()=="最大值")
        {

        if(calculate_row!=-1)
        {
            if(MaxColumnPos==-1)
            {
                MaxColumnPos=ui->tableWidget->columnCount();
                ui->tableWidget->insertColumn(ui->tableWidget->columnCount());
                //计算某一行的平均时,就是插入新的一列,专门用于计算合计的
            }
            double maxNumber=0;
            for(int i=0;i<Column;i++)
            {
                if(maxNumber<ui->tableWidget->item(calculate_row-1,i)->text().toDouble())
                {
                    if(ui->tableWidget->item(calculate_row-1,i)==0)
                    {
                        QMessageBox::about(this,"Warning","有格没有被定义");
                        break;
                    }
                    else{
                       maxNumber=ui->tableWidget->item(calculate_row-1,i)->text().toDouble();
                    }
                    qDebug()<<maxNumber;
                }

            }
            QTableWidgetItem *MaxNumber=new QTableWidgetItem(QString::number(maxNumber));
            ui->tableWidget->setItem(calculate_row-1,MaxColumnPos,MaxNumber);
        }
        else if(calculate_column!=-1)
        {
            if(MaxRowPos==-1)
            {
                MaxRowPos=ui->tableWidget->rowCount();
                ui->tableWidget->insertRow(ui->tableWidget->rowCount());
                //计算某一行的平均时,就是插入新的一列,专门用于计算合计的
            }
            double maxNumber=0;
            for(int i=0;i<Row;i++)
            {
                if(maxNumber<ui->tableWidget->item(i,calculate_column-1)->text().toDouble())
                {
                    if(ui->tableWidget->item(i,calculate_column-1)==0)
                    {
                        QMessageBox::about(this,"Warning","有格没有被定义");
                        break;
                    }
                    else{
                       maxNumber=ui->tableWidget->item(i,calculate_column-1)->text().toDouble();
                    }
                    qDebug()<<maxNumber;
                }
            }
            QTableWidgetItem *MaxNumber=new QTableWidgetItem(QString::number(maxNumber));
            ui->tableWidget->setItem(MaxRowPos,calculate_column-1,MaxNumber);
        }
    }
    else if(ui->FunctionBox->currentText()=="最小值")
        {

        if(calculate_row!=-1)
        {
            if(MinColumnPos==-1)
            {
                MinColumnPos=ui->tableWidget->columnCount();
                ui->tableWidget->insertColumn(ui->tableWidget->columnCount());
                //计算某一行的平均时,就是插入新的一列,专门用于计算合计的
            }
            double minNumber=ui->tableWidget->item(calculate_row-1,0)->text().toDouble();
            for(int i=0;i<Column;i++)
            {
                if(minNumber>ui->tableWidget->item(calculate_row-1,i)->text().toDouble())
                {
                    if(ui->tableWidget->item(calculate_row-1,i)==0)
                    {
                        QMessageBox::about(this,"Warning","有格没有被定义");
                        break;
                    }
                    else{
                       minNumber=ui->tableWidget->item(calculate_row-1,i)->text().toDouble();
                    }
                    qDebug()<<minNumber;
                }

            }
            QTableWidgetItem *MinNumber=new QTableWidgetItem(QString::number(minNumber));
            ui->tableWidget->setItem(calculate_row-1,MinColumnPos,MinNumber);
        }
        else if(calculate_column!=-1)
        {
            if(MinRowPos==-1)
            {
                MinRowPos=ui->tableWidget->rowCount();
                ui->tableWidget->insertRow(ui->tableWidget->rowCount());
                //计算某一行的平均时,就是插入新的一列,专门用于计算合计的
            }
            double minNumber=ui->tableWidget->item(0,calculate_column-1)->text().toDouble();
            for(int i=0;i<Row;i++)
            {
                if(minNumber>ui->tableWidget->item(i,calculate_column-1)->text().toDouble())
                {
                    if(ui->tableWidget->item(i,calculate_column-1)==0)
                    {
                        QMessageBox::about(this,"Warning","有格没有被定义");
                        break;
                    }
                    else{
                       minNumber=ui->tableWidget->item(i,calculate_column-1)->text().toDouble();
                    }
                    qDebug()<<minNumber;
                }
            }
            QTableWidgetItem *MinNumber=new QTableWidgetItem(QString::number(minNumber));
            ui->tableWidget->setItem(MinRowPos,calculate_column-1,MinNumber);
        }
    }
    else if(ui->FunctionBox->currentText()=="升序排序")
        {
             if(calculate_row!=-1)
             {
                double array[100];
                for(int i=0;i<Column;i++)
                {
                    if(ui->tableWidget->item(calculate_row-1,i)==0)
                    {
                        QMessageBox::about(this,"Warning","有格没有被定义");
                        break;
                    }
                    else{
                       array[i]=ui->tableWidget->item(calculate_row-1,i)->text().toDouble();
                    }

                }
                    std::sort(array,array+Column);
                    for(int i=0;i<Column;i++)
                    {
                        QTableWidgetItem *arrayItem=new QTableWidgetItem(QString::number(array[i]));
                        ui->tableWidget->setItem(calculate_row-1,i,arrayItem);

                    }

             }

             else if(calculate_column!=-1)
             {
                 double array[100];
                 for(int i=0;i<Row;i++)
                 {
                     if(ui->tableWidget->item(i,calculate_column-1)==0)
                     {
                         QMessageBox::about(this,"Warning","有格没有被定义");
                         break;
                     }
                     else{
                        array[i]=ui->tableWidget->item(i,calculate_column-1)->text().toDouble();
                     }

                 }
                 std::sort(array,array+Row);
                 for(int i=0;i<Row;i++)
                 {
                     QTableWidgetItem *arrayItem=new QTableWidgetItem(QString::number(array[i]));
                     ui->tableWidget->setItem(i,calculate_column-1,arrayItem);

                 }

             }




        }

    else if(ui->FunctionBox->currentText()=="降序排序")
        {
             if(calculate_row!=-1)
             {
                double array[100];
                for(int i=0;i<Column;i++)
                {
                    if(ui->tableWidget->item(calculate_row-1,i)==0)
                    {
                        QMessageBox::about(this,"Warning","有格没有被定义");
                        break;
                    }
                    else{
                       array[i]=ui->tableWidget->item(calculate_row-1,i)->text().toDouble();
                    }

                }
                    std::sort(array,array+Column);
                    for(int i=Column-1;i>=0;i--)
                    {

                        QTableWidgetItem *arrayItem=new QTableWidgetItem(QString::number(array[i]));
                        ui->tableWidget->setItem(calculate_row-1,Column-1-i,arrayItem);

                    }

             }

             else if(calculate_column!=-1)
             {
                 double array[100];
                 for(int i=0;i<Row;i++)
                 {
                    if(ui->tableWidget->item(i,calculate_column-1)==0)
                    {
                        QMessageBox::about(this,"Warning","有格没有被定义");
                         break;
                    }
                     else
                     {
                        array[i]=ui->tableWidget->item(i,calculate_column-1)->text().toDouble();
                   }
                 }
                 std::sort(array,array+Row);
                 for(int i=Row-1;i>=0;i--)
                 {

                     QTableWidgetItem *arrayItem=new QTableWidgetItem(QString::number(array[i]));
                     ui->tableWidget->setItem(Row-1-i,calculate_column-1,arrayItem);

                 }

             }
     }

    //调整行列宽度,避免和原来的表格数据混淆
    for(int i=Column;i<ui->tableWidget->columnCount();i++)
    {
        ui->tableWidget->setColumnWidth(i,5);
    }
    for(int i=Column;i<ui->tableWidget->rowCount();i++)
    {
        ui->tableWidget->setRowHeight(i,3);
    }
}
上一篇:tabview-导出excel-测试可以用


下一篇:react 防抖文本框