エクセルから値を読み込む
概要
エクセルから値を読み込むサンプルです。少し応用すれば書き込みも出来ます。これは仕事でエクセルに書かれたコード表をテキスト形式にしてC言語の構造体に突っ込みたかったという事情で作成されました。応用範囲はものすごく広いと思います。仕事で使おうと自宅で作ったものなんで公開しても問題はないハズです。これ作っても1円にもならなかったし。仕事の効率が上がって残業代が減ってむしろ損してるくらいなのであまりにも悔しいから公開します。
処理内容
ブックを1つ選択してそのブックに存在するとあるセルの値がついた文字配列を作成してます。とある列の値を全部文字配列に格納します。ブックに存在する全部のシートを見てます。存在しないシートを見ようとすると例外が発生するのでそれで最後のシートまで見たとしてます。下の図と出力結果から何がしたかったかの想像をしてください。
A
B
C
D
E
1
あ
A
?
○
V
2
い
B
?
×
W
3
う
C
?
△
X
4
え
D
?
□
Y
5
お
E
?
☆
Z
A
B
C
D
E
1
あ
1
?
○
V
2
い
2
?
×
W
3
う
3
?
△
X
SHEET1というシート
SHEET3というシート
コード表.XLS
サンプルソース
//-------EXCEL.H START---------------
#pragma warning (disable : 4192)
//存在するパスに直す必要あり
#import "C:\Program Files\Microsoft Office\Office\mso9.dll"
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\vbe6ext.olb"
#import "C:\Program Files\Microsoft Office\Office\excel9.olb" \
rename("DialogBox", "DialogBox2") rename("RGB", "RGB2")
//-------EXCEL.H END-----------------
//-------EXCEL.CPP START-------------
CWinApp theApp;
using namespace std;
using namespace Excel;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// MFC の初期化および初期化失敗時のエラーの出力
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 必要に応じてエラー コードを変更してください。
nRetCode = 1;
}
else
{
// TODO: この位置にアプリケーションの動作を記述してください。
CoInitialize(0);
try{
CString range;
CString value;
//出力ファイル名は絶対パス付きでヨロシク
CStdioFile head("C:\\header.txt",CFile::modeCreate | CFile::modeWrite );
CStdioFile cpp("C:\\cpp.txt",CFile::modeCreate | CFile::modeWrite );
CStdioFile str("C:\\str.txt",CFile::modeCreate | CFile::modeWrite );
// Excel オブジェクトの作成
_ApplicationPtr pApp;
pApp.CreateInstance("Excel.Application");
int sheet = 0;
//入力ファイル名も絶対パス付きでヨロシク
_WorkbookPtr pBook = pApp->Workbooks->Open("c:\\コード表.xls");
_WorksheetPtr pSheet = pBook->Sheets->Item[(long)++sheet];
str.WriteString("const CodeCheck::Pair CodeCheck::m_pair[] = \n");
str.WriteString("{\n");
while(pSheet != NULL)
{
try
{
int cnt = 1;
CString codeNo = CString((char*)pSheet->Name);
//ヘッダーファイルの作成部
CString strHead = "static const char* m_code" + codeNo + "[];\n";
head.WriteString(strHead);
//構造体作成部
CString strstr = " { " + codeNo + ", (char**)m_code" + codeNo + "},\n";
str.WriteString(strstr);
//文字列配列の作成
cpp.WriteString("const char* CodeCheck::m_code" + codeNo + "[] = \n");
cpp.WriteString("{\n");
while(1)
{
range.Format("B%d",cnt);
_variant_t n = pSheet->Range[_variant_t(range.AllocSysString())]->Value;
if(n.vt == VT_NULL || n.vt == VT_EMPTY)
break;
value = CString(n.bstrVal);
cpp.WriteString(" (char*)\"" + value + "\",\n");
cnt++;
}
cpp.WriteString("};\n");
//次のシートへ
pSheet = pBook->Sheets->Item[(long)++sheet];
}
catch(...)
{
break;
}
}
str.WriteString("};\n");
// ファイルの保存
//pBook->Save();
pBook->Close();
// Excel の終了
pApp->Quit();
MessageBox(NULL, "終了しました。", "excel.exe", MB_OK | MB_ICONINFORMATION);
}
catch (_com_error& e){
MessageBox(NULL, e.Description(), "excel.exe", MB_OK | MB_ICONEXCLAMATION);
return -1;
}
}
CoUninitialize();
return nRetCode;
}
//-------EXCEL.CPP END---------------
出力結果
多分こんなのが沢山でます。
//------CPP.CPP START----------------
const char* CodeCheck::m_codeSHEET1[] =
{
(char*)"A",
(char*)"B",
(char*)"C",
(char*)"D",
(char*)"E",
};
const char* CodeCheck::m_codeSHEET3[] =
{
(char*)"0",
(char*)"1",
(char*)"2",
};
//------CPP.TXT END------------------
//------HEADER.TXT START-------------
static const char* m_codeSHEET1[];
static const char* m_codeSHEET3[];
//------HEADER.TXT END---------------
//------STR.TXT START----------------
const CodeCheck::Pair CodeCheck::m_pair[] =
{
{ 1, (char**)m_codeSHEET1},
{ 3, (char**)m_codeSHEET3},
};
//------STR.TXT END-----------------