[C++/Excel] 엑셀 소수점 입력 방법 + 고려 해야 할 사항
본문 바로가기

응용 프로그램 개발/C++, MFC, Windows

[C++/Excel] 엑셀 소수점 입력 방법 + 고려 해야 할 사항

728x90
반응형

 

1. 숫자 서식으로 입력

 

1) 엑셀 관련 클래스 생성

// HsExcel.h

class HsExcel : public CDialog
{

...

protected:
	_Application*	m_pApp;
	Workbooks		m_books;
	_Workbook		m_book;
	Worksheets		m_sheets;
	_Worksheet		m_sheet;
	ExRange			m_range;
	Borders			m_borders;
	Outline			m_outline;
    
}
// HsExcel.cpp

void HsExcel::SetValue(long col, long row, double v, int decimal)
{
	SetRange(col, row);
	SetValue(v, decimal);
}

void HsExcel::SetRange(long col, long row)
{
	CString cell=L"";
	cell.Format(L"%s%d", GetColName(col), row);
	m_range=m_sheet.GetRange(COleVariant(cell), COleVariant(cell));
	m_borders=m_range.GetBorders();
}

void HsExcel::SetValue(double v, int decimal)
{
	CString decFormat=L"0.";
	for(int i=0; i<decimal; i++)
	{
		decFormat=decFormat+L"0";
	}
	decFormat=decFormat+L"_ ";

	m_range.SetNumberFormatLocal(COleVariant(decFormat));
	m_range.SetValue2(COleVariant(v));
}

void HsExcel::SetFormula(long col, long row, CString formula)
{
	SetRange(col, row);

	m_range.SetFormula(COleVariant(formula));
}

 

2) 엑셀 클래스를 활용하여 값 입력

void ExampleCtrl::MakeTestSheet(HsExcel& ex)
{
   // 데이터를 입력할 위치: 1행 1열
   int col = 1, row = 1;
   
   double fValue = 1.234;
   
   // 마지막 인수인 3은 소수점 3자리 까지 표현한다는 의미
   ex.SetValue(col, row, fValue, 3);

}

 

 

 

2. 텍스트 서식으로 입력

 

다른 방법으로는 다음과 같이 엑셀 TEXT 함수를 활용하여 값을 입력하는 방법이다.

 

하지만, 이러한 방법은 숫자가 아닌 텍스트로 입력하기 때문에 수식계산을 할 수 없다는 문제점이 있다.

 

void ExampleCtrl::MakeTestSheet(HsExcel& ex)
{
   // 데이터를 입력할 위치: 1행 1열
   int col = 1, row = 1;
   
   double fValue = 1.234;
   
   CString strFormulaText = L"";
   
   // 서식 지정
   strFormulaText.Format(L"=Text(%f, \"#0.000#\")", fValue);
   
   // 서식 입력
   ex.SetFormula(col, row, strFormulaTxt);

}

 

 

이때, 고려하지 않은 사항이 있었다.

 

엑셀에서 데이터를 입력할 때, 소수점 뒤에 0을 입력하지 못한다는 점이었다. 예) 1.00000 을 1.0으로 입력

 

즉, 사용자가 1.00000 을 입력하는 방식은, 서식을 적용하여 소수점으로 보이게 하는 방법인데

 

그렇게하면 데이터를 읽어올 때, 1.00000 이 아닌 1.0으로읽어오게되었다...

 

이를 해결하기 위해서는 서식이 무엇인지 얻어와야하는데, 이는 아직 찾지 못했다..

728x90
반응형