- °³¿ä
- ¼Ò½º
- ExcelWorkbook.h
- ExcelWorkbook.cpp
- »ùÇÃ
1 °³¿ä
ºñ½ÁÇÑ ÀÏÀ» ÇØµµ COM/C++Àº ÇǰïÇϱ¸³ª...
COM ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇÏ´Â °ÍÀº JET µå¶óÀ̹ö¿Í ºñ±³Çؼ´Â ¼·Î Àå´ÜÀÌ ÀÖ´Ù.
- JET µå¶óÀ̹ö
- ¾Æ¹« ÄÄÇ»ÅÍ¿¡¼³ª µ¹¾Æ°£´Ù.
- ºü¸£´Ù.
- ÀÓÆ÷Æ®ÇÒ ¶§´Â ¼¿ ±æÀÌÀÇ Á¦ÇÑÀÌ ¾øÁö¸¸, ÀͽºÆ÷Æ®ÇÒ ¶§´Â Ä÷³ÀÇ ±æÀ̰¡ 255ÀÚ·Î Á¦ÇѵȴÙ.
- ÀͽºÆ÷Æ®ÇÒ ¶§, »ö±òÀ̶óµçÁö ÆùÆ®¶ó´øÁö¸¦ ÁöÁ¤ÇÒ ¼ö ¾ø´Ù.
- COM
- ¿¢¼¿ÀÌ ¼³Ä¡µÈ ÄÄÇ»ÅÍ¿¡¼¸¸ µ¹¾Æ°£´Ù.
- ´À·Á! ¾Æ¾Ç.
- ÇÁ·Î±×·¡¹ÖÀÌ ¸Å¿ì ±ÍÂú´Ù.
2 ¼Ò½º
µÉ ¼ö ÀÖ´Â ÇÑ ´Ù¸¥ ¼Ò½º¿ÍÀÇ µðÆæ´ø½Ã¸¦ ¾ø¾Ö±â À§Çؼ Ç®¾î¾²´Ùº¸´Ï, ÇÏ´Â ÀÏ¿¡ ºñÇØ Äڵ尡 Á» ±æ¾îÁ³´Ù. include´Â ¾Ë¾Æ¼...
2.1 ExcelWorkbook.h
#pragma once
#include <ole2.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \class cExcelWorkbook
/// \brief ¿¢¼¿ ÀÚµ¿È °ü·Ã ±â´É ÇÔ¼ö ¸ðÀ½
///
/// <pre>
/// cExcelWorkbook a;
/// if (a.Open("C:\\test.xls"))
/// {
/// if (a.SetActiveSheet(1))
/// {
/// int rows = a.GetRowCount();
/// int cols = a.GetColumnCount();
///
/// a.SetCellData(1, 1, L"Hello world");
///
/// wchar_t buf[1024];
/// a.GetCellData(1, 1, buf, ARRAYSIZE(buf));
/// }
/// }
/// </pre>
////////////////////////////////////////////////////////////////////////////////////////////////////
class cExcelWorkbook
{
private:
LPDISPATCH m_ExcelApp; ///< ¿¢¼¿ ¾ÖÇø®ÄÉÀ̼Ç
LPDISPATCH m_ExcelBooks; ///< ¿¢¼¿ ¹®¼ ÁýÇÕ
LPDISPATCH m_ExcelBook; ///< ¿¢¼¿ ¹®¼
LPDISPATCH m_ExcelSheet; ///< ¿¢¼¿ ½ÃÆ®
public:
/// \brief »ý¼ºÀÚ
cExcelWorkbook();
/// \brief ¼Ò¸êÀÚ
virtual ~cExcelWorkbook();
public:
/// \brief ¿¢¼¿ ÆÄÀÏÀ» ¿¬´Ù.
bool Open(LPCWSTR fileName);
/// \brief ¿¢¼¿ ¹®¼¸¦ ÀúÀåÇÑ´Ù.
void Save();
/// \brief ¿¢¼¿ ¹®¼¸¦ ´Ý´Â´Ù.
void Close();
/// \brief ¿¢¼¿ ¾ÖÇø®ÄÉÀÌ¼Ç °¡½Ã¼º ¼³Á¤
bool SetVisible(bool visible);
public:
/// \brief ½ÃÆ®ÀÇ °¹¼ö¸¦ ¹ÝȯÇÑ´Ù.
int GetSheetCount() const;
/// \brief ÇØ´ç À妽ºÀÇ ½ÃÆ® À̸§À» ¹ÝȯÇÑ´Ù.
bool GetSheetName(int sheetIndex, LPWSTR name, size_t length) const;
/// \brief ÇØ´ç À妽ºÀÇ ½ÃÆ® À̸§À» ¼³Á¤ÇÑ´Ù.
bool SetSheetName(int sheetIndex, LPWSTR name);
/// \brief Ȱ¼ºÈµÈ ½ÃÆ®¸¦ ¼³Á¤ÇÑ´Ù.
int GetActiveSheet() const;
/// \brief Ȱ¼ºÈµÈ ½ÃÆ®¸¦ ¼³Á¤ÇÑ´Ù.
bool SetActiveSheet(int sheetIndex);
/// \brief Ȱ¼ºÈµÈ ½ÃÆ®°¡ ÀÖ´ÂÁö üũÇÑ´Ù.
bool HasActiveSheet() const { return m_ExcelSheet != NULL; }
public:
/// \brief »ç¿ë ÁßÀÎ ÇàÀÇ °¹¼ö¸¦ ¹ÝȯÇÑ´Ù.
int GetRowCount() const;
/// \brief »ç¿ë ÁßÀÎ ¿ÀÇ °¹¼ö¸¦ ¹ÝȯÇÑ´Ù.
int GetColumnCount() const;
/// \brief ÇöÀç ½ÃÆ®¿¡¼ µ¥ÀÌÅ͸¦ °¡Á®¿Â´Ù.
bool GetCellData(int row, int column, LPWSTR buffer, size_t length) const;
/// \brief ÇöÀç ½ÃÆ®ÀÇ ¼¿ µ¥ÀÌÅ͸¦ ¼³Á¤ÇÑ´Ù.
bool SetCellData(int row, int column, LPCWSTR data);
public:
/// \brief Á¤¼ö ±â¹Ý À妽º¸¦ Ä÷³ Çì´õ ¹®ÀÚ¿·Î º¯È¯ÇÑ´Ù.
static bool ConvertColumnHeader(int column, LPWSTR result);
/// \brief Á¤¼ö ±â¹Ý À§Ä¡¸¦ ¹®ÀÚ¿ ÇüÅÂÀÇ À§Ä¡·Î º¯È¯ÇÑ´Ù.
static bool ConvertCellPosition(int row, int column, LPWSTR result, size_t length);
private:
/// \brief Range °´Ã¼ »ý¼º. »ç¿ë ÈÄ¿¡´Â ¸±¸®ÁîÇØÁà¾ß ÇÑ´Ù.
LPDISPATCH CreateRangeObject(LPCWSTR position) const;
/// \brief Range °´Ã¼ »ý¼º. »ç¿ë ÈÄ¿¡´Â ¸±¸®ÁîÇØÁà¾ß ÇÑ´Ù.
LPDISPATCH CreateRangeObject(int row, int column) const;
private:
/// \brief º¹»ç »ý¼º ±ÝÁö
cExcelWorkbook(const cExcelWorkbook&) {}
/// \brief ´ëÀÔ ±ÝÁö
cExcelWorkbook& operator = (const cExcelWorkbook&) { return *this; }
};
2.2 ExcelWorkbook.cpp
#include "ExcelWorkbook.h"
#include <comdef.h>
namespace
{
///---------------------------------------------------------------------------------------------
/// Release ±î¸ÔÁö ¸»ÀÚ°í ¸¸µç Ŭ·¡½º
class cScopedDispatch
{
private:
LPDISPATCH m_Dispatch; ///< ½ÇÁ¦ ÀÎÅÍÆäÀ̽º Æ÷ÀÎÅÍ
public:
cScopedDispatch(LPDISPATCH dispatch) : m_Dispatch(dispatch) {}
~cScopedDispatch() { if (m_Dispatch) m_Dispatch->Release(); }
bool IsGood() const { return m_Dispatch != NULL; }
operator LPDISPATCH() { return m_Dispatch; }
private:
cScopedDispatch(const cScopedDispatch&) {}
cScopedDispatch& operator = (const cScopedDispatch&) { return *this; }
};
///---------------------------------------------------------------------------------------------
/// ÀÚµ¿È ÇïÆÛ ÇÔ¼ö
HRESULT Invoke(LPDISPATCH dispatch, WORD autoType, LPVARIANT result, LPOLESTR propertyName, int argCount, ...)
{
HRESULT hr = !ERROR_SUCCESS;
VARIANT* argArray = new VARIANT[argCount + 1];
va_list marker;
va_start(marker, argCount);
try
{
if (dispatch == NULL)
throw L"null dispatch interface";
DISPPARAMS parameters = { NULL, NULL, 0, 0 };
DISPID dispidNamed = DISPID_PROPERTYPUT;
DISPID propertyId;
hr = dispatch->GetIDsOfNames(IID_NULL, &propertyName, 1, LOCALE_USER_DEFAULT, &propertyId);
if (FAILED(hr))
throw L"cannot convert name to dispatch id";
for(int i=0; i<argCount; i++)
argArray[i] = va_arg(marker, VARIANT);
parameters.cArgs = argCount;
parameters.rgvarg = argArray;
if (autoType & DISPATCH_PROPERTYPUT)
{
parameters.cNamedArgs = 1;
parameters.rgdispidNamedArgs = &dispidNamed;
}
hr = dispatch->Invoke(propertyId, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, ¶meters, result, NULL, NULL);
if (FAILED(hr))
{
LPCWSTR err = NULL;
switch (hr)
{
case DISP_E_BADPARAMCOUNT: err = L"DISP_E_BADPARAMCOUNT"; break;
case DISP_E_BADVARTYPE: err = L"DISP_E_BADVARTYPE"; break;
case DISP_E_EXCEPTION: err = L"DISP_E_EXCEPTION"; break;
case DISP_E_MEMBERNOTFOUND: err = L"DISP_E_MEMBERNOTFOUND"; break;
case DISP_E_NONAMEDARGS: err = L"DISP_E_NONAMEDARGS"; break;
case DISP_E_OVERFLOW: err = L"DISP_E_OVERFLOW"; break;
case DISP_E_PARAMNOTFOUND: err = L"DISP_E_PARAMNOTFOUND"; break;
case DISP_E_TYPEMISMATCH: err = L"DISP_E_TYPEMISMATCH"; break;
case DISP_E_UNKNOWNINTERFACE: err = L"DISP_E_UNKNOWNINTERFACE"; break;
case DISP_E_UNKNOWNLCID: err = L"DISP_E_UNKNOWNLCID"; break;
case DISP_E_PARAMNOTOPTIONAL: err = L"DISP_E_PARAMNOTOPTIONAL"; break;
}
throw err;
}
}
catch (LPCWSTR)
{
//Trace::Error(_T("%s"), e);
}
va_end(marker);
delete [] argArray;
return hr;
}
///---------------------------------------------------------------------------------------------
/// ÀÎÅÍÆäÀ̽º °¡Á®¿À±â
LPDISPATCH CreateObject(LPDISPATCH objParent, LPOLESTR name)
{
LPDISPATCH objResult = NULL;
VARIANT vDispatchResult;
VariantInit(&vDispatchResult);
if (SUCCEEDED(Invoke(objParent, DISPATCH_PROPERTYGET, &vDispatchResult, name, 0)))
objResult = vDispatchResult.pdispVal;
return objResult;
}
LPDISPATCH CreateObject(LPDISPATCH objParent, LPOLESTR name, int arg)
{
LPDISPATCH objResult = NULL;
VARIANT vDispatchResult;
VariantInit(&vDispatchResult);
VARIANT vDispatchArg;
vDispatchArg.vt = VT_I4;
vDispatchArg.lVal = arg;
HRESULT hr = Invoke(objParent, DISPATCH_PROPERTYGET, &vDispatchResult, name, 1, vDispatchArg);
if (SUCCEEDED(hr))
objResult = vDispatchResult.pdispVal;
return objResult;
}
LPDISPATCH CreateObject(LPDISPATCH objParent, LPOLESTR name, LPCWSTR arg)
{
LPDISPATCH objResult = NULL;
VARIANT vDispatchResult;
VariantInit(&vDispatchResult);
VARIANT vDispatchArg;
vDispatchArg.vt = VT_BSTR;
vDispatchArg.bstrVal = ::SysAllocString(arg);
HRESULT hr = Invoke(objParent, DISPATCH_PROPERTYGET, &vDispatchResult, name, 1, vDispatchArg);
if (SUCCEEDED(hr))
objResult = vDispatchResult.pdispVal;
VariantClear(&vDispatchArg);
return objResult;
}
///---------------------------------------------------------------------------------------------
/// ¿ÀºêÁ§Æ®¿¡¼ Á¤¼öÇü/¹®ÀÚ¿ °ª °¡Á®¿À±â/¼³Á¤Çϱâ
bool GetIntProperty(LPDISPATCH object, LPOLESTR name, LPINT result)
{
bool success = false;
VARIANT vQueryResult;
VariantInit(&vQueryResult);
if (SUCCEEDED(Invoke(object, DISPATCH_PROPERTYGET, &vQueryResult, name, 0)))
{
if (*result)
*result = vQueryResult.intVal;
success = true;
}
VariantClear(&vQueryResult);
return success;
}
bool SetIntProperty(LPDISPATCH object, LPOLESTR name, INT value)
{
bool success = false;
VARIANT vValueArg;
vValueArg.vt = VT_I4;
vValueArg.lVal = value;
if (SUCCEEDED(Invoke(object, DISPATCH_PROPERTYPUT, NULL, name, 1, vValueArg)))
success = true;
VariantClear(&vValueArg);
return success;
}
bool GetStringProperty(LPDISPATCH object, LPOLESTR name, LPWSTR result, size_t length)
{
bool success = false;
VARIANT vValueResult;
vValueResult.vt = VT_BSTR;
if (SUCCEEDED(Invoke(object, DISPATCH_PROPERTYGET, &vValueResult, name, 0, 0)))
{
if (vValueResult.vt == VT_EMPTY)
{
if (length > 0)
result[0] = L'\0';
}
else
{
VariantChangeType(&vValueResult, &vValueResult, VARIANT_NOUSEROVERRIDE, VT_BSTR);
wcscpy_s(result, length, _bstr_t(vValueResult.bstrVal));
}
success = true;
}
VariantClear(&vValueResult);
return success;
}
bool SetStringProperty(LPDISPATCH object, LPOLESTR name, LPCWSTR value)
{
bool success = false;
VARIANT vValueArg;
vValueArg.vt = VT_BSTR;
vValueArg.bstrVal = ::SysAllocString(_bstr_t(value));
if (SUCCEEDED(Invoke(object, DISPATCH_PROPERTYPUT, NULL, name, 1, vValueArg)))
success = true;
VariantClear(&vValueArg);
return success;
}
///---------------------------------------------------------------------------------------------
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief »ý¼ºÀÚ
////////////////////////////////////////////////////////////////////////////////////////////////////
cExcelWorkbook::cExcelWorkbook()
:
m_ExcelApp(NULL),
m_ExcelBooks(NULL),
m_ExcelBook(NULL),
m_ExcelSheet(NULL)
{
::CoInitialize(NULL);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief ¼Ò¸êÀÚ
////////////////////////////////////////////////////////////////////////////////////////////////////
cExcelWorkbook::~cExcelWorkbook()
{
Save();
Close();
CoUninitialize();
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief ¿¢¼¿ ÆÄÀÏÀ» ¿¬´Ù.
/// \param fileName ÆÄÀÏ À̸§
/// \return bool ¹«»çÈ÷ ¿¾ú´Ù¸é true, ¿¡·¯°¡ ¹ß»ýÇß´Ù¸é false
////////////////////////////////////////////////////////////////////////////////////////////////////
bool cExcelWorkbook::Open(LPCWSTR fileName)
{
Close();
do
{
if (fileName == NULL)
break;
CLSID classId;
if (FAILED(CLSIDFromProgID(L"Excel.Application", &classId)))
break;
if (FAILED(CoCreateInstance(classId, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&m_ExcelApp)))
break;
m_ExcelBooks = CreateObject(m_ExcelApp, L"Workbooks");
if (m_ExcelBooks == NULL)
break;
m_ExcelBook = CreateObject(m_ExcelBooks, L"Open", fileName);
} while (0);
if (m_ExcelApp && m_ExcelBooks && m_ExcelBook)
{
return true;
}
else
{
Close();
return false;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief ¿¢¼¿ ¹®¼¸¦ ÀúÀåÇÑ´Ù.
////////////////////////////////////////////////////////////////////////////////////////////////////
void cExcelWorkbook::Save()
{
if (m_ExcelBook)
Invoke(m_ExcelBook, DISPATCH_METHOD, NULL, L"Save", 0);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief ¿¢¼¿ ¹®¼¸¦ ´Ý´Â´Ù.
////////////////////////////////////////////////////////////////////////////////////////////////////
void cExcelWorkbook::Close()
{
if (m_ExcelApp)
{
Invoke(m_ExcelApp, DISPATCH_METHOD, NULL, L"Quit", 0);
if (m_ExcelSheet) { m_ExcelSheet->Release(); m_ExcelSheet = NULL; }
if (m_ExcelBook) { m_ExcelBook->Release(); m_ExcelBook = NULL; }
if (m_ExcelBooks) { m_ExcelBooks->Release(); m_ExcelBooks = NULL; }
if (m_ExcelApp) { m_ExcelApp->Release(); m_ExcelApp = NULL; }
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief ¿¢¼¿ ¾ÖÇø®ÄÉÀÌ¼Ç °¡½Ã¼º ¼³Á¤
/// \param visible º¸ÀÌ°Ô ÇÏ°í ½Í´Ù¸é true, ¾Æ´Ï¶ó¸é false
/// \return bool ¹«»çÈ÷ ¼³Á¤Çß´Ù¸é true, ¿¡·¯°¡ ¹ß»ýÇß´Ù¸é false
////////////////////////////////////////////////////////////////////////////////////////////////////
bool cExcelWorkbook::SetVisible(bool visible)
{
return m_ExcelApp && SetIntProperty(m_ExcelApp, L"Visible", visible ? 1 : 0);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief ½ÃÆ®ÀÇ °¹¼ö¸¦ ¹ÝȯÇÑ´Ù.
/// \return int ½ÃÆ®ÀÇ °¹¼ö. ¿¡·¯ ¹ß»ý½Ã -1
////////////////////////////////////////////////////////////////////////////////////////////////////
int cExcelWorkbook::GetSheetCount() const
{
int count = -1;
if (m_ExcelApp)
{
cScopedDispatch objWorksheets(CreateObject(m_ExcelApp, L"Worksheets"));
if (objWorksheets.IsGood())
GetIntProperty(objWorksheets, L"Count", &count);
}
return count;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief ÇØ´ç À妽ºÀÇ ½ÃÆ® À̸§À» ¹ÝȯÇÑ´Ù.
/// \param sheetIndex ½ÃÆ® À妽º
/// \param result À̸§À» Áý¾î³ÖÀ» ¹öÆÛ
/// \param length ¹öÆÛÀÇ ±æÀÌ
/// \return bool ¹«»çÈ÷ À̸§À» ¾ò¾î¿Ô´Ù¸é true, ¿¡·¯°¡ ¹ß»ýÇß´Ù¸é false
////////////////////////////////////////////////////////////////////////////////////////////////////
bool cExcelWorkbook::GetSheetName(int sheetIndex, LPWSTR name, size_t length) const
{
bool success = false;
if (m_ExcelApp)
{
cScopedDispatch objSheet(CreateObject(m_ExcelApp, L"Worksheets", sheetIndex));
if (objSheet.IsGood())
success = GetStringProperty(objSheet, L"Name", name, length);
}
return success;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief ÇØ´ç À妽ºÀÇ ½ÃÆ® À̸§À» ¼³Á¤ÇÑ´Ù.
/// \param sheetIndex ½ÃÆ® À妽º
/// \param name À̸§
/// \return bool ¹«»çÈ÷ À̸§À» ¼³Á¤Çß´Ù¸é true, ¿¡·¯°¡ ¹ß»ýÇß´Ù¸é false
////////////////////////////////////////////////////////////////////////////////////////////////////
bool cExcelWorkbook::SetSheetName(int sheetIndex, LPWSTR name)
{
bool success = false;
if (m_ExcelApp)
{
cScopedDispatch objSheet(CreateObject(m_ExcelApp, L"Worksheets", sheetIndex));
if (objSheet.IsGood())
success = SetStringProperty(objSheet, L"Name", name);
}
return success;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief Ȱ¼ºÈµÈ ½ÃÆ®¸¦ ¼³Á¤ÇÑ´Ù.
/// \return int ½ÃÆ® À妽º. ¿¡·¯ ¹ß»ý½Ã -1
////////////////////////////////////////////////////////////////////////////////////////////////////
int cExcelWorkbook::GetActiveSheet() const
{
int sheetIndex = -1;
if (m_ExcelSheet)
GetIntProperty(m_ExcelSheet, L"Index", &sheetIndex);
return sheetIndex;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief Ȱ¼ºÈµÈ ½ÃÆ®¸¦ ¼³Á¤ÇÑ´Ù.
/// \param sheetIndex ½ÃÆ® À妽º
/// \return bool ¹«»çÈ÷ ¼³Á¤Çß´Ù¸é true, ¹º°¡ ¿¡·¯°¡ »ý°å´Ù¸é false
////////////////////////////////////////////////////////////////////////////////////////////////////
bool cExcelWorkbook::SetActiveSheet(int sheetIndex)
{
if (m_ExcelSheet)
{
m_ExcelSheet->Release();
m_ExcelSheet = NULL;
}
if (m_ExcelApp)
m_ExcelSheet = CreateObject(m_ExcelApp, L"Worksheets", sheetIndex);
return m_ExcelSheet != NULL;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief »ç¿ë ÁßÀÎ ÇàÀÇ °¹¼ö¸¦ ¹ÝȯÇÑ´Ù.
/// \return int ÇàÀÇ °¹¼ö. ¿¡·¯ ¹ß»ý½Ã < 0
////////////////////////////////////////////////////////////////////////////////////////////////////
int cExcelWorkbook::GetRowCount() const
{
int count = -1;
if (m_ExcelSheet)
{
cScopedDispatch objUsedRange(CreateObject(m_ExcelSheet, L"UsedRange"));
if (objUsedRange.IsGood())
{
cScopedDispatch objRows(CreateObject(objUsedRange, L"Rows"));
if (objRows.IsGood())
GetIntProperty(objRows, L"Count", &count);
}
}
return count;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief »ç¿ë ÁßÀÎ ¿ÀÇ °¹¼ö¸¦ ¹ÝȯÇÑ´Ù.
/// \return int ¿ÀÇ °¹¼ö. ¿¡·¯ ¹ß»ý½Ã < 0
////////////////////////////////////////////////////////////////////////////////////////////////////
int cExcelWorkbook::GetColumnCount() const
{
int count = -1;
if (m_ExcelSheet)
{
cScopedDispatch objUsedRange(CreateObject(m_ExcelSheet, L"UsedRange"));
if (objUsedRange.IsGood())
{
cScopedDispatch objCols(CreateObject(objUsedRange, L"Columns"));
if (objCols.IsGood())
GetIntProperty(objCols, L"Count", &count);
}
}
return count;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief ÇöÀç ½ÃÆ®¿¡¼ µ¥ÀÌÅ͸¦ °¡Á®¿Â´Ù.
/// \param row ¼¿ À§Ä¡. 1ºÎÅÍ ½ÃÀÛÇÑ´Ù.
/// \param column ¼¿ À§Ä¡. 1ºÎÅÍ ½ÃÀÛÇÑ´Ù.
/// \param buffer ¼¿ µ¥ÀÌÅ͸¦ Áý¾î³ÖÀ» ¹öÆÛ Æ÷ÀÎÅÍ
/// \param length ¹öÆÛÀÇ ±æÀÌ (¹ÙÀÌÆ® ±æÀ̰¡ ¾Æ´Ï¶ó WORD ±æÀÌ)
/// \return bool ¹«»çÈ÷ °¡Á®¿Ô´Ù¸é true, ¿¡·¯°¡ ¹ß»ýÇß´Ù¸é false
////////////////////////////////////////////////////////////////////////////////////////////////////
bool cExcelWorkbook::GetCellData(int row, int column, LPWSTR buffer, size_t length) const
{
bool success = false;
if (m_ExcelSheet && buffer)
{
cScopedDispatch objRange(CreateRangeObject(row, column));
if (objRange.IsGood())
success = GetStringProperty(objRange, L"Value", buffer, length);
}
return success;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief ÇöÀç ½ÃÆ®ÀÇ ¼¿ µ¥ÀÌÅ͸¦ ¼³Á¤ÇÑ´Ù.
/// \param row ¼¿ À§Ä¡. 1ºÎÅÍ ½ÃÀÛÇÑ´Ù.
/// \param column ¼¿ À§Ä¡. 1ºÎÅÍ ½ÃÀÛÇÑ´Ù.
/// \param data ¼¿ µ¥ÀÌÅÍ Æ÷ÀÎÅÍ
/// \return bool ¹«»çÈ÷ ¼³Á¤Çß´Ù¸é true, ¿¡·¯°¡ ¹ß»ýÇß´Ù¸é false
////////////////////////////////////////////////////////////////////////////////////////////////////
bool cExcelWorkbook::SetCellData(int row, int column, LPCWSTR data)
{
bool success = false;
if (m_ExcelSheet && data)
{
cScopedDispatch objRange(CreateRangeObject(row, column));
if (objRange.IsGood())
success = SetStringProperty(objRange, L"Value", data);
}
return success;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief Range °´Ã¼ »ý¼º. »ç¿ë ÈÄ¿¡´Â ¸±¸®ÁîÇØÁà¾ß ÇÑ´Ù.
/// \param position À§Ä¡ ¹®ÀÚ¿
/// \return LPDISPATCH »ý¼ºÇÑ Range °´Ã¼
////////////////////////////////////////////////////////////////////////////////////////////////////
LPDISPATCH cExcelWorkbook::CreateRangeObject(LPCWSTR position) const
{
LPDISPATCH objRange = NULL;
if (m_ExcelSheet && position)
{
_bstr_t rangeSpec;
rangeSpec = position;
rangeSpec += L":";
rangeSpec += position;
objRange = CreateObject(m_ExcelSheet, L"Range", rangeSpec);
}
return objRange;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief Range °´Ã¼ »ý¼º. »ç¿ë ÈÄ¿¡´Â ¸±¸®ÁîÇØÁà¾ß ÇÑ´Ù.
/// \param row ¼¿ À§Ä¡. 1ºÎÅÍ ½ÃÀÛÇÑ´Ù.
/// \param column ¼¿ À§Ä¡. 1ºÎÅÍ ½ÃÀÛÇÑ´Ù.
/// \return LPDISPATCH »ý¼ºÇÑ Range °´Ã¼
////////////////////////////////////////////////////////////////////////////////////////////////////
LPDISPATCH cExcelWorkbook::CreateRangeObject(int row, int column) const
{
WCHAR position[64] = {0, };
return ConvertCellPosition(row, column, position, ARRAYSIZE(position)) ? CreateRangeObject(position) : NULL;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief Á¤¼ö ±â¹Ý À妽º¸¦ Ä÷³ Çì´õ ¹®ÀÚ¿·Î º¯È¯ÇÑ´Ù.
/// \param column Ä÷³ À妽º
/// \param result °á°ú ¹®ÀÚ¿. ÃÖ¼Ò 3ÀÚ, Áï 6¹ÙÀÌÆ® ÀÌ»ó ¾µ ¼ö ÀÖ¾î¾ß ÇÑ´Ù.
/// \return bool ¹«»çÈ÷ º¯È¯Çß´Ù¸é true, ÀÔ·ÂÀÌ À߸øµÇ¾ú´Ù¸é false
////////////////////////////////////////////////////////////////////////////////////////////////////
bool cExcelWorkbook::ConvertColumnHeader(int column, LPWSTR result)
{
static const WCHAR chars[] =
{
L'A', L'B', L'C', L'D', L'E', L'F', L'G', L'H', L'I', L'J', L'K', L'L', L'M',
L'N', L'O', L'P', L'Q', L'R', L'S', L'T', L'U', L'V', L'W', L'X', L'Y', L'Z'
};
bool success = false;
if (1 <= column && column <= 256 && result)
{
if (column <= 26)
{
result[0] = chars[column-1];
result[1] = 0;
}
else
{
result[0] = chars[(column / 26)-1];
result[1] = chars[(column-1) % 26];
result[2] = 0;
}
success = true;
}
return success;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief Á¤¼ö ±â¹Ý À§Ä¡¸¦ ¹®ÀÚ¿ ÇüÅÂÀÇ À§Ä¡·Î º¯È¯ÇÑ´Ù.
/// \param row Çà
/// \param column ¿
/// \param result °á°ú ¹®ÀÚ¿ÀÌ µé¾î°¥ ¹öÆÛ
/// \param length °á°ú ¹öÆÛÀÇ ±æÀÌ
/// \return bool ¹«»çÈ÷ º¯È¯Çß´Ù¸é true, ÀÔ·ÂÀÌ À߸øµÇ¾ú´Ù¸é false
////////////////////////////////////////////////////////////////////////////////////////////////////
bool cExcelWorkbook::ConvertCellPosition(int row, int column, LPWSTR result, size_t length)
{
bool success = false;
if (row >= 1 && result && length > 0)
{
WCHAR cols[3] = {0, };
if (ConvertColumnHeader(column, cols))
{
swprintf_s(result, length, L"%s%d", cols, row);
success = true;
}
}
return success;
}
3 »ùÇÃ
cExcelWorkbook a;
if (a.Open("C:\\test.xls"))
{
if (a.SetActiveSheet(1))
{
int rows = a.GetRowCount();
int cols = a.GetColumnCount();
a.SetCellData(1, 1, L"Hello world");
wchar_t buf[1024];
a.GetCellData(1, 1, buf, ARRAYSIZE(buf));
}
}
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)