//...
struct ExcelFileStr
{
bool pluralChoice; // участвует ли запись в множественном выборе
bool IsCheck;
std::vector<std::wstring> vecStr; // столбцы
};
std::vector<ExcelFileStr> vecRawStr; // вектор файла
//...
void read(LPTSTR lpszFileName)
{
using namespace Excel;
_ApplicationPtr pApp(L"Excel.Application");
WorkbooksPtr pWorkBooks = pApp->GetWorkbooks();
_WorkbookPtr pWorkBook = pWorkBooks->Open(_bstr_t(lpszFileName), vtMissing, VARIANT_TRUE);
long i = 0, j = 0;
try
{
int nRows = 1, nCols = 1; // тут будут лежать реальные количества строк и столбцов
_WorksheetPtr pSheet = pWorkBook->Worksheets->GetItem(1);
Excel::RangePtr pRange = pSheet->UsedRange;
int startRow = 1, endRow = max(pRange->Rows->Count, nRows); nRows = endRow;
int startCol = 1, endCol = max(pRange->Columns->Count, nCols); nCols = endCol;
vecRawStr.resize((size_t)(nRows));
for (i = 0; i < nRows; i++)
{
vecRawStr[i].IsCheck = true;
vecRawStr[i].pluralChoice = false;
vecRawStr[i].vecStr.resize((size_t)(nCols));
}
_variant_t varr = pRange->GetValue2(), val;
long iLBound[2] = { 0,0 }, iUBound[2] = { 0,0 };
HRESULT hr;
_bstr_t str;
if (FAILED(hr = SafeArrayGetLBound(varr.parray, 1, &iLBound[0]))) throw _com_error(hr);
if (FAILED(hr = SafeArrayGetUBound(varr.parray, 1, &iUBound[0]))) throw _com_error(hr);
if (FAILED(hr = SafeArrayGetLBound(varr.parray, 2, &iLBound[1]))) throw _com_error(hr);
if (FAILED(hr = SafeArrayGetUBound(varr.parray, 2, &iUBound[1]))) throw _com_error(hr);
for (i = 0; i <= iUBound[0] - iLBound[0]; i++)
{
for (j = 0; j <= iUBound[1] - iLBound[1]; j++)
{
long ind[2] = { iLBound[0] + i, iLBound[1] + j };
if (FAILED(hr = SafeArrayGetElement(varr.parray, ind, &val))) throw _com_error(hr);
try
{
vecRawStr[i].vecStr[j] = _bstr_t(val);
}
catch (_com_error &er)
{ // Если поле имеет недопустимый формат
vecRawStr[i].vecStr[j] = _T("");
}
}
}
}
catch (_com_error &err)
{
CString s; s.Format(L"Ошибка чтения файла <%s> Код: 0x%8X %s Строка=%d Столбец=%d", lpszFileName, err.Error(), err.ErrorMessage(), i, j);
AfxMessageBox(s, MB_ICONERROR);
vecRawStr.clear();
}
try
{
pWorkBook->Close();
pWorkBooks->Close();
}
catch (...) { ; }
}