Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
bv7
21 / 9 / 3
Регистрация: 24.05.2014
Сообщений: 56
#1

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

29.05.2015, 18:51. Просмотров 1915. Ответов 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
Ответы с готовыми решениями:

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

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

Отображение процесса открытия огромной excel-таблицы
Всем доброго времени суток! Проблема такая - по нажатию кнопки надо открыть...

Ошибка при попытке открытия документа Excel
Почему ругается на открытие файла procedure TForm1.Button1Click(Sender:...

Ошибка открытия файла
Создала новый проект, сохранила его, теперь возникает ошибка открытия файла. В...

21
bodya_men
Нарушитель
44 / 52 / 8
Регистрация: 01.07.2014
Сообщений: 1,007
Завершенные тесты: 3
29.05.2015, 19:44 #2
А дестроить объекты не пробовали?Create-Прочитали один файл-Free
0
Mawrat
12824 / 5732 / 1700
Регистрация: 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 / 8
Регистрация: 01.07.2014
Сообщений: 1,007
Завершенные тесты: 3
29.05.2015, 21:31 #4
Mawrat, Поздравляю с решением проблемы!Хотел бы задать вопрос: вы не встречали аналоги библиотек для работы с БД для Lazarus?
1
bv7
21 / 9 / 3
Регистрация: 24.05.2014
Сообщений: 56
29.05.2015, 22:28  [ТС] #5
Цитата Сообщение от bodya_men Посмотреть сообщение
Mawrat, Поздравляю с решением проблемы!Хотел бы задать вопрос: вы не встречали аналоги библиотек для работы с БД для Lazarus?
Спасибо за помощь в решении, как то я момент с настройкой упустил.
Аналоги не встречал, я к Delphi вернулся спустя 3х годичного перерыва и то только из-за того что студентке с кодом для курсовой помочь надо.
А в гуле/яндексе совсем ничего нет? Я думаю что под линем на лазаре мало кто пишет там на питоне в основном вроде кодят.
Поищу, поспрашиваю, если что свисну.
1
bodya_men
Нарушитель
44 / 52 / 8
Регистрация: 01.07.2014
Сообщений: 1,007
Завершенные тесты: 3
29.05.2015, 23:00 #6
bv7, Интересно, а после трех лет вы тоже забыли весь ООП и пришлось вспоминать неделю?Сам в прошлом делфист а сейчас на Lazarus пишу.Кстати если интересно-попробуйте мой HTML редактор с открытом исходным кодом
www.sourceforge.net/projects/fallendropide
0
bv7
21 / 9 / 3
Регистрация: 24.05.2014
Сообщений: 56
29.05.2015, 23:05  [ТС] #7
Да примерно так оно и есть. Пока приложения для студентки писал в раш вошел решил и для себя наваять. Беру данные из присылаемых Excel файлов и имортирую их в SQL БД при этом задача такая в SQL должны быть только уникальные записи. Человеки же присылают файлы годичной давности, вот чтобы хлам не разводить сначала фильтрую, если есть изменения -- меняю, вобщем поддерживаю информацию в актуальном состоянии. Только наверное это никому не надо будет, кроме меня.

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

А про ООП, так мы 3 года назад исходник 9 месяцев компилировали, вот теперь приходится настройкой результата заниматься. То вирус подхватит то "кернел паник" начнется. (эт я про ребенка совего)
0
Mawrat
12824 / 5732 / 1700
Регистрация: 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 / 8
Регистрация: 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 / 3
Регистрация: 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
12824 / 5732 / 1700
Регистрация: 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 / 8
Регистрация: 01.07.2014
Сообщений: 1,007
Завершенные тесты: 3
30.05.2015, 08:48 #15
bv7, Конечно.У ini множество удобств но он остался еще со времен win9x и его в любой момент могут убрать в пользу XML.Можно написать и свой парсер.Да его можно сделать под свои нужды-но тут же встает вопрос производительности.

Добавлено через 9 часов 11 минут
Mawrat,что можешь сказать по поводу XML, xsl,ini?Что для тебя предпочтительней?
0
Mawrat
12824 / 5732 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
30.05.2015, 10:06 #16
Я думаю, XML и INI вполне подходят для различных случаев. XML - для структурированных иерархических данных, INI - для линейных списков. В общем, INI весьма широко используется. Часто это файлы без расширения INI, но по сути то же самое: имя=значение. В современных системах хранить их следует в директории ApplicationData (их несколько). Ну и реестр - тоже вариант. Мне больше нравятся файлы. Упала система, так, что не запускается - но файл с настройками всегда можно забрать (если файловая система жива).
0
bv7
21 / 9 / 3
Регистрация: 24.05.2014
Сообщений: 56
30.05.2015, 10:25  [ТС] #17
Если открывать данные форматы файлов в простом блокноте, то конечно же ini, там информация читабельнее. XML конечно новее ini и возможностей больше, но я думаю принципиальной разницы в чем хранить и как нет, все зависит от фантазии разработчика.
0
bodya_men
Нарушитель
44 / 52 / 8
Регистрация: 01.07.2014
Сообщений: 1,007
Завершенные тесты: 3
30.05.2015, 12:41 #18
Просто дело в том что кроме редактора(он не обновляется уже три недели) я пишу игровой движок.2D с GDI.С движком проблем нет но вот как представлять уровень-незнаю.В ini чтобы создать один объект придется делать что то вроде:
[level]
obj_sprite_player=путь до спрайта
obj_sprite_player_x=12
obj_sprite_player_y=23
и.т.д
0
bv7
21 / 9 / 3
Регистрация: 24.05.2014
Сообщений: 56
30.05.2015, 19:28  [ТС] #19
Цитата Сообщение от bodya_men Посмотреть сообщение
Просто дело в том что кроме редактора(он не обновляется уже три недели) я пишу игровой движок.2D с GDI.С движком проблем нет но вот как представлять уровень-незнаю.В ini чтобы создать один объект придется делать что то вроде:
[level]
obj_sprite_player=путь до спрайта
obj_sprite_player_x=12
obj_sprite_player_y=23
и.т.д
Вообще то это тема совсем другого разговора, на вскидку даже не скажу как лучше будет.
Предлагаю перенести вопрос в новую ветку, там уже этот вопрос будут обсуждать не 1-2 человека.
0
bodya_men
Нарушитель
44 / 52 / 8
Регистрация: 01.07.2014
Сообщений: 1,007
Завершенные тесты: 3
30.05.2015, 21:33 #20
bv7, хорошо.Но... я думаю что это можно в бд хранить.И проще будет.
0
30.05.2015, 21:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2015, 21:33

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

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

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


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

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

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