[Qt PC] ローカルテーブルファイルを開いて、その中のすべてのデータを取得します

はじめに
実際、この記事で実装した機能はブロガーが実装したい機能のすべてではなく、全体の機能のほんの一部にすぎません。実装方法をまとめて後から忘れないようにするための参考程度に。

1. 実現効果

現在の実装では、ローカル テーブル ファイルを開き、開いた後にテーブルの行と列の合計数を出力し、テーブルの内容全体を出力します。テストフォームは以下の通りです

テストフォーム
現在のホストコンピュータのページは次のとおりです

パソコンページ

「ファイルを選択」をクリックしてローカルテーブルファイルを選択します。

ドキュメントを選択してください

または、ファイル パスを直接入力することもできます。その後、クリックしてファイルを開くと、選択したテーブルの総行数と列数がQt側で出力され、テーブルの内容全体を印刷することができます。結果は次のとおりです

出力結果

2. UIデザイン

UI は、ここにリストされている 2 つの単純なコントロールのみを使用します。

  • QPushButton
    「ファイルを選択」してファイルを開くには、このコントロールを使用します。
  • QLineEdit
    ファイル パスはこのコントロールを使用します。

3. プログラミング

3.1 ローカルテーブルファイルの選択

「ファイル選択」のスロット機能は、

void Widget::on_selectfile_Button_clicked()
{
    
    
    QString fileName = QFileDialog::getOpenFileName(this,QStringLiteral("选择文件"),"F:",QStringLiteral("表格(*xls *xlsx *csv);"));

    // 将文件路径显示到UI控件
    ui->selectedfilepath_lineEdit->setText(fileName);
}

ファイルを選択すると、ファイル パスがコントロールに表示されますselectedfilepath_lineEdit

ファイルの種類を追加する必要がある場合は、次の変更を参照してください。

QString fileName = QFileDialog::getOpenFileName(this,QStringLiteral("选择文件"),"F:",QStringLiteral("表格(*xls *xlsx *csv);;图片(*jpg *png);"));

3.2 テーブルの行と列の合計数を取得する

    QAxObject *excel = new QAxObject(this);
    excel->setControl("Excel.Application");
    excel->setProperty("Visible", false);    //显示窗体看效果,选择ture将会看到excel表格被打开
    excel->setProperty("DisplayAlerts", true);
    QAxObject *workbooks = excel->querySubObject("WorkBooks");   //获取工作簿(excel文件)集合
    QString str = ui->selectedfilepath_lineEdit->text();
    //打开选定的excel
    workbooks->dynamicCall("Open(const QString&)", str);
    QAxObject *workbook = excel->querySubObject("ActiveWorkBook");
    QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",1);

    // 获取行列数
    QAxObject *usedRange = worksheet->querySubObject("UsedRange");   //获取表格中的数据范围
    QAxObject *rows = usedRange->querySubObject("Rows");
    getrow = rows->property("Count").toInt();  //获取行数
    QAxObject *column = usedRange->querySubObject("Columns");
    getcolumn = column->property("Count").toInt();  //获取列数
    qDebug("行数为:%d   列数为:%d\n",getrow,getcolumn);

このプログラムは最初のワークシートの行と列の合計数を取得することに注意してください。変更する必要がある場合は、この関数のパラメーターを変更できます。

QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",2);

3.3 テーブル内容の取得と出力

    QVariant var = usedRange->dynamicCall("Value");   // 将所有的数据读取到QVariant容器中保存
    QList<QList<QVariant>> excel_list;   // 用于将QVariant转换为Qlist的二维数组
    QVariantList varRows=var.toList();
    if(varRows.isEmpty())
    {
    
    
        return;
    }

    const int row_count = varRows.size();
    QVariantList rowData;
    for(int i=0;i<row_count;++i)
    {
    
    
        rowData = varRows[i].toList();
        excel_list.push_back(rowData);
    }

    //打印excel数据
    for(int i = 0; i<row_count; i++)
    {
    
    
        QList<QVariant> curList = excel_list.at(i);
        int curRowCount = curList.size();
        for(int j = 0; j < curRowCount; j++)
        {
    
    
            qDebug() << curList.at(j).toString();
        }
    }

2.4 セルの内容を操作する

手術台も最終的にはセルを操作することになりますが、その操作方法をご紹介します。

QString ExcelName = worksheet->querySubObject("Cells(int,int)",所在行数,所在列数)->dynamicCall("Value").toString();

4. 運用例

ここでの操作例は、メッセージIDとメッセージデータが配置されているカラムインデックスを検索するというブロガーの独自の要望に基づいて書かれたもので、参考程度にプログラムを掲載しています。

    // 遍历出报文ID和数据所属列数
    // 默认第一列为时间,不需要遍历
    for (int i = 1;i <= getcolumn;i ++)
    {
    
    
        // 遍历第一行全部内容
        ExcelName = worksheet->querySubObject("Cells(int,int)",1,i)->dynamicCall("Value").toString();

        // 查找报文ID所在列
        if (ExcelName == "MAKE_CAN_ID(HEX)")
        {
    
    
            qDebug("报文ID所在列为:%d",i);
            messageIDColumn = i;
        }

        // 查找数据所在列
        if (ExcelName == "DATA(HEX)")
        {
    
    
            qDebug("报文ID所在列为:%d",i);
            dataColumn = i;

            // 通常数据所在列在报文ID后面,所以遍历到数据所在列后直接跳出for循环
            break;
        }
    }
    qDebug("报文ID所在列为:%d   数据所在列为:%d\n",messageIDColumn,dataColumn);

おすすめ

転載: blog.csdn.net/qq_45217381/article/details/133810982