C语言操作EXCEL文件(读写)

本文主要介绍通过纯C语言进行EXCEL的读写操作:(修改时间2018.08.28,如果运行结果均是0,请看文章最后一节)

  • C语言读操作
  • C语言写操作

在之前需要使用C语言读取Excel文件内容的功能,查阅了很多资料,大部分是通过ODBC或者过OLE/COM对Excel表格的读取操作,这变要求在工程中添加类,如CApplicaton及其头文件等,这包括Excel接口、导入类、头文件等。操作十分复杂,当然我也对这种方法进行了尝试,也实现了功能,这种方法实现的功能比较多,一般我们只是进行简单的读写操作,所以并不是很想使用这种方法。下面通过C语言读写程序来实现。

一、写操作

第一步:单纯C语言写入Excel文件只能是 *.csv的后缀文件(是和txt一样,以二进制文本形式存储,它是以都逗号分隔符做个单元格内容的划分, .xls存储比较复杂, .csv文件可以可以通过.xls或者.xlsx文件另存为,选择.csv文件格式),它们可以通过Notepad++等记事本软件当做txt文件打开。

需要注意的是:当对*.xls文件写入或者读取之后,再打开Excel文件时会弹出格式兼容的提示窗口,因为这样的C语言操作Excel文件是当文本文件打开操作的,所以会忽略原有格式,但是不影响,点击“是(Y)”即可,如下图所示:

第二步:对表格的处理,使用C语言打开表格后,文件指针指向整个表格的第1行第1列。
如果要给它的下一个同行单元格(第1行第2列)写数据,使用"\t" ;
如果要给它的下一个同列单元格(第2行第1列)写数据,使用"\n" 。

具体代码如下:

void writeExcel()
{char chy[4]={ 'x' ,'a' ,'h','w' } ;int data[4]={ 1 , 3 , 6 ,9    };int i ;FILE *fp = NULL ;fp = fopen("G:\\Desktop\\test.csv","w") ;for (i=0 ; i<4 ;i++)fprintf(fp,"%c\t%d\n",chy[i],data[i] ) ;fclose(fp);
}
void main()
{                   writeExcel()  ;
}

运行结果


二、读操作

读取文件


对于读取Excel文件的操作,使用了文件随机定位函数fseek(),它的一般调用格式如下:
fseek(文件指针,位移量,起始位置) ;
**fseek()**参数说明:
位移量
: 指重新定位时的字节偏移数,表示相对于基址的字符数,通常是一个长整型数,可以是整形常量,整形表达式等。如果用整型常量,需要再后面加上字母“L”;如果使用整形表达式需要用“(long)(表达式)”强制转换成长整形。

起始位置
指重新定位时的基准点,也就是基址,用整数或符合常量表示。如下表:
整数 符号常量 对应的起始位置
0 SEEK_SET 文件开头
1 SEEK_CUR 文件指针的当前位置
2 SEEK_END 文件末尾

例如:
fseek(fp , 10L , 0) ;

具体代码如下:

#include <stdio.h>
void main()
{   FILE *fp;char filename[40]  ;int i,j ;float da[6][5] = {0} ;printf(" 输入文件名: ");gets(filename);fp=fopen(filename,"r");     // fp指针指向文件头部for(i = 0 ;i < 6 ; i++)for(j = 0 ;j < 5 ; j++){fscanf(fp,"%f",&da[i][j]);fseek(fp, 5L, SEEK_CUR);   /*fp指针从当前位置向后移动*/}for(i = 0 ;i < 6 ; i++)printf("%f\t%f\t%f\t%f\t%f\t\n",da[i][0],da[i][1],da[i][2],da[i][3],da[i][4]);
}

运行结果


十分抱歉,由于个人疏忽,代码给大家带来麻烦,再次表示抱歉。以上读Excel文件的错误已经解决,代码已经更新,错误的产生是由于fseek( )函数放错了位置,以及其中第二个参数的偏移量的错误,若大家在以后学习中发现读取数据全为0或者读取数据顺序位置不正确,请查阅fseek( )函数的参数使用方法。

另外,上述开发是在CodeBlocks中进行的,如果使用Visual Stdio 2010等版本软件,出现闪退问题,是软件自身bug所致,在main( )函数结尾添加"system(“pause”); 或者getchar( ); " 即可解决,对应的VS2010读Excel实例如下:


例程:

读该Excel文件代码如下:

#include <stdio.h>
void main()
{   FILE *fp;char filename[40]  ;int i,j ;float da[6][5] = {0} ;printf(" 输入文件名: ");gets(filename);fp=fopen("as.csv","r");fseek(fp, 5L, SEEK_SET);   // 从文件第二行开始读取for(i = 0 ;i < 6 ; i++)for(j = 0 ;j < 5 ; j++){fscanf(fp,"%f",&da[i][j]);fseek(fp, 1L, SEEK_CUR);   /*fp指针从当前位置向后移动*/}for(i = 0 ;i < 6 ; i++)printf("%f\t%f\t%f\t%f\t%f\t\n",da[i][0],da[i][1],da[i][2],da[i][3],da[i][4]);getchar() ;
}

VS2010工程如下:

运行结果:

三、最新补充 2018.08.28


