聊聊如何利用純C語言對EXCEL進行讀寫操作

2022-07-07 14:00:23
如何利用純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 <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工程如下:

這裡寫圖片描述

執行結果:

這裡寫圖片描述

三、最新補充


由於經常有朋友告訴我執行結果是0 ,並將他們的工程發到我郵箱,我試著執行了下,確實發現是0.0 ,程式沒有報錯。

然後,我試著將他們發給我的工程裡的excel檔案或者csv檔案開啟,發現會彈出提示檔案損壞,如果我點選「是」的話,檔案同樣可以繼續開啟,這可能是檔案格式損壞了,所以程式計算不了資料的位置。我簡單的將他們的excel檔案重新另存為了一個excel,便執行成功了。他們的excel問題如下圖。

Excel損壞

損壞後還可以開啟:

損壞

謝謝! 有問題可以,一起討論下,不過希望自己能夠一步從簡到繁的進行偵錯也是一種學習,希望不用直接把程式碼扔過來讓給修改。

相關推薦:《C視訊教學

以上就是聊聊如何利用純C語言對EXCEL進行讀寫操作的詳細內容,更多請關注TW511.COM其它相關文章!