C言語 エクセルを開き、CSVに保存

EXCEL_IO:
エクセルファイルを読み込むクラス。
読み込んだデータをCSVとして吐く。
読み込んだデータを暗号化とかしたいけど、まだ未実装。
  1. /*------------------------------------------------------------
  2. Excel_IO.h
  3. ------------------------------------------------------------*/
  4.  
  5. #include <stdio.h>
  6. #include <string>
  7. #include <iostream>
  8. #include <comdef.h>
  9.  
  10. #ifndef _EXCEL_IO_H_
  11. #define _EXCEL_IO_H_
  12.  
  13. #import "C:\Program Files\Common Files\Microsoft Shared\Office12\MSO.dll" no_namespace rename("DocumentProperties", "DocumentPropertiesXL")
  14. #import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" no_namespace
  15. #import "C:\Program Files\Microsoft Office\Office12\EXCEL.EXE" rename("DialogBox","XLDialogBox"),rename("CopyFile","XLCopyFile"), \
  16. rename("RGB","XLRGB"),rename("ReplaceText","XLReplaceText") \
  17. exclude("IFont", "IPicture") ,no_dual_interfaces
  18.  
  19.  
  20. using namespace std;
  21. using namespace Excel; //名前空間の定義
  22.  
  23. typedef char buftype[64] ;
  24.  
  25. class Excel_IO{
  26.  
  27. FILE* ofp; //出力するCSVのファイルポインタ
  28. buftype **cells; //エクセルのセルデータを格納する配列
  29. int row, col;
  30.  
  31. public:
  32. Excel_IO(){cells = NULL;}
  33. bool read_excel(const char* filename, char c, int r); //引数で与えられたエクセルファイルをオープンし、メモリ(文字列変数)に格納する。読み込むセル範囲はcとrまで
  34. bool output_csv(const char* out_filename); //引数で与えられたCSVファイルに、格納した文字列を書き込む
  35. void encript_cells(); //読み込んだ文字列を暗号化する
  36. ~Excel_IO();
  37.  
  38. private:
  39. void make_excel_map(); //格納するメモリを確保し、cells配列にセルのアドレスを展開する
  40. void free_excel_map(); //確保したメモリをfreeする
  41. };
  42.  
  43. #endif //_EXCEL_IO_H_
  44.  



  1. /*------------------------------------------------------------
  2. Excel_IO.cpp
  3. ------------------------------------------------------------*/
  4.  
  5. #include "Excel_IO.h"
  6.  
  7.  
  8. //引数で与えられたエクセルファイルをオープンし、メモリ(文字列変数)に格納する。読み込むセル範囲はcとrまで
  9. bool Excel_IO::read_excel(const char* filename, char c, int r){
  10. char cell_name[16];
  11. _variant_t data;
  12.  
  13. free_excel_map(); //配列を初期化
  14.  
  15. col = c - 'A' + 1;
  16. row = r;
  17.  
  18. //COMを初期化
  19. CoInitialize( NULL );
  20.  
  21. _ApplicationPtr pXL;
  22.  
  23. //Excelの起動
  24. pXL.CreateInstance(L"Excel.Application");
  25. pXL->Visible = FALSE;
  26.  
  27. //WorkBookを追加する
  28. WorkbooksPtr pBooks = pXL->Workbooks;
  29. _WorkbookPtr pBook = pBooks->Open(filename); //エクセルファイル名
  30.  
  31. //アクティブ・シートを取得
  32. _WorksheetPtr pSheet = pXL->ActiveSheet;
  33.  
  34. make_excel_map(); //メモリ確保
  35.  
  36. for(int i=0; i<row; i++){
  37. for(int j=0; j<col; j++){
  38. sprintf_s(cell_name, "%c%d", 'A'+j, i+1); //セル番号
  39. data = pSheet->Range[cell_name][vtMissing]->Value2; //データをメモリへ格納
  40. strcpy_s(cells[i][j], ( _bstr_t )data);
  41. //fprintf(stderr, "%s %s\n",cell_name, cells[i][j]);
  42. }
  43. }
  44.  
  45. pXL->DisplayAlerts = FALSE;
  46.  
  47. pBook->Close(); // これがないと編集ロックとなる
  48. pSheet.Release(); // これらのreleaseがないとエラーになる
  49. pBook.Release();
  50. pBooks.Release();// Excel終了
  51.  
  52. //Excelを終了する
  53. pXL->Quit();
  54. pXL.Release(); // <-これ必須
  55.  
  56. //COMを閉じる
  57. CoUninitialize();
  58.  
  59. return true;
  60. }
  61.  
  62. //引数で与えられたCSVファイルに、格納した文字列を書き込む
  63. bool Excel_IO::output_csv(const char* out_filename){
  64. ofp = fopen(out_filename, "w");
  65. if(!ofp || !cells)
  66. {
  67. return false;
  68. }
  69.  
  70. for(int i=0; i<row; i++){
  71. for(int j=0; j<col; j++){
  72. //fprintf(stderr, "%s",cells[i][j]);
  73. fprintf(ofp, "%s,", cells[i][j]);
  74. }
  75. fprintf(ofp, "\n");
  76. }
  77.  
  78. fclose(ofp);
  79.  
  80. return true;
  81. }
  82.  
  83. //読み込んだ文字列を暗号化する
  84. void Excel_IO::encript_cells(){
  85. buftype tmp;
  86.  
  87. for(int i=0; i<row; i++){
  88. for(int j=0; j<col; j++){
  89. strcpy_s(tmp, cells[i][j]);
  90. tmp = NULL; //ここで暗号化 ※未実装
  91. strcpy_s(cells[i][j], tmp);
  92. }
  93. }
  94. }
  95.  
  96.  
  97. Excel_IO::~Excel_IO(){
  98. free_excel_map();
  99. }
  100.  
  101. //格納するメモリを確保し、cells配列にセルのアドレスを展開する
  102. void Excel_IO::make_excel_map(){
  103.  
  104. cells = new buftype* [row]; //エクセルのセル用配列を確保
  105. for(int i=0; i<row; i++){
  106. cells[i] = new buftype [col];
  107. }
  108. }
  109.  
  110. //確保したメモリをfreeする
  111. void Excel_IO::free_excel_map(){
  112. if(cells){ //エクセルのセル用配列を開放
  113. for(int i=0; i<row; i++){
  114. delete [] cells[i];
  115. }
  116. delete [] cells;
  117. }
  118. }
  119.  


/***** 利用例 *****
  1. #include "excel_io.h"
  2.  
  3. #define EXCEL_FILE "C:\\tex\\Book1.xls"
  4. #define CSV_FILE "C:\\tex\\temp.csv"
  5.  
  6. #define COL 'G' //CSVに変換するエクセルの列の範囲
  7. #define ROW 149 //CSVに変換するエクセルの行の範囲
  8.  
  9. int main (){
  10.  
  11. Excel_IO eio;
  12.  
  13. eio.read_excel(EXCEL_FILE, COL, ROW);
  14. eio.encript_cells();
  15. eio.output_csv(CSV_FILE);
  16.  
  17. return 0;
  18. }
  19.  
*************/

累計のアクセス数: -
今日のアクセス数: -
昨日のアクセス数 -
最終更新:2011年07月25日 08:53