Excel Через Ado

Тема в разделе "Delphi - Базы данных", создана пользователем GriffinSC, 13 апр 2012.

  1. GriffinSC

    GriffinSC New Member

    Регистрация:
    18 ноя 2010
    Сообщения:
    4
    Симпатии:
    0
    Здравствуйте!
    Начну с проблемы. У меня есть Excel файл 2003, и там есть столбец, в котором и числа и буквы. Но когда программа открывает это файл, "разнотипный" столбец в DBGrid определяется как числовой, и ячейки в которых текст не отображаются. Можно как-нибудь жестко задать тип столбца в Delphi?
    Ниже открытие базы.
    В DBGrid есть column "0 - Карта", так вот он почему-то определяется как числовой B)
    Код (Text):
    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!
     
  2. sinkopa

    sinkopa Well-Known Member

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

Поделиться этой страницей