Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Поммогите сохранить в Excel


Автор: EvilProgrammer 21.7.2006, 10:08
Помогите пожалуйста решить эту проблему.
Есть такой код:
Код
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
    ExcelApp:= CreateOleObject('Excel.Application');
    Workbook:= ExcelApp.Workbooks.Open(FileName:= FileListBox1.FileName);
    ExcelApp.Visible:= false;
    ExcelApp.EnableEvents:= False;
    ExcelApp.Application.DisplayAlerts:= False;

end;




Тут я открываю файл через ФайлЛистБокс1. Я решил упростить процесс поиска файла без использования ОпенДиалога.
Потом мне нужно пересохранить этот файл при помощи ДиректориЛистБокс2 и ФайлЛистБокс2, но так что бы изменлися лишь путь к каталогу а его имя осталось без изменений. Я попробовал так...
Код
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
  SPathName:= DirectoryListBox2+copy(FileListBox1.FileName);
  ExcelApp.ActiveWorkbook.SaveAs(FileName:= SPathName, FileFormat:= -4158);
  ExcelApp.Workbooks.Close;
  ExcelApp.Quit;
end;



SPathName: string;

Как правильно указать путь сохранения? smile Заранее благодарен. 

Автор: Albinos_x 21.7.2006, 13:52
не совсем понял вопроса....

не получается получить путь?
или сохранение? 

Автор: EvilProgrammer 21.7.2006, 14:28
Albinos_x, не получается получить путь smile 
Я хочу сделать так чтобы поменялся только каталог, а имя файла осталось прежним.
Для указания каталога я использую DirectoryListBox2.  

Автор: Albinos_x 21.7.2006, 16:31
Цитата
function ExtractFileName(const FileName: string): string;   Извлекает из строки с полным именем файла FileName часть, содержащую его имя и расширение. 