由于经常有朋友告诉我运行结果是0 ,并将他们的工程发到我邮箱,我试着运行了下,确实发现是0.0 ,程序没有报错。
然后,我试着将他们发给我的工程里的excel文件或者csv文件打开,发现会弹出提示文件损坏,如果我点击“是”的话,文件同样可以继续打开,这可能是文件格式损坏了,所以程序计算不了数据的位置。我简单的将他们的excel文件重新另存为了一个excel,便运行成功了。他们的excel问题如下图。

损坏后还可以打开:

谢谢! 有问题可以,一起讨论下,不过希望自己能够一步从简到繁的进行调试也是一种学习,希望不用直接把代码扔过来让给修改。

C语言操作EXCEL文件(读写)相关推荐

  1. c语言从excal读取字符串,C语言操作EXCEL文件(读写)

    C语言操作EXCEL文件(读写) 本文主要介绍通过纯C语言进行EXCEL的读写操作:(修改时间2018.08.28,如果运行结果均是0,请看文章最后一节) C语言读操作 C语言写操作 在之前需要使用C ...

  2. C语言操作Excel文件

    一.前言 xlsxio是一个用用于读写 .xlsx 文件的 C 库,其github地址如下: https://github.com/brechtsanders/xlsxio 该库的编写考虑了以下目标: ...

  3. R语言操作excel文件的数据

    简述 令人惊讶的是,网上的教程关于r语言处理excel数据的都是在说如何读.. 下面以用xlsx这个包为例 安装这个包,并读取数据 [两行命令]R语言读取excel数据 操作数据 其实,导入进来之后, ...

  4. 高级知识点:excel4j实现java操作excel文件的读写

    介绍 java操作excel文件最经典的是POI,但是其api 较多,代码量巨大,反复重复 excel4j ap则简洁太多,利用pojo建模,利用注解进行标识@ExcelField(title = & ...

  5. C#在客户端和服务端操作Excel文件

    一.在客户端把数据导入到Excel文件步骤 1.创建Excel application对象,打开或生成Excel文件 //服务端创建StringBuilder对象     System.Text.St ...

  6. python第三方库文件传输_Python第三方库在Excel文件读写中的应用

    Python第三方库在Excel文件读写中的应用 文/刘卫华1 史婷婷2 许学添1 [摘 要]摘 要 [期刊名称]<电子技术与软件工程> [年(卷),期]2019(000)016 [总页数 ...

  7. C#操作Excel文件(转)

    摘要:本文介绍了Excel对象.C#中的受管代码和非受管代码,并介绍了COM组件在.net环境中的使用. 关键词:受管代码:非受管代码:Excel对象:动态连接库 引言 Excel是微软公司办公自动化 ...

  8. 详解Python操作Excel文件

    前言 本篇文章主要总结了一下利用python操作Excel文件的第三方库和方法. 常见库简介 1.xlrd xlrd是一个从Excel文件读取数据和格式化信息的库,支持.xls以及.xlsx文件. 地 ...

  9. java excel导出2007_java操作excel文件,实现批量导出,和导入

    一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...

最新文章

  1. jqgrid 判断是否最后一行_连续数据的条件判断
  2. 从Github一开源项目ADSEC【学习域渗透攻防基础】
  3. 渗透测试靶机搭建_对vulnhub中Android4靶机渗透测试全过程!
  4. 设备树与驱动的关系_裸机程序如何驱动硬件?
  5. 注解_自定义注解_元注解
  6. 基于matlab的pcm系统仿真_深入理解基于RISC-V ISS Spike的仿真系统:探索Spike,pk和fesrv...
  7. [UWP]用画中画模式(CompactOverlay Mode)让用总在最前端显示
  8. python之父子进程间通信
  9. 详细说说ActionScript中function的call()方法和apply()方法
  10. linux中什么目录用来存放系统管理员使用的管理命令,linuxcentos系统目录的详细介绍...
  11. linux基础:快速搭建平台
  12. ELK日志处理之Filebeat工作原理
  13. Win10安装fliqlo时钟屏保教程
  14. java 计时 纳秒_Java精确测量代码运行时间 代码执行时间 纳秒 nanoTime
  15. Arduino与JavaScript开发实例-舵机驱动
  16. 数字摄影测量考试复习名词解释
  17. JAVA基础知识练习(减肥计划、逢七过、不死神兔、百钱百鸡、数组元素求和、数组内容相同、查找、反转、评委打分)
  18. linux查看hive账户权限,Linux用户和权限管理
  19. Debian ISCSI
  20. CRC码的编码、解码(循环冗余校验码)

热门文章

  1. 计算机软件的反向工程,计算机软件反向工程需要满足哪些条件才算合法?
  2. 汽车上的电源模块:BAT、ACC、IGN、ST
  3. kindle资源Get去处
  4. 院士谈量子计算机,孙昌璞院士做客大家讲坛谈量子技术
  5. 河道采砂实时监测算法 yolov5
  6. U盘被分区后恢复方法
  7. 500kW储能变流器(PCS)采用T型三电平模块,结构三维、控制电路、
  8. 蔚来的“未来”有多远?
  9. AWD总结——熟悉环境
  10. 五款免费的安全分析工具