|
Вот, кусок кода, правда, на С++, но это почти одно и то же
//---------------------------------------------------------------------------
void __fastcall TfrmInpMat1::LoadExcelFile()
{
iNameCol = 2;
iStatusCol = 6;
Variant vExcel,vBook,vSheet;
Function Open("Open");
PropertyGet Workbooks("Workbooks");
PropertyGet Sheets("Worksheets");
PropertyGet Range("Range");
PropertyGet Count("Count");
PropertyGet Rows("Rows");
PropertyGet Value("Value");
PropertyGet Item("Item");
PropertySet Visible("Visible");
Procedure Quit("Quit");
Procedure Close("Close");
Procedure Activate("Activate");
TList *slCodes = new TList();//Номера строк
try {
vExcel = Variant::CreateObject("Excel.Application");
vExcel.Exec(Visible << false);
vBook = vExcel.Exec(Workbooks).Exec(Open <<WideString(sFileName));
int SheetCount = vBook.Exec(Sheets).Exec(Count);
vSheet = vBook.Exec(Sheets << SheetCount);//Откроем последнюю страницу
vSheet.Exec(Activate);
// grdStrings->ColCount = 6;
grdStrings->Cells[0][0] = "КОД";
grdStrings->Cells[1][0] = "Ст.часа";
grdStrings->Cells[2][0] = "Наименование";
grdStrings->Cells[3][0] = "Зарп.";
grdStrings->Cells[4][0] = "Трудоз.";
grdStrings->Cells[5][0] = "Маш.предст.";
grdStrings->Cells[6][0] = "Статус";
Variant vValueA, vValueQ, vValueB, vValueG, vValueF, vValueY ;
Range.ClearArgs();
vValueA = vSheet.Exec(Range << "A43" << "A65530").Exec(Value);
int Cnt = 0;//Счетчик строк
int iEmptyCnt = 0;//Счетчик пустых строк
AnsiString asStr;
while ( iEmptyCnt<4 ){//Заполняеим массив номеров строк
asStr = AnsiString( vValueA.GetElement(Cnt+1,1));
if (asStr.Length() && asStr.UpperCase().Pos("РАЗД") == 0){//То, что надо
iEmptyCnt = 0;
slCodes->Add((void *)Cnt);
} else iEmptyCnt++;
Cnt++;
}
AnsiString asEnd = Cnt+44;//Сколько насчитали строк
asStr = slCodes->Count;
Range.ClearArgs();//Стоимость часа
vValueQ = vSheet.Exec(Range << "Q43" << "Q" + asEnd).Exec(Value);
Range.ClearArgs();//Наименование
vValueB = vSheet.Exec(Range << "B43" << "B" + asEnd).Exec(Value);
Range.ClearArgs();//Зарплата
vValueG = vSheet.Exec(Range << "G43" << "G" + asEnd).Exec(Value);
Range.ClearArgs();//Трудозатраты
vValueF = vSheet.Exec(Range << "F43" << "F" + asEnd).Exec(Value);
Range.ClearArgs();//Машина-представитель
vValueY = vSheet.Exec(Range << "Y43" << "Y" + asEnd).Exec(Value);
Cnt = slCodes->Count;
grdStrings->RowCount = Cnt + 1;
int iType; //Error - не Error...
int iIdx;
double dRes;
for (int i = 0; i<Cnt; i++){
iIdx = (int) slCodes->Items[i];
grdStrings->Cells[0][i+1] = vValueA.GetElement( iIdx+1,1);//Код
iType = vValueQ.GetElement( iIdx+1,1).Type();//Ст. часа
if (iType == varError || iType == varString){
grdStrings->Cells[1][i+1] = "-2,00";
AddStatus("Нет стоимости часа. ",i+1);
AddWarning();
}
else{
dRes = RoundTo(vValueQ.GetElement( iIdx+1,1), -2);
/* if (IsZero(dRes,0.001))
AddStatus("Стоимость часа == 0 ",i+1);*/
if (dRes <0){
AddStatus("Стоимость часа < 0 ",i+1);
AddWarning();
}
grdStrings->Cells[1][i+1] = dRes;
}
grdStrings->Cells[2][i+1] = vValueB.GetElement( iIdx+1,1);//Наименование
iType = vValueG.GetElement( iIdx+1,1).Type();//Зарплата
if (iType == varError || iType == varString){
grdStrings->Cells[3][i+1] = "-2,00";
AddStatus("Нет зарплаты. ",i+1);
AddWarning();
}
else{
dRes = RoundTo(vValueG.GetElement( iIdx+1,1), -2);
grdStrings->Cells[3][i+1] = dRes;
}
iType = vValueF.GetElement( iIdx+1,1).Type();//Трудозатраты
if (iType == varError || iType == varString){
grdStrings->Cells[4][i+1] = "-2,00";
AddStatus("Нет трудозатрат. ",i+1);
AddWarning();
}
else{
dRes = RoundTo(vValueF.GetElement( iIdx+1,1), -2);
grdStrings->Cells[4][i+1] = dRes;
}
grdStrings->Cells[5][i+1] = vValueY.GetElement( iIdx+1,1);//Машина - представитель
}
grdStrings->Row = 1;
edtCurLine->Text = grdStrings->Row;
edtCount->Text = grdStrings->RowCount - 1;
MainForm->Log->WriteMessage("Машины::открыт файл " + sFileName);
vBook.Exec(Close);
vExcel.Exec(Quit);
vValueA = Unassigned;
vValueQ = Unassigned;
vValueB = Unassigned;
vValueG = Unassigned;
vValueF = Unassigned;
vValueY = Unassigned;
vSheet = Unassigned;
vBook = Unassigned;
vExcel = Unassigned;
}
catch (Exception &e){
try{
vBook.Exec(Close);
vExcel.Exec(Quit);
vBook = Unassigned;
vExcel = Unassigned;
} catch(...){};
Application->MessageBox(e.Message.c_str(), "Ошибка !", MB_OK | MB_ICONSTOP);
}
iLoadWarnings = iWarningsFound;
delete slCodes;
}
//---------------------------------------------------------------------------
|