Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
bv7
21 / 9 / 2
Регистрация: 24.05.2014
Сообщений: 56
#1

Решить проблему повторного открытия Excel файла - Delphi

29.05.2015, 18:51. Просмотров 1887. Ответов 21
Метки нет (Все метки)

Помогите решить проблему повторного открытия excel файла.

Файл открываю так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//Открыть соединение с базой данных.
procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  Sl : TStringList;
  Od : TOpenDialog;
begin
  ADOConnection1.Close;
  //KillTask('excel.exe'); //убить процесс
  ListBox1.Clear;
//Выбор файла
  Od := OpenDialog1; 
  if Od.InitialDir = '' then
    Od.InitialDir := ExtractFilePath( ParamStr(0) );
  if not Od.Execute then Exit;
  if not FileExists(Od.FileName) then begin
    MessageBox(0, 'Файл с заданным именем не найден. Действие отменено.'
      ,'Файл не найден', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
 
  ADOConnection1.Close;
 
  //Настройка пути к файлу базы данных.
 
  //Получаем параметры подключения из ADOConnection1.ConnectionString в виде списка.
  Sl := TStringList.Create;
  //Перед присвоением значения свойству Text, заменяем знаки ';' на пары знаков #13#10.
  Sl.Text := StringReplace(ADOConnection1.ConnectionString, ';', #13#10, [rfReplaceAll]);
  //Проверяем, присутствует ли параметр "Data Source".
  i := Sl.IndexOfName('Data Source');
  {Параметр "Data Source" должен иметь значение, равное полному пути к файлу
  базы данных. Если параметр "Data Source" уже присутствует, то устанавливаем
  его значение. Если такого параметра нет, то добавляем этот параметр вместе
  со значением.}
  if i > -1 then
    Sl.Values['Data Source'] := '"' + Od.FileName + '"'
  else
    Sl.Add('Data Source="' + Od.FileName + '"');
  //Перед присвоением значения свойству ConnectionString, заменяем пары знаков #13#10
  //на знак ';'.
  ADOConnection1.ConnectionString := '';
  ADOConnection1.ConnectionString := StringReplace(Trim(Sl.Text), #13#10, ';', [rfReplaceAll]);
  FreeAndNil(Sl);
 
  gFileName := Od.FileName;
  //Открываем базу данных.
  ADOConnection1.Open;
  //Получаем список таблиц базы и записываем этот список в ListBox1.
  ADOConnection1.GetTableNames(ListBox1.Items);
  ListBox1.ItemIndex := 0;
  Button3.Click;
end;
При первом открытии файла он открывается, при последующих попытках открытия любого excel файла, даже того который открывал первый раз, получаю сообщение об ошибке: "Нераспознаваемый формат базы данных. Далее идет полный путь к файлу."

Проект D7 во вложении.
1
Вложения
Тип файла: zip E2SQL.zip (438.0 Кб, 1 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2015, 18:51
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Решить проблему повторного открытия Excel файла (Delphi):

Файл: При чтении файла доступны первые 2 строчки, а остальные остаются не тронутым. Как решить проблему? - Delphi
Всем привет! Такой вопрос: я написал программку для регистрации и авторизации пользователей. Я естественно создал формы, Edit и конпки. Ц...

Поле повторного открытия формы не отображаются данные таблицы - Delphi
Доброго времени. Вот такая проблема: Запускаю в Делфи программу, открываю юнит с таблицей - данные на месте. После нажатия на кнопку...

Ошибка при попытке открытия документа Excel - Delphi
Почему ругается на открытие файла procedure TForm1.Button1Click(Sender: TObject); var i, j, RowCount, ColCount: Integer; ...

Отображение процесса открытия огромной excel-таблицы - Delphi
Всем доброго времени суток! Проблема такая - по нажатию кнопки надо открыть большую excel таблицу (~150 мегабайт). Естественно, это...

Ошибка открытия файла - Delphi
Создала новый проект, сохранила его, теперь возникает ошибка открытия файла. В чем дело? Может быть кто-то уже сталкивался с такой...

Ошибка открытия созданного файла - Delphi
Проблема: в лабораторной задано создать два файла. В предыдущей лабораторной создала файлы, они спокойно открываются в новой, но неверно...

21
bodya_men
Нарушитель
44 / 52 / 7
Регистрация: 01.07.2014
Сообщений: 1,007
Завершенные тесты: 3
29.05.2015, 19:44 #2
А дестроить объекты не пробовали?Create-Прочитали один файл-Free
0
Mawrat
12820 / 5728 / 676
Регистрация: 19.09.2009
Сообщений: 8,807
29.05.2015, 21:20 #3
Цитата Сообщение от bv7 Посмотреть сообщение
При первом открытии файла он открывается, при последующих попытках открытия любого excel файла, даже того который открывал первый раз, получаю сообщение об ошибке: "Нераспознаваемый формат базы данных. Далее идет полный путь к файлу."
Оказывается это баг в Delphi при работе с ADO. Вот, что происходит с содержимым ADOConnection1.ConnectionString во время работы программы (в виде псевдокода):
Код
//Начальное значение:
ADOConnection1.ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Data.xls;Mode=ReadWrite|Share Deny None;Extended Properties=Excel 8.0'

ADOConnection1.Close;

//Новое значение:
ADOConnection1.ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source="D:\Data.xls";Mode=ReadWrite|Share Deny None;Extended Properties=Excel 8.0'

ADOConnection1.Open;

//После открытия базы значение ADOConnection1.ConnectionString автоматически поменялось.
//И настройка "Extended Properties=Excel 8.0" просто исчезла!
ADOConnection1.ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\Data.xls;Mode=ReadWrite|Share Deny None;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=35;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;'

ADOConnection1.Close;

//После закрытия значение ADOConnection1.ConnectionString вновь автоматически поменялось.
//Настройка "Extended Properties=Excel 8.0" отсутствует:
ADOConnection1.ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source="D:\Data.xls";Mode=ReadWrite|Share Deny None;'

//Теперь, без настройки "Extended Properties=Excel 8.0", файл Excel уже не удастся открыть!
Чтобы это исправить надо прописать полное значение ConnectionString в коде. И это значение устанавливать каждый раз перед открытием базы (файла).
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//Открыть соединение с базой данных.
procedure TForm1.Button1Click(Sender: TObject);
var
  Od : TOpenDialog;
begin
  Od := OpenDialog1; //OpenDialog1 уже должен быть на форме.
  if Od.InitialDir = '' then
    Od.InitialDir := ExtractFilePath(ParamStr(0));
  if not Od.Execute then
    Exit;
  if not FileExists(Od.FileName) then
  begin
    MessageBox(Handle, 'Файл с заданным именем не найден. Действие отменено.',
      'Файл не найден', MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL);
    Exit;
  end;
 
  ADOConnection1.Close;
 
  //Настройка строки соединения с учётом нового пути к файлу базы данных.
  ADOConnection1.ConnectionString :=
    'Provider=Microsoft.Jet.OLEDB.4.0;'
    + 'Data Source="' + Od.FileName + '";'
    + 'Mode=ReadWrite|Share Deny None;Extended Properties=Excel 8.0';
 
  gFileName := Od.FileName;
  //Открываем базу данных.
  ADOConnection1.Open;
  //Получаем список таблиц базы и записываем этот список в ListBox1.
  ADOConnection1.GetTableNames(ListBox1.Items);
  if ListBox1.Items.Count > 0 then
    ListBox1.ItemIndex := 0;
  Button3.Click;
end;
0
bodya_men
Нарушитель
44 / 52 / 7
Регистрация: 01.07.2014
Сообщений: 1,007
Завершенные тесты: 3
29.05.2015, 21:31 #4
Mawrat, Поздравляю с решением проблемы!Хотел бы задать вопрос: вы не встречали аналоги библиотек для работы с БД для Lazarus?
1
bv7
21 / 9 / 2
Регистрация: 24.05.2014
Сообщений: 56
29.05.2015, 22:28  [ТС] #5
Цитата Сообщение от bodya_men Посмотреть сообщение
Mawrat, Поздравляю с решением проблемы!Хотел бы задать вопрос: вы не встречали аналоги библиотек для работы с БД для Lazarus?
Спасибо за помощь в решении, как то я момент с настройкой упустил.
Аналоги не встречал, я к Delphi вернулся спустя 3х годичного перерыва и то только из-за того что студентке с кодом для курсовой помочь надо.
А в гуле/яндексе совсем ничего нет? Я думаю что под линем на лазаре мало кто пишет там на питоне в основном вроде кодят.
Поищу, поспрашиваю, если что свисну.
1
bodya_men
Нарушитель
44 / 52 / 7
Регистрация: 01.07.2014
Сообщений: 1,007
Завершенные тесты: 3
29.05.2015, 23:00 #6
bv7, Интересно, а после трех лет вы тоже забыли весь ООП и пришлось вспоминать неделю?Сам в прошлом делфист а сейчас на Lazarus пишу.Кстати если интересно-попробуйте мой HTML редактор с открытом исходным кодом
www.sourceforge.net/projects/fallendropide
0
bv7
21 / 9 / 2
Регистрация: 24.05.2014
Сообщений: 56
29.05.2015, 23:05  [ТС] #7
Да примерно так оно и есть. Пока приложения для студентки писал в раш вошел решил и для себя наваять. Беру данные из присылаемых Excel файлов и имортирую их в SQL БД при этом задача такая в SQL должны быть только уникальные записи. Человеки же присылают файлы годичной давности, вот чтобы хлам не разводить сначала фильтрую, если есть изменения -- меняю, вобщем поддерживаю информацию в актуальном состоянии. Только наверное это никому не надо будет, кроме меня.

Модератор извини за оффтоп.
0
Mawrat
12820 / 5728 / 676
Регистрация: 19.09.2009
Сообщений: 8,807
29.05.2015, 23:10 #8
Цитата Сообщение от bodya_men Посмотреть сообщение
Mawrat, Поздравляю с решением проблемы!Хотел бы задать вопрос: вы не встречали аналоги библиотек для работы с БД для Lazarus?
Благодарю. А про библиотеки к Lazarus я не в курсе, к сожалению.
0
bodya_men
Нарушитель
44 / 52 / 7
Регистрация: 01.07.2014
Сообщений: 1,007
Завершенные тесты: 3
29.05.2015, 23:12 #9
bv7, как думаете-нормально ли хранить настройки в бд?Просто INI сильно устарел.
0
bv7
21 / 9 / 2
Регистрация: 24.05.2014
Сообщений: 56
29.05.2015, 23:13  [ТС] #10
Не подскажешь строку подключения для xlsx файлов, а то стоит у меня офис 2013 и нифига он эти файлы в Delphi не открывает.
Там вроде как универсального решения нет или я еще не дочитал до этого.

А про ООП, так мы 3 года назад исходник 9 месяцев компилировали, вот теперь приходится настройкой результата заниматься. То вирус подхватит то "кернел паник" начнется. (эт я про ребенка совего)
0
Mawrat
12820 / 5728 / 676
Регистрация: 19.09.2009
Сообщений: 8,807
29.05.2015, 23:18 #11
Цитата Сообщение от bodya_men Посмотреть сообщение
bv7, как думаете-нормально ли хранить настройки в бд?
Нормально.

Добавлено через 3 минуты
Цитата Сообщение от bv7 Посмотреть сообщение
Не подскажешь строку подключения для xlsx файлов
По формам ConnectionString есть специальный сайт: http://www.connectionstrings.com
ConnectionString для подключения к файлам Excel, в том числе - XLS и XLSX: http://www.connectionstrings.com/excel
0
bodya_men
Нарушитель
44 / 52 / 7
Регистрация: 01.07.2014
Сообщений: 1,007
Завершенные тесты: 3
29.05.2015, 23:19 #12
bv7, Хм... Если сохранен в офисе 2013-то формат скорее всего немного другой.Как вариант посмотреть сравнение файлов 2000х и 2013.Ведь компоненты Delphi 7 нацелены именно на офисы 1998-2003.Но я думаю если у вас XE-то проблем быть не должно.
0
bv7
21 / 9 / 2
Регистрация: 24.05.2014
Сообщений: 56
29.05.2015, 23:22  [ТС] #13
Цитата Сообщение от bodya_men Посмотреть сообщение
bv7, как думаете-нормально ли хранить настройки в бд?Просто INI сильно устарел.
bodya_men, да не нормально, плюсы хранения в ini - удалил файл и настройки удалились, бэкап iniшки сделал, вот тебе и откат без проблем. Программу удаляешь - потер за собой iniшку и все. В БД хранить конечно тоже не плохо, тут, как говорится, у каждого свой фен-шуй. Да еще вопросец возникает в связи с этим, а где хранить настройку подключения к БД, если все настройки лежат в БД. Так, что место для хранения у каждого своё, кто в Бд, кто в ini, кто в реестре.

Новое - хорошо забытое старое.

Я все еще в ini настройки сохраняю, меня все устраивает. Прочитал при запуске разок, а больше и не надо.
bodya_men, давай на "ты".
0
Mawrat
12820 / 5728 / 676
Регистрация: 19.09.2009
Сообщений: 8,807
29.05.2015, 23:33 #14
О драйверах при работе через ADO. В Delphi компоненты ADO - это интерфейсы к ADO движку. А ADO движок работает через MDAC - Microsoft Data Access Components. Особенности работы зависят от версии ADO драйверов и MDAC драйверов. Причём, некоторые драйвера MDAC устанавливает установщик BDE. Например, это касается драйверов для работы с БД Paradox и DBase. Что касается файлов MS Excel и Access - работа с ними полностью зависит от драйвера ADO (Microsoft.JET.OLEDB/Microsoft.ACE.OLEDB) и от драйверов MDAC. Т. е., от версии Delphi здесь нет зависимости.
0
bodya_men
Нарушитель
44 / 52 / 7
Регистрация: 01.07.2014
Сообщений: 1,007
Завершенные тесты: 3
30.05.2015, 08:48 #15
bv7, Конечно.У ini множество удобств но он остался еще со времен win9x и его в любой момент могут убрать в пользу XML.Можно написать и свой парсер.Да его можно сделать под свои нужды-но тут же встает вопрос производительности.

Добавлено через 9 часов 11 минут
Mawrat,что можешь сказать по поводу XML, xsl,ini?Что для тебя предпочтительней?
0
30.05.2015, 08:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2015, 08:48
Привет! Вот еще темы с ответами:

Отлов события открытия файла в приложении - Delphi
Всем привет. У меня такой трабл. Создал в Delphi текстовый редактор, но реализацию автоматического определения файла , при открытии файла с...

Ошибка открытия файла через мою программу - Delphi
Всем доброго времени суток. Решил создать прогу в Делфи, которая шифрует файлы. Но проблема не в этом. Когда я нажимаю -Открыть- ,...

После открытия файла не работают поиск и сортировка - Delphi
Если ввожу входные данные через эдиты все работает Но если после запуска открываю файл для чтения, то ни сортировка, ни поиск не работают...

Запрет открытия файла если он уже открыт! - Delphi
Вообщем ситуация такая: написал программу для записи и чтения информации из файла. Этот файл открывают с разных компов по сети. Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru