C语言操作EXCEL文件(读写)_c语言读取excel表格

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<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

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

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工程如下:

相关推荐

什么是价带和导带?
365bet网址是多少

什么是价带和导带?

📅 07-26 👁️ 9832
科鲁兹发动机号在哪
365彩票客户端下载

科鲁兹发动机号在哪

📅 07-31 👁️ 5966
俄罗斯世预赛大名单出炉:戈洛温,米兰丘克领衔,久巴未入选
「emie品牌」emie是哪个国家的品牌
365bet网址是多少

「emie品牌」emie是哪个国家的品牌

📅 08-23 👁️ 6482
你我贷上边的芝麻信用一般需要多少分才能贷款?
百度贴吧怎么发表自己的帖子 发表帖子的方法一览