![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Всем здраствуйте, я новичок передомной стоит такая задача: есть фаилик с расширением .xls который запонен всеми необходимыми данными, но в нем постоянно меняються 4 ячейки, необходимо, с помщью проги их изменять и сохранять в файле, Полазел в инете нашел подходящий код, но что то не так :
Код:
procedure TForm1.Button4Click(Sender: TObject);
var
XL, WB, Sheet : Variant;
begin
XL := CreateOLEObject('Excel.Application');
XL.Application.EnableEvents := false;
WB := XL.Workbooks.Add('C:\ARB\Doc\WorkBook.xls');
Sheet := WB.ActiveSheet;
DateTimePicker1.date:= Sheet.Cells[4, 1];
Edit1.Text:= Sheet.Cells[12, 91];
Edit2.Text:= Sheet.Cells[15, 20];
Edit3.Text:= heet.Cells[19, 91];
XL.Quit;
end;Подскажите что не так делаю, и как реализовываеться сохранение фаила, если можно поподробней, заранее спасибо... Последний раз редактировалось Admin, 14.02.2010 в 13:51. |
|
#2
|
||||
|
||||
|
Если я правильно понял, то изменение должно происходить в эксельном файле, а вы делаете наоборот, надо так:
Код:
Sheet.Cells[12, 91] := Edit1.Text; Sheet.Cells[15, 20] := Edit2.Text; Sheet.Cells[19, 91] := Edit3.Text; |
|
#3
|
||||
|
||||
|
При таком коде у меня, Edit1, Edit2,Edit3, принимают значения ячеек в файле, а мне нужно наоборот что-бы в файле, значения ячеек менялись на те что будут прописываться в проге пользователем, что бы постоянно не открывать этот фаил и не искать эти ячейки, фаил тостаточно большой....
|
|
#4
|
||||
|
||||
|
Проблема решилась, переносом файла в корень диска С:\ , но появилась другая, почемуто прога открывает фаил с именем WorkBook1, хотя везде явным образом указан фаил, WorkBook, не поиму в чем причина, просмотрел весь код, вроде все везде указанно верно, подскажите плиз и второй вопрос как сохранить изменения в фаиле....
|
|
#5
|
||||
|
||||
|
Скорей всего причина, в том что, прога открывает Excel не закрыв его, так как в при сообытии Form.Create прога обращаеться к файлу что бы проверить какие данные уже там загруженны и вывести в StrigGrid после этого деспетчре задач висит по 5- процессов Excel, но почему тогда он их не закрывает ведь прописанно же в коде XL.Quit. Код проги прикладываю на всякий...
Последний раз редактировалось Dead_Gigabit, 15.02.2010 в 11:05. |
|
#6
|
||||
|
||||
|
Код:
var
e_app,worksht: Variant;
f_name: string;
begin
f_name := 'c:\123.xls';
e_app := CreateOleObject('Excel.Application');
e_app.DisplayAlerts := False;
e_app.WorkBooks.Open(f_name);
worksht := e_app.WorkBooks[1].WorkSheets[1];
worksht.Cells[1,1] := '123'; //пример
worksht.SaveAs('c:\out.xls');
e_app.Quit;
end;вот так я когда то делал, попробуйте. Последний раз редактировалось Ultras, 15.02.2010 в 11:07. |
|
#7
|
||||
|
||||
|
А как сделатиь что бы сохранялся, в тот же фаил, а не в другой и как мне можно избавиться от стальки процессов Excel в памяти...
|
|
#8
|
||||
|
||||
|
Цитата:
Код:
worksht.SaveAs('c:\out.xls');Код:
worksht.Save; на счет процессов не знаю, после сохранения файла, закрываецца Excel, процесс должен тоже убивацца, видимо у вас до закрытия не доходит... |
|
#9
|
||||
|
||||
|
Вот что получилось, указал куда иму выводить
код: Код:
procedure TForm1.Button4Click(Sender: TObject);
var
XL, WB, Sheet : Variant;
begin
XL := CreateOLEObject('Excel.Application');
XL.Application.EnableEvents := false;
WB := XL.Workbooks.Open('F:\ARB\Doc\WorkBook.xls');
Sheet := WB.ActiveSheet;
Sheet.Cells[4, 1]:= DateTimePicker1.Date;
Sheet.Cells[12, 91]:=Edit1.Text;
Sheet.Cells[15, 20]:=Edit2.Text;
Sheet.Cells[19, 91]:=Edit3.Text;
XL.Save ('F:\ARB\Doc\WorkBook.xls');
XL.visible:=false;
XL.Ouit;На что выходит 2 проблемы: он спрашивает куда сохронять и под каким именеи потому что прога открывает фаил WorkBook.xls под именем WorkBook1.xls с тем же содержимым, скорей всего что эти процессы Excel запущенные в памяти мешают открыть ему родной фаил WorkBook.xls так же при сохранении выскакивает ошибка, типа документ открыт тока для чтения, думаю тоже из-за этих процессов, подскажите как дальше быть... Последний раз редактировалось Admin, 21.01.2011 в 14:19. |
|
#10
|
|||
|
|||
|
При помощи этой функции например. В Form Create добавить KillTask('EXCEL.EXE');
Код:
{ Функция удаления процесса по имени }
function TForm1.KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE = $0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: Thandle;
FProcessEntry32: TprocessEntry32;
begin
result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase
(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase
(ExeFileName))) then
result := integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE,
BOOL(0), FProcessEntry32.th32ProcessID), 0));
ContinueLoop := process32next(FSnapshotHandle, FProcessEntry32);
end;
closehandle(FSnapshotHandle);
end; |