• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Excel Через Ado

  • Автор темы GriffinSC
  • Дата начала
G

GriffinSC

Здравствуйте!
Начну с проблемы. У меня есть Excel файл 2003, и там есть столбец, в котором и числа и буквы. Но когда программа открывает это файл, "разнотипный" столбец в DBGrid определяется как числовой, и ячейки в которых текст не отображаются. Можно как-нибудь жестко задать тип столбца в Delphi?
Ниже открытие базы.
В DBGrid есть column "0 - Карта", так вот он почему-то определяется как числовой B)
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
Button2.Enabled:=false;
btn1.Enabled:=false;
if dlgOpen1.Execute then
begin
Form1.ADOConnection1.ConnectionString:='Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DSN=Файлы Excel;DBQ='+dlgOpen1.FileName+';DefaultDir='+ExtractFilePath(dlgOpen1.FileName)+';DriverId=790;MaxBufferSize=2048;PageTimeout=5;"';
Form1.ADOConnection1.DefaultDatabase:=dlgOpen1.FileName;
end;
Form1.Left:=0;
Form1.Top:=0;
Form1.ClientWidth:=Screen.Width-8;
Form1.ClientHeight:=Screen.Height-100;
Form1.DBGrid1.Width:=Form1.ClientWidth-100;
Form1.DBGrid1.Height:=Form1.ClientHeight;

try
id:=1;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM [Лист1$]');
ADOQuery1.Active:=True;
id_count:=ADOQuery1.RecordCount+1;
except
on e:Exception do
end;
end;
Help me please!
 
S

sinkopa

Здравствуйте!
Начну с проблемы. У меня есть Excel файл 2003, и там есть столбец, в котором и числа и буквы. Но когда программа открывает это файл, "разнотипный" столбец в DBGrid определяется как числовой, и ячейки в которых текст не отображаются. Можно как-нибудь жестко задать тип столбца в Delphi?
В Delphi то можно... только вот в Excel-е нельзя, вот в чем штука то вся... :(
Первая проблема - У Excel есть только два формата хранения (данных ячейки) строка и вещественное число.
Все остальное (целое, дата/время, формула и пр...) есть формат отображения данных.
Вторая проблема, в каждой ячейке формат хранения свой, причем назначается Excel-лем автоматически.
Т.е. нет никакой возможности вручную задать один формат хранения для целого столбца.
Даже если вручную указать формат (например строка), это повлияет только на формат отображения в самом экселе.
Ниже открытие базы.
В DBGrid есть column "0 - Карта", так вот он почему-то определяется как числовой :(
Help me please!
Применительно к Вашему коду происходит следующее:
Формат поля ADOConnection определяет по первой строчке (в данных запроса) и назначает его датасету.
Соответственно при чтении последующих записей (строчек) не ожидается изменения формата.
И когда такое вдруг происходит - возникает исключение и данные не заносятся.
Т.е. если первой (в колонке экселя) определилась строка, при обнаружении цифры возникнет ошибка и выведется ""
и наоборот... :D
Когда я в свое время столкнулся с аналогичной проблемой и задал вопрос "что делать?" на форуме разработчиков MSOffice Excel
Мне предложили 2 варианта:
1. Сначала перенести данные из Excel в Ms Access а потом уже делать SQL запросы к базе Access.
2. Вручную (или кодом) занести символ <'> (апостроф) в начало каждой ячейки (которые с цифрами) таблицы Excel. После чего формат ячейки однозначно будет считаться строковым. А сам этот апостроф "физически" в ячейке не отображается (и в SQL запросе тоже каким-то образом)...
Вот собственно...
Кстати, отказаться от ADOConnection для получения данных из Экселя мне никто (там, на форуме) не предлагал...
Уж не знаю надо ли мне это делать... :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!