設(shè)計(jì)師網(wǎng)絡(luò)語(yǔ)南京seo
前言
其實(shí)本文所實(shí)現(xiàn)的功能并非博主要實(shí)現(xiàn)的全部功能,只是全部功能中的一小部分,這里只是為了記錄一下實(shí)現(xiàn)方法,防止后續(xù)忘記,僅供參考。
文章目錄
- 一、實(shí)現(xiàn)效果
- 二、UI設(shè)計(jì)
- 三、程序設(shè)計(jì)
- 3.1 選擇本地表格文件
- 3.2 獲取表格總行列數(shù)
- 3.3 獲取并輸出表格內(nèi)容
- 2.4 操作單元格內(nèi)容
- 四、操作實(shí)例
一、實(shí)現(xiàn)效果
目前實(shí)現(xiàn)的內(nèi)容為,打開(kāi)本地表格文件,打開(kāi)后輸出表格總行數(shù)和總列數(shù),然后打印出表格全部?jī)?nèi)容。測(cè)試表格如下
目前的上位機(jī)頁(yè)面如下
點(diǎn)擊“選擇文件”,選擇本地的表格文件
或者直接輸入文件路徑也可以。然后點(diǎn)擊打開(kāi)文件,在Qt端就可以輸出選中表格的總行數(shù)和總列數(shù),并且將表格的全部?jī)?nèi)容打印出來(lái)。結(jié)果如下
二、UI設(shè)計(jì)
UI只用到了簡(jiǎn)單的兩個(gè)控件,這里列一下。
- QPushButton
“選擇文件”和打開(kāi)文件使用了本控件。 - QLineEdit
文件路徑使用了本控件。
三、程序設(shè)計(jì)
3.1 選擇本地表格文件
“選擇文件”的槽函數(shù)為
void Widget::on_selectfile_Button_clicked()
{QString fileName = QFileDialog::getOpenFileName(this,QStringLiteral("選擇文件"),"F:",QStringLiteral("表格(*xls *xlsx *csv);"));// 將文件路徑顯示到UI控件ui->selectedfilepath_lineEdit->setText(fileName);
}
選中文件后會(huì)將文件路徑顯示到控件selectedfilepath_lineEdit
。
如果需要增加文件類(lèi)型,可以參考下面進(jìn)行修改
QString fileName = QFileDialog::getOpenFileName(this,QStringLiteral("選擇文件"),"F:",QStringLiteral("表格(*xls *xlsx *csv);;圖片(*jpg *png);"));
3.2 獲取表格總行列數(shù)
QAxObject *excel = new QAxObject(this);excel->setControl("Excel.Application");excel->setProperty("Visible", false); //顯示窗體看效果,選擇ture將會(huì)看到excel表格被打開(kāi)excel->setProperty("DisplayAlerts", true);QAxObject *workbooks = excel->querySubObject("WorkBooks"); //獲取工作簿(excel文件)集合QString str = ui->selectedfilepath_lineEdit->text();//打開(kāi)選定的excelworkbooks->dynamicCall("Open(const QString&)", str);QAxObject *workbook = excel->querySubObject("ActiveWorkBook");QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",1);// 獲取行列數(shù)QAxObject *usedRange = worksheet->querySubObject("UsedRange"); //獲取表格中的數(shù)據(jù)范圍QAxObject *rows = usedRange->querySubObject("Rows");getrow = rows->property("Count").toInt(); //獲取行數(shù)QAxObject *column = usedRange->querySubObject("Columns");getcolumn = column->property("Count").toInt(); //獲取列數(shù)qDebug("行數(shù)為:%d 列數(shù)為:%d\n",getrow,getcolumn);
值得注意的是,本程序獲取的是第一個(gè)工作表的總行列數(shù),如需修改,可以修改這個(gè)函數(shù)里的參數(shù)
QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",2);
3.3 獲取并輸出表格內(nèi)容
QVariant var = usedRange->dynamicCall("Value"); // 將所有的數(shù)據(jù)讀取到QVariant容器中保存QList<QList<QVariant>> excel_list; // 用于將QVariant轉(zhuǎn)換為Qlist的二維數(shù)組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數(shù)據(jù)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 操作單元格內(nèi)容
操作表格,歸根結(jié)底還要落到操作單元格上,這里會(huì)給出一個(gè)操作方法
QString ExcelName = worksheet->querySubObject("Cells(int,int)",所在行數(shù),所在列數(shù))->dynamicCall("Value").toString();
四、操作實(shí)例
這里的操作實(shí)例是根據(jù)博主自己需要寫(xiě)的,是為了找出報(bào)文ID和報(bào)文數(shù)據(jù)所在的列索引,這里貼出程序,僅供參考。
// 遍歷出報(bào)文ID和數(shù)據(jù)所屬列數(shù)// 默認(rèn)第一列為時(shí)間,不需要遍歷for (int i = 1;i <= getcolumn;i ++){// 遍歷第一行全部?jī)?nèi)容ExcelName = worksheet->querySubObject("Cells(int,int)",1,i)->dynamicCall("Value").toString();// 查找報(bào)文ID所在列if (ExcelName == "MAKE_CAN_ID(HEX)"){qDebug("報(bào)文ID所在列為:%d",i);messageIDColumn = i;}// 查找數(shù)據(jù)所在列if (ExcelName == "DATA(HEX)"){qDebug("報(bào)文ID所在列為:%d",i);dataColumn = i;// 通常數(shù)據(jù)所在列在報(bào)文ID后面,所以遍歷到數(shù)據(jù)所在列后直接跳出for循環(huán)break;}}qDebug("報(bào)文ID所在列為:%d 數(shù)據(jù)所在列為:%d\n",messageIDColumn,dataColumn);