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

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)(表达式)”强制转换成长整形。

起始位置
指重新定位时的基准点,也就是基址,用整数或符合常量表示。如下表:
整数符号常量对应的起始位置
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 < 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问题如下图。
Excel损坏
损坏后还可以打开:
损坏

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

  • 269
    点赞
  • 1387
    收藏
    觉得还不错? 一键收藏
  • 117
    评论
C语言可以通过使用第三方库或者手动操作文件来实现Excel文件读写。以下是两种方法的介绍: 方法一:使用第三方库 1.1 使用libxls库来读取Excel文件 步骤一:下载libxls库 在http://sourceforge.net/projects/libxls/ 上下载libxls库并解压。 步骤二:安装libxls库 打开命令行窗口,进入解压后的文件夹,执行以下命令: ./configure make sudo make install 步骤三:创建程序文件 创建一个新的C程序文件,例如“excel_read.c”。 步骤四:编写代码 在程序文件中添加以下代码: #include <stdio.h> #include <stdlib.h> #include "libxls/xls.h" int main(int argc, char **argv) { xlsWorkBook* pWB; xlsWorkSheet* pWS; xlsCell* pCell; int i, j; if(argc < 2) { printf("Usage: %s filename.xls\n", argv[0]); return 0; } pWB = xls_open(argv[1], "UTF-8"); if (pWB == NULL) { printf("Error opening file %s\n", argv[1]); return 1; } pWS = xls_getWorkSheet(pWB, 0); if (pWS == NULL) { printf("Error opening worksheet\n"); return 1; } for(i=0; i<=pWS->rows.lastrow; i++) { for(j=0; j<=pWS->rows.lastcol; j++) { pCell = xls_cell(pWS, i, j); if (pCell != NULL && pCell->str != NULL) { printf("%s\t", pCell->str); } else { printf("\t"); } } printf("\n"); } xls_close(pWB); return 0; } 该代码用于读取Excel文件中的数据并输出到控制台。 步骤五:编译和运行程序 在命令行窗口中执行以下命令: gcc -o excel_read excel_read.c -lxlsreader ./excel_read filename.xls 其中,“filename.xls”是要读取Excel文件名。 1.2 使用libxl库来写入Excel文件 步骤一:下载libxl库 在http://www.libxl.com/ 上下载libxl库并解压。 步骤二:安装libxl库 打开命令行窗口,进入解压后的文件夹,执行以下命令: ./configure make sudo make install 步骤三:创建程序文件 创建一个新的C程序文件,例如“excel_write.c”。 步骤四:编写代码 在程序文件中添加以下代码: #include <stdio.h> #include "libxl.h" int main() { BookHandle book = xlCreateBook(); SheetHandle sheet = xlBookAddSheet(book, "Sheet1"); int i, j; for(i=0; i<10; i++) { for(j=0; j<10; j++) { xlSheetWriteNum(sheet, i, j, i*j, 0); } } xlBookSave(book, "output.xls"); xlBookRelease(book); return 0; } 该代码用于创建一个Excel文件并写入一些数据。 步骤五:编译和运行程序 在命令行窗口中执行以下命令: gcc -o excel_write excel_write.c -lxl ./excel_write 程序会将生成的Excel文件保存为“output.xls”。 方法二:手动操作文件 2.1 打开Excel文件 可以使用标准C库中的fopen函数来打开Excel文件,例如: FILE* fp = fopen("filename.xls", "rb"); 其中,“rb”表示以二进制模式打开文件。 2.2 读取Excel文件 可以使用标准C库中的fread函数来读取Excel文件中的数据,例如: char buffer[1024]; int readSize = fread(buffer, 1, sizeof(buffer), fp); 其中,“buffer”是用于存储读取数据的缓冲区,“readSize”是实际读取数据的大小。 2.3 写入Excel文件 可以使用标准C库中的fwrite函数来写入数据到Excel文件,例如: char buffer[] = "Hello, world!"; fwrite(buffer, 1, sizeof(buffer), fp); 其中,“buffer”是要写入的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 117
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值