基于Qt实现Excel数据的提取

近期在进行数据处理时遇到这样一个问题,将CAD格式的测井曲线进行矢量化后只能使用List输出,经尝试这也是目前仅有最快捷的方法。List出数据后粘贴到Excel中,比较让人烦恼的有两点:一是CAD List出的数据由“于端点”+“X=”+“Y=”+“Z=”组成;二是List复制粘贴时仅能复制一屏幕内容,因此粘贴的数据中间会出现“按ENTER键继续”这一行。请大家看图片。

今天查阅网上文章,发现Qt可以对Excel数据进行处理,因此使用Qt进行读取Excel并对其进行处理。

(1)Qt读取Excel代码

QAxObject excel("Excel.Application");//连接Excel控件
    excel.setProperty("Visible", false);// 不显示窗体
    excel.setProperty("DisplayAlerts", false);  // 不显示任何警告信息。如果为true, 那么关闭时会出现类似"文件已修改,是否保存"的提示
    QAxObject* workbooks = excel.querySubObject("WorkBooks"); // 获取工作簿集合
    QString shotFile = ui.lineEdit->text();
    QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", (shotFile));//"C:/Users/Administrator/Desktop/excelread/B203.xlsx"
    QAxObject* worksheet = workbook->querySubObject("WorkSheets(int)", 1); // 获取工作表集合的工作表1, 即sheet1
    //获取行数,列数
    QAxObject* usedrange = worksheet->querySubObject("UsedRange"); // sheet范围
    int intRowStart = usedrange->property("Row").toInt(); // 起始行数   为1
    int intColStart = usedrange->property("Column").toInt();  // 起始列数 为1
    QAxObject *rows, *columns;
    rows = usedrange->querySubObject("Rows");  // 行
    columns = usedrange->querySubObject("Columns");  // 列
    int intRow = rows->property("Count").toInt(); // 行数
    int intCol = columns->property("Count").toInt();  // 列数

(2)现在问题来了,读取Excel成功了,可是如何实现对上述格式数据进行分裂并跳过中文字符串?

查阅相关文献后发现,Qt的正则表达式可以提取字符串中的数字(浮点型和整型均可)!!!

//Qt正则表达式提取字符串的数字并存储//
    QAxObject* cell ;
    QString aa;
    QRegExp rx("\\d+\\.\\d+|(\\d+)");    
    for(int j=intColStart;j<1+intColStart;j++)
    {
        for(int i=intRowStart;i         {
            cell = worksheet->querySubObject("Cells(int, int)", i, j);  //获单元格值
            aa=cell->dynamicCall("Value2()").toString();
            int pos = 0;
            int writedata=0;
            while ((pos = rx.indexIn(aa, pos)) != -1)//从指定位置循环查找
            {
                float xx=rx.cap().toFloat();
                pos += rx.matchedLength();//累加匹配的长度,便于下次查找
                fprintf(fp1,"%16.6f",xx);
                writedata=1;
            }
            if(writedata==1)
                fprintf(fp1,"\n");
            else
                continue;
        }
    }
    fclose(fp1);

自此,完成了上述Excel格式数据的提取工作。转换成果如图所示。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部