Добавлено @ 16:34 
советую скачать  DRKB (Delphi Russian Knowledge Base) (http://www.drkb.ru/)

Цитата(Правила форума "Delphi: ActiveX/СОМ/CORBA")

90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Добавлено @ 16:37 
ЗЫ: Это вопрос раздела http://forum.vingrad.ru/index.php?showforum=84 

Автор: EvilProgrammer 23.7.2006, 22:41
Albinos_x, Спасибо за совет. DRKB я уже скачал. Как я уже говорил, я только начинаю программировать поэтому орехов не избежать. Книги и ФАКи это хорошо, но советы и подсказки квалифицированных программистов намного ценнее.  

Автор: Albinos_x 23.7.2006, 22:49
PS: Мне интересно, почему делаешь сохранение через Excel, а не пользуешся копированием файлов? 

Автор: EvilProgrammer 24.7.2006, 09:16
Albinos_x, smile я только начал этим заниматься. Мне показалось что использовать Excel целесообразно т.к. работаю с его файлами.
Вроде не нужно мучатся с конвертированием, достаточно просто указать в каком формате сохранить файл. Как уже говорил раньше, написал программку которая просто замечательно работает с одним файлом (их можна конвертировать по очереди), при этом я использовал Excel и OpenDialog/SaveDialog. Потом у меня родилась идея сделать программу без OpenDialog/SaveDialog с использовпанием дерева каталогов и FileListBox, это бы намного упростило процесс поиска и открытия нужного файла. На данный момент у меня получилось загрузить нужный мне файл через FileListBox. Теперь я тружусь над тем, чтобы этот файл можно было так же легко положить туда куда мне нужно без изменения имени этого файла, но в другом формате (Из *.xls надо сделать *.txt). 
В конечном итоге программа должна оперировать не с одним файлом, а с целым каталогом в котором хранятся файлы *.xls, которые нужно пересохранить в *.txt в указанный каталог.

Если есть какие-нибудь примеры или советы я буду очень рад, потому как у меня нету опыта в создании таких программ. Заранее благодарен.  

Автор: EvilProgrammer 24.7.2006, 12:26
На данный момент есть такой код:
Код
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
    ExcelApp:= CreateOleObject('Excel.Application');
    Workbook:= ExcelApp.Workbooks.Open(FileName:= FileListBox1.FileName);
    Edit1.Text:= ExtractFilePath(FileListBox1.FileName);
    Edit2.Text:= ExtractFileName(FileListBox1.FileName);
    ExcelApp.Visible:= false;
    ExcelApp.EnableEvents:= False;
    ExcelApp.Application.DisplayAlerts:= False;

end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
  ExcelApp.ActiveWorkbook.SaveAs(FileName:= , FileFormat:= -4158);
  ExcelApp.ActiveWorkbook.Close;
  ExcelApp.Quit;
end;

end.


Не получается заставить прочитать имя файла из Edit2.Text smile 

Автор: Albinos_x 24.7.2006, 13:10
в статье, ссылку на которую я давал в ранее созданном тобой топике били примеры и загрузки и работы...

Цитата(EvilProgrammer @  24.7.2006,  12:26 Найти цитируемый пост)
Не получается заставить прочитать имя файла из Edit2.Text

 А имя и путь к файлу там есть?
может так:
Код
...
procedure TForm1.BitBtn3Click(Sender: TObject);    
var FileName:String;
begin    
FileName:=FileListBox2.Directory+'\'+Edit2.Text;
  ExcelApp.ActiveWorkbook.SaveAs(FileName, FileFormat:= -4158);    
  ExcelApp.ActiveWorkbook.Close;    
  ExcelApp.Quit;    
end;
...
  

Автор: EvilProgrammer 25.7.2006, 10:48
Albinos_x, все бы хорошо, но только из Эдит он берет имя файла с расширением и потом выдает ошибку, что в имени файла не должно быть запрещенных символов. Можно ли как-то сделать фильтр?


П.С. Хотя с другой стороны создать файл "random.xls.txt" можно без всяких проблем в винде. В чем же тогда баг? Еще у мня появилась мысль о том можно ли каким-то образом заставить Ексель пересохранить файл с тем именем с которым он был открыт, для этого вроде бы не нужно задавать новое имя. Соответственно FileName тогда должен либо вообще отсутствовать либо не содержать имени фалйла. Можно ли так сделать? 

Автор: Albinos_x 25.7.2006, 22:05
У меня в статье было написано, что могут возникать проблемы в методе SaveAs, если путь сохранения содержит русские буквы (т.е. отличные от латинского алфавита)... Может в этом проблема.... 

Автор: EvilProgrammer 26.7.2006, 10:14
Albinos_x, нет-нет тут дело не в этом. Все файлы содержатлатинские буквы. Как уже говрил это файлы отчетности по месяцам/неделям/дням и т.д.


Просто когда выполняется 
Код
FileName:= FileListBox2.Directory+'\'+FileListBox1.FileName;
    ExcelApp.ActiveWorkbook.SaveAs(FileName, FileFormat:= -4158);


то в переменную берется FileName записывается значение "random.xls" к которому потом добавляется расширение .txt и вот после этого программа выдает сообщение что так делать нельзя. 

По-поводу загрузки целого каталога в Ексель у меня повилась такая идея. Правда немного коряво но надеюсь что потом несколько модернизирую.
Код
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  SearchRec: TSearchRec;
begin
  if FindFirst(FileListBox1.FileName, faAnyFile, SearchRec)=0 then
    repeat
    ExcelApp:= CreateOleObject('Excel.Application');
    Workbook:= ExcelApp.Workbooks.Open(FileName:= FileListBox1.FileName);
    Edit1.Text:= ExtractFilePath(FileListBox1.FileName);
    Edit2.Text:= ExtractFileName(FileListBox1.FileName);
    ExcelApp.Visible:= false;
    ExcelApp.EnableEvents:= False;
    ExcelApp.Application.DisplayAlerts:= False;
    FileName:= 'C:\ConvertFiles\'+FileListBox1.FileName;
    ExcelApp.ActiveWorkbook.SaveAs(FileName, FileFormat:= -4158);
    ExcelApp.ActiveWorkbook.Close;
    ExcelApp.Quit;
   until FindNext(SearchRec)<>0;
   FindClose(SearchRec);
end;

 
Правда причина остается той же smile 
Выдается такой сабж:
Файл не доступен.
1. проверьте создана ли директория? (создана)
2. Открыта ли директория для записпи (открыта)
3. Имя файла не должно содеражать знаков (не содержит)
4. Полный путь к файлу не должен превышатьт 218 символов. (не привышает)

Помогите!!! В чем же дело? 

Автор: Albinos_x 26.7.2006, 23:25
Цитата(EvilProgrammer @  26.7.2006,  10:14 Найти цитируемый пост)
нет-нет тут дело не в этом. Все файлы содержатлатинские буквы. Как уже говрил это файлы отчетности по месяцам/неделям/дням и т.д.

не только файлы но и путь к файлу....

Приведённый код не совсем удачный, т.к. по нему получается что прочитаешь и сохранишь ты "один и тот же файл в один и тот же файл"... а он может ещё не освободиться для перезаписи... 

Автор: EvilProgrammer 28.7.2006, 09:47
Albinos_x, Сказать по правде я уже немного запутался. smile 

Автор: Albinos_x 28.7.2006, 12:47
Не понял... в чём запутался? 

Автор: EvilProgrammer 9.8.2006, 10:34
Albinos_x, Огромное спасибо.
Уже все работает. 
Программ функцилонирует. smile
Теперь пишу ее более усовершенствованный вариант.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)