近期在进行数据处理时遇到这样一个问题,将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<intRow+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格式数据的提取工作。转换成果如图所示。