C++实现保存数据至EXCEL
脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用
场景需求
在用C++编程时,往往会有保存数据的需求,比如我做图像处理的工作,经常会想将图片的像素数据保存至Excel中,然后用matlab进行分析或者用于其他方面。
为了解决该需求,本文将为大家提供一个保存数据至EXCEL的函数。我以保存一幅图像数据为例,大家可以根据自己需求进行微调。
功能函数代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | void WritePicToExcel(string name, cv::Mat pic) { // 我这里写了断言,可以根据需要自己调整 CV_Assert(pic.type() == CV_32FC1); ofstream outfile(name); int row = pic.rows; int col = pic.cols; for ( int i = 0; i < row; i++) { // 采用指针读取Mat矩阵的方式提速 float *p = pic.ptr< float >(i); for ( int j = 0; j < col; j++) { // 若需要保存的数据是非nan值,则正常保存;若为nan值,则保存字符“nan” if (p[j] == p[j]) { outfile << p[j] << (j == (col - 1) ? '\n' : '\t' ); } else { outfile << "nan" << (j == (col - 1) ? '\n' : '\t' ); } } } outfile.close(); } |
C++测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include<iostream> #include<fstream> #include<opencv2/opencv.hpp> using namespace std; void WritePicToExcel(string name, cv::Mat pic); int main() { cv::Mat pic = cv::Mat::zeros(1000, 1000, CV_32FC1); for ( int i = 0; i < pic.rows; i++) { for ( int j = 0; j < pic.cols; j++) { pic.at< float >(i, j) = rand () % 255; } } // 人为设置一个nan值检验是否可以有效保存 pic.at< float >(1, 2) = nan( "" ); // 输入的string为保存的文件名,函数其实还可以加点文件格式的判断,有兴趣的自己改进下吧 WritePicToExcel( "test1.xls" , pic); return 0; } void WritePicToExcel(string name, cv::Mat pic) { CV_Assert(pic.type() == CV_32FC1); ofstream outfile(name); int row = pic.rows; int col = pic.cols; for ( int i = 0; i < row; i++) { float *p = pic.ptr< float >(i); for ( int j = 0; j < col; j++) { if (p[j] == p[j]) { outfile << p[j] << (j == (col - 1) ? '\n' : '\t' ); } else { outfile << "nan" << (j == (col - 1) ? '\n' : '\t' ); } } } outfile.close(); } |
测试效果
图1 随机生成的图像矩阵
图2 保存效果图
如上图所示,为了方便,我随机生成了一个1000*1000的图像矩阵,并定义了第二行第三列的点为nan值,保存效果如图2所示,成功!
如果函数有什么可以改进完善的地方,非常欢迎大家指出~
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
最新评论