在之前需要使用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工程如下:
執行結果:
由於經常有朋友告訴我執行結果是0 ,並將他們的工程發到我郵箱,我試著執行了下,確實發現是0.0 ,程式沒有報錯。
然後,我試著將他們發給我的工程裡的excel檔案或者csv檔案開啟,發現會彈出提示檔案損壞,如果我點選「是」的話,檔案同樣可以繼續開啟,這可能是檔案格式損壞了,所以程式計算不了資料的位置。我簡單的將他們的excel檔案重新另存為了一個excel,便執行成功了。他們的excel問題如下圖。
損壞後還可以開啟:
謝謝! 有問題可以,一起討論下,不過希望自己能夠一步從簡到繁的進行偵錯也是一種學習,希望不用直接把程式碼扔過來讓給修改。
相關推薦:《C視訊教學》
以上就是聊聊如何利用純C語言對EXCEL進行讀寫操作的詳細內容,更多請關注TW511.COM其它相關文章!