EXCEL_IO:
エクセルファイルを読み込むクラス。
読み込んだデータをCSVとして吐く。
読み込んだデータを暗号化とかしたいけど、まだ未実装。
/*------------------------------------------------------------
Excel_IO.h
------------------------------------------------------------*/
#include <stdio.h>
#include <string>
#include <iostream>
#include <comdef.h>
#ifndef _EXCEL_IO_H_
#define _EXCEL_IO_H_
#import "C:\Program Files\Common Files\Microsoft Shared\Office12\MSO.dll" no_namespace rename("DocumentProperties", "DocumentPropertiesXL")
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" no_namespace
#import "C:\Program Files\Microsoft Office\Office12\EXCEL.EXE" rename("DialogBox","XLDialogBox"),rename("CopyFile","XLCopyFile"), \
rename("RGB","XLRGB"),rename("ReplaceText","XLReplaceText") \
exclude("IFont", "IPicture") ,no_dual_interfaces
using namespace std;
using namespace Excel; //名前空間の定義
typedef char buftype[64] ;
class Excel_IO{
FILE* ofp; //出力するCSVのファイルポインタ
buftype **cells; //エクセルのセルデータを格納する配列
int row, col;
public:
Excel_IO(){cells = NULL;}
bool read_excel(const char* filename, char c, int r); //引数で与えられたエクセルファイルをオープンし、メモリ(文字列変数)に格納する。読み込むセル範囲はcとrまで
bool output_csv(const char* out_filename); //引数で与えられたCSVファイルに、格納した文字列を書き込む
void encript_cells(); //読み込んだ文字列を暗号化する
~Excel_IO();
private:
void make_excel_map(); //格納するメモリを確保し、cells配列にセルのアドレスを展開する
void free_excel_map(); //確保したメモリをfreeする
};
#endif //_EXCEL_IO_H_
/*------------------------------------------------------------
Excel_IO.cpp
------------------------------------------------------------*/
#include "Excel_IO.h"
//引数で与えられたエクセルファイルをオープンし、メモリ(文字列変数)に格納する。読み込むセル範囲はcとrまで
bool Excel_IO::read_excel(const char* filename, char c, int r){
char cell_name[16];
_variant_t data;
free_excel_map(); //配列を初期化
col = c - 'A' + 1;
row = r;
//COMを初期化
CoInitialize( NULL );
_ApplicationPtr pXL;
//Excelの起動
pXL.CreateInstance(L"Excel.Application");
pXL->Visible = FALSE;
//WorkBookを追加する
WorkbooksPtr pBooks = pXL->Workbooks;
_WorkbookPtr pBook = pBooks->Open(filename); //エクセルファイル名
//アクティブ・シートを取得
_WorksheetPtr pSheet = pXL->ActiveSheet;
make_excel_map(); //メモリ確保
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
sprintf_s(cell_name, "%c%d", 'A'+j, i+1); //セル番号
data = pSheet->Range[cell_name][vtMissing]->Value2; //データをメモリへ格納
strcpy_s(cells[i][j], ( _bstr_t )data);
//fprintf(stderr, "%s %s\n",cell_name, cells[i][j]);
}
}
pXL->DisplayAlerts = FALSE;
pBook->Close(); // これがないと編集ロックとなる
pSheet.Release(); // これらのreleaseがないとエラーになる
pBook.Release();
pBooks.Release();// Excel終了
//Excelを終了する
pXL->Quit();
pXL.Release(); // <-これ必須
//COMを閉じる
CoUninitialize();
return true;
}
//引数で与えられたCSVファイルに、格納した文字列を書き込む
bool Excel_IO::output_csv(const char* out_filename){
ofp = fopen(out_filename, "w");
if(!ofp || !cells)
{
return false;
}
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
//fprintf(stderr, "%s",cells[i][j]);
fprintf(ofp, "%s,", cells[i][j]);
}
fprintf(ofp, "\n");
}
fclose(ofp);
return true;
}
//読み込んだ文字列を暗号化する
void Excel_IO::encript_cells(){
buftype tmp;
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
strcpy_s(tmp, cells[i][j]);
tmp = NULL; //ここで暗号化 ※未実装
strcpy_s(cells[i][j], tmp);
}
}
}
Excel_IO::~Excel_IO(){
free_excel_map();
}
//格納するメモリを確保し、cells配列にセルのアドレスを展開する
void Excel_IO::make_excel_map(){
cells = new buftype* [row]; //エクセルのセル用配列を確保
for(int i=0; i<row; i++){
cells[i] = new buftype [col];
}
}
//確保したメモリをfreeする
void Excel_IO::free_excel_map(){
if(cells){ //エクセルのセル用配列を開放
for(int i=0; i<row; i++){
delete [] cells[i];
}
delete [] cells;
}
}
/***** 利用例 *****
#include "excel_io.h"
#define EXCEL_FILE "C:\\tex\\Book1.xls"
#define CSV_FILE "C:\\tex\\temp.csv"
#define COL 'G' //CSVに変換するエクセルの列の範囲
#define ROW 149 //CSVに変換するエクセルの行の範囲
int main (){
Excel_IO eio;
eio.read_excel(EXCEL_FILE, COL, ROW);
eio.encript_cells();
eio.output_csv(CSV_FILE);
return 0;
}
*************/
累計のアクセス数: -
今日のアクセス数: -
昨日のアクセス数 -
最終更新:2011年07月25日 08:53