Большой Воронежский Форум
» Программирование>Офисные приложения и Делфи
metallic 14:29 14.11.2004
Народ подскажите как мне в делфи приспособить Excel-евский файл
Допустим мне нужно из листа в екселе загрузить значение ячейки А1
в делфи в компонент Edit и т.д. [Ответ]
ZLO 11:22 16.11.2004
rtfm [Ответ]
Rabbit 15:16 16.11.2004
Код:
// Что-то вроде этого..
procedure TForm1.Button1Click(Sender: TObject);
  var
    v:variant;
begin
      v:=CreateOleObject('Excel.Application');
      Edit1.Text = v.Worksheets["Sheet1"].Cells[6, 1].Value;
end;
Я не уверен насчёт правильности скобок в выделенной строке, это прийдётся смотреть самому в хелпе.
Насчёт свойств и методов Excel.Application смотри в хелпе к Excel. [Ответ]
zss_vrn 16:22 17.11.2004
Вот, кусок кода, правда, на С++, но это почти одно и то же
//---------------------------------------------------------------------------
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;
}
//--------------------------------------------------------------------------- [Ответ]
metallic 17:44 21.11.2004
мда-а-а, короче гемор полный, я вобщем забил с экселем, всем спасибо.
Я решил сделать базу на парадоксе 7 (уже сделал).
С парадоксом все охрененно работает, только вот появилась новая проблема: как сделать так штоб прога и на других компах работала, где нет делфи. Просто кода ее переносишь на другой комп она ругаетсмя что типа не распознала тип базы данных. Как мне обяснили она просит драйвер БДЕ, отсюда вопрос: как его поставить отдельно без делфей, а еще лучше чтоб без него все работало. [Ответ]
zss_vrn 07:57 22.11.2004
Парадокс - тоже геморрой, индексы падают и проч.
БДЕ надо в инсталлятор включить, как точно - не помню, смотри доку на БДЕ, какие именно файлы и куда включать. Проблема - совместимость, например, ты заранее не знаешь, есть ли БДЕ на машине, какой версии и используется ли другими приложениями. Можно так ее постпвить, что другие приложения отвалятся. Вообще, БДЕ - каменный век. [Ответ]
metallic 19:54 22.11.2004
zss_vrn млин а че делать?
мне нужно создать простенькую базу данных, я объяснил одному че мне конкретно нужно, он мне сказал что мне нужен Access, тока как его подключить в дельфи я не знаю.
Прга короче для учета товара в магазине, сам я не програмист, просто знакомые попросили, а делфи знаю на начальном уровне. [Ответ]
Grossmeister 23:31 22.11.2004
metallic Обратитесь к профессионалам. Иначе и магазин ждет банкротство. [Ответ]
zss_vrn 07:19 23.11.2004
metallic
У аксесса - свои средства программирования, для простеньких задач их вполне должно хватить. А вообще я согласен с Grossmeister [Ответ]
metallic 13:13 23.11.2004
zss_vrn Grossmeister млин какое бонкротство?
там примитивная прога нужна, просто руками лень считать.... [Ответ]
zic 00:41 26.11.2004
ADO + MS Jet
Гроссместер судя по всему не вьебись какой профессионал
[Ответ]
zss_vrn 07:09 26.11.2004
metallic
А просто екселем нельзя решить примитивную задачу? Он много умеет, этот ексель.

И зачем аксесс подключать к дельфи, если в самом аксессе можно напрограмить?

ЗЫ:
Вначале речь шла об екселе [Ответ]
metallic 09:37 26.11.2004
zss_vrn млин в конечном итоге должна получится простая панель управления с плюсом и минусом при нажатии на которые должно прибовлятся и убавлятся, т.к. пользователь будет не очень продвинутый. [Ответ]
zss_vrn 11:50 26.11.2004
metallic
Простые проги для юзера - как раз самые сложные для программера

В сбилдере 5 и 6 есть компоненты для работы с екселем. Они довольно просты - глянь. Я не пользовал, но проверял - работают.

Правда,если есть калькулятор и ексель - зачем еще и прогу городить? Если юзер с екселем не справится, то с самопальной прогой еще хуже


Или все же к аксессу надо? Если к аксессу - то можно через ODBC->BDE...
[Ответ]
zic 01:55 28.11.2004
Или все же к аксессу надо? Если к аксессу - то можно через ODBC->BDE...

Мне интересно как можно работать с сервером автоматизации через odbc или там bde?

Если же речь идет о Jet то опять же не понимаю нахрена odbc и тем паче bde.
[Ответ]
zss_vrn 07:32 29.11.2004
zic

Сервер автоматизации? Но к вопросу можно подойти, как к серверу БД!
Очень просто.

1. Указываем в качестве источника данных ODBC "База данных MS ACESS" (Панель управления->Администрирование->Источники данных ОDBC...)

2. Прописываем алиас в BDE на этот источник данных.

3. Работаем в проге через стандартные компоненты.

Так можно цеплять и ексель, если приспичит, но, конечно, файл ексель должен иметь структуру таблицы. [Ответ]
zic 01:11 30.11.2004
zss_vrn
В таком случае ты работаешь не с Access а c MS Jet напрямую.

1 ms data link удобней будет
2 ole db, закладка ado для delphi, bde давно похоронен даже самим борландом
3 [Ответ]
zss_vrn 06:50 30.11.2004
zic
К стыду своему не знаю, что такое MS Jet
Что БДЕ похоронен согласен, я и сам писал это в предыдущих постах. ИМХО, дельфи тоже доживает свой век.
[Ответ]
metallic 08:24 30.11.2004
Все я разобрался как ацесовскую базу прицепить в делфи, осталось тока придумать как в нее картинок напихать.
Оказалось там сложнее с этим чем в парадоксе.
Кто нить может рассказать как влепить картинку в базу. [Ответ]
fishca 14:47 30.11.2004
zss_vrn

Сообщение от :
ИМХО, дельфи тоже доживает свой век.

а как же Delphi 2005 ?
Может еще и Visual Studio тоже доживает свой век?
[Ответ]
zic 01:37 01.12.2004
zss_vrn
субд ,часть windows, access это лишь примитивный фронтэнд к ней, работающий через кривую жопу - mda

metallic
просто клади картинки в поля blob,
типа image в jet по моему нет.

fishca
Да хоть 2006. [Ответ]
zss_vrn 07:06 01.12.2004
fishca

Сообщение от :
а как же Delphi 2005 ?
Может еще и Visual Studio тоже доживает свой век?

Дельфи - это VCL, объектная обертка к Win32 API. С появлением NET необходимость в обертках отпала.

Visual Studio NET имеет перспективы, равно как и Java. Все остальное, имхо, ждет судьба FoxPro и т.д. Я говорю только об офисных приложениях.

zic
Блин, стока лет имею дело с Win, а этого не знаю. Век живи, век учись - один хрен, дураком помрешь [Ответ]
fishca 09:12 01.12.2004
zss_vrn
Delphi - это не только VCL, а среда быстрой разработки
Visual Studio NET - среда быстрой разработки

И чем же одно перспективней другого? И там и там можно клепать приложения как для .Net так и для Win32.
[Ответ]
metallic 11:12 01.12.2004
Все я разобрался [Ответ]
zss_vrn 11:53 01.12.2004
fishca

Дельфи - среда быстрой разработки, основанная на собственной компанентной модели, которая является оберткой родного API.

VS NET и DELPHI.NET- то же, но компонентная модель - уже часть системы, то есть, made by MS. У борланда больше нет преимущества, которое было раньше, то есть, удачной объектной модели. Зато есть недостатки, например, только один язык - паскаль. Но это - мелочи, главное, что теперь борланду приходится играть "на чужом поле", и выиграть конкурентную борьбу с MS в таких условиях вряд ли возможно.

К этому стоит добавить, что дельфи "за бугром" и раньше не пользовалась таким спросом, как у нас, а сейчас - тем более. Следовательно, спец по дельфи при прочих равных имеет меньшую ценность нежели спец по VS NET, ему можно меньше платить.

Вывод - дельфи имеет мало перспектив. [Ответ]
metallic 13:01 01.12.2004
Млин, во всех понесло ! [Ответ]
Кот в сапогах 10:47 23.12.2004
metallic Как профессиональный программист начинающему программисту - поскольку ты использовал Paradox (встроенный в Delphi), а он соотвественно использует BDE (Borland DataBase Engine - Машина баз данных). То для использования таких программ на других машинах необходимо проинсталлировать BDE соотвестенно.

Сделать это можно, грубо говоря, двумя путями:

1. Взять дистрибутив Дельфи и происталлировать на компах где будет использоваться данная программа исключительно только BDE.

2. Создать к своей программе с помощью поставляемого с Дельфи пакета InstallShield инсталлятор, в который необходимо включить BDE. Иными слова твоя прога будет инсталлироваться как все программы, например, тот же MS Office и прочие. [Ответ]
metallic 11:27 23.12.2004
Кот в сапогах я уже давно переделал прогу на ацес, там никакого гемора [Ответ]
Вверх