PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

聊聊如何利用纯C语言对EXCEL进行读写操作

青灯夜游
青灯夜游 转载
2022-07-07 11:03:22 4969浏览

如何利用纯c语言对excel进行读写操作?下面本篇文章给大家介绍一下通过纯c语言进行excel读写操作的方法,希望对大家有所帮助!

在之前需要使用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<p>运行结果</p><p><img src="https://img.php.cn/upload/article/000/000/024/a1fc0edac4daee0c1a2c38737329dae2-1.png" alt="写入文件"><br><img src="https://img.php.cn/upload/article/000/000/024/a1fc0edac4daee0c1a2c38737329dae2-2.png" alt="写入文件"></p><h2><strong>二、读操作</strong></h2><h3><strong>读取文件</strong></h3><p><img src="https://img.php.cn/upload/article/000/000/024/c952046d707d0b8edad6ce2e29587c1c-3.png" alt="打开文件"><br><img src="https://img.php.cn/upload/article/000/000/024/c952046d707d0b8edad6ce2e29587c1c-4.png" alt="读取文件内容"></p><p>对于读取Excel文件的操作,使用了文件随机定位函数<strong>fseek()</strong>,它的一般调用格式如下:<br> fseek(文件指针,位移量,起始位置) ;<br> **fseek()**参数说明:<br> 位移量<br> : 指重新定位时的字节偏移数,表示相对于基址的字符数,通常是一个长整型数,可以是整形常量,整形表达式等。如果用整型常量,需要再后面加上字母“L”;如果使用整形表达式需要用“(long)(表达式)”强制转换成长整形。</p>
  • 起始位置
  • 指重新定位时的基准点,也就是基址,用整数或符合常量表示。如下表:
整数符号常量对应的起始位置
0SEEK_SET文件开头
1SEEK_CUR文件指针的当前位置
2SEEK_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 <p>运行结果</p><p><img src="https://img.php.cn/upload/article/000/000/024/c952046d707d0b8edad6ce2e29587c1c-5.png" alt="运行结果"></p><hr><p><strong>十分抱歉,由于个人疏忽,代码给大家带来麻烦,再次表示抱歉。以上读Excel文件的错误已经解决,代码已经更新,错误的产生是由于fseek( )函数放错了位置,以及其中第二个参数的偏移量的错误,若大家在以后学习中发现读取数据全为0或者读取数据顺序位置不正确,请查阅fseek( )函数的参数使用方法。</strong></p><p><strong>另外,上述开发是在CodeBlocks中进行的,如果使用Visual Stdio 2010等版本软件,出现闪退问题,是软件自身bug所致,在main( )函数结尾添加"system(“pause”); 或者getchar( ); " 即可解决,对应的VS2010读Excel实例如下:</strong></p><hr><p>例程:</p><p><img src="https://img.php.cn/upload/article/000/000/024/c952046d707d0b8edad6ce2e29587c1c-6.png" alt="这里写图片描述"></p><p>读该Excel文件代码如下:</p><pre class="brush:php;toolbar:false">#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 <p>VS2010工程如下:</p><p><img src="https://img.php.cn/upload/article/000/000/024/8719e70cfc8187a991b918d170ac3f33-7.png" alt="这里写图片描述"></p><p>运行结果:</p><p><img src="https://img.php.cn/upload/article/000/000/024/8719e70cfc8187a991b918d170ac3f33-8.png" alt="这里写图片描述"></p><h2>三、最新补充</h2><hr><p>由于经常有朋友告诉我运行结果是0 ,并将他们的工程发到我邮箱,我试着运行了下,确实发现是0.0 ,程序没有报错。</p><p>然后,我试着将他们发给我的工程里的excel文件或者csv文件打开,发现会弹出提示文件损坏,如果我点击“是”的话,文件同样可以继续打开,这可能是文件格式损坏了,所以程序计算不了数据的位置。我简单的将他们的excel文件重新另存为了一个excel,便运行成功了。他们的excel问题如下图。</p><p><img src="https://img.php.cn/upload/article/000/000/024/8c199489060abe3eea489ccf96d2e7d2-9.jpg" alt="Excel损坏"></p><p>损坏后还可以打开:</p><p><img src="https://img.php.cn/upload/article/000/000/024/8c199489060abe3eea489ccf96d2e7d2-10.gif" alt="损坏"></p><p>谢谢! 有问题可以,一起讨论下,不过希望自己能够一步从简到繁的进行调试也是一种学习,希望不用直接把代码扔过来让给修改。</p><p>相关推荐:《<a href="http://www.php.cn/course/list/37.html" target="_blank" textvalue="C视频教程">C视频教程</a>》</p></stdio.h>
声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除