Итак кaк и обещал, долгожданная статья по конвертации данных из Excel в Access. Тут скажу сразу ничего сложного нету, только лишь воспользуемся знаниями, полученными ранее при работе с данными БД по технологии ADO. Смысл всего этого, делаем запрос в MS Excel на количество записей и количество столбцов, затем по этому количество создаем таблицу в MS Access полями типа MEMO. Мы будем все данные переводить в строковый тип, можно будет усовершенстовать потом конвертирование, чтобы оно само определяло какой тип данных в колонке Excel и такой тип создавать в нашей БД, но это не сейчас, нам сейчас главное понять суть конвертации. Итак на форме у меня следующее
  • TADOConnection — 2 шт
  • TADOQuery — 2 шт
  • TEdit — 2 шт
  • TButton — 2 шт
  • TBitBtn — 2 шт
  • TProgressBar
  • TOpenDialog
Вот такая форма у меня вышла

Вы можете сделать свою, но роли тут ничего это не играет. Итак на Button1 события OnClick нам надо подключить наш Excel файл и получить там количество столбцов и записей, это делается следующим образом.
procedure TForm1.Button1Click(Sender: TObject);
begin
try
if OpenDialog1.Execute then
begin
Edit1.Text:=OpenDialog1.FileName;
ADOConnection1.ConnectionString:='Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DSN=Файлы Excel;DBQ='+OpenDialog1.FileName+';DefaultDir='+ExtractFileDir(OpenDialog1.FileName)+';DriverId=790;MaxBufferSize=2048;PageTimeout=5;"';
ADOConnection1.Connected:=True;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM [Лист1$]');
ADOQuery1.Active:=True;
end;
except
on e:Exception do
end;
end;

Как видите мы вручную прописываем путь подключения и вручную указываем Connected - True. Да кстати чуть не забыл настройте за ранее AdoConnection1 и AdoConnection2, в свойствах LongPromt выставим — False, а в свойстве Mode - cmShareDenyNone. Итак данные из Excel файла мы получили, затем нам надо подключить нашу БД MS Access, делается это анологичным способом, на событие Button2 - OnClick пишем

procedure TForm1.Button2Click(Sender: TObject);
begin
try
if OpenDialog1.Execute then
begin
Edit2.Text:=OpenDialog1.FileName;
ADOConnection2.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+OpenDialog1.FileName+';Persist Security Info=False';
ADOConnection2.Connected:=True;
end
else
exit;
except
on e:Exception do
end;
end;

Как видите тоже все вручную подлючаем, только отличается подключение от подключения MS Excel - драйвером БД. Все данные у нас получены, нам придется теперь создать таблицы в MS Access, чтобы потом записывать туда данные из Excel. Для это делаем следующее.

procedure TForm1.BitBtn1Click(Sender: TObject);
var
i,j:integer;
name_fields:string;
begin
try
name_fields:='';
for i:=0  to ADOQuery1.FieldCount-1 do
begin
name_fields:=name_fields+'pole'+IntToStr(i)+' MEMO,';
end;
Delete(name_fields,length(name_fields),1);
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('CREATE TABLE OUT ('+name_fields+')');
ADOQuery2.ExecSQL;
 
except
on e:Exception do
Application.MessageBox(Pchar(e.Message),'Внимание',MB_OK);
end;
Как видите мы проходимся циклом по количеству столбцов в MS Excel и формируем наши столбцы для БД MS Access, после этого запросом Create Table мы создаем нашу таблицу с нужным количеством столбцов, конечно если таблица данная будет уже существовать в данной БД, будет естественно ошибка. Мы ее перехватим. Далее мы активируем наш ADOQuery2, чтобы можно было туда записывать записи и конвертируем, а точнее записываем. Конечно у нас будет только работать отлично если в нашем Excel файле только текстовые поля, с текстовыми данными, но это решаемо все, мы напишем вот такую вот функцию, которая все время, любой формат будет переводить в текстовый и у нас не будет проблем с конвертацией.
Наша функция конвертирования типов данных
function ToString(Value: Variant): String;
begin
case TVarData(Value).VType of
varSmallInt,
varInteger   : Result := IntToStr(Value);
varSingle,
varDouble,
varCurrency  : Result := FloatToStr(Value);
varDate      : Result := FormatDateTime('dd/mm/yyyy', Value);
varBoolean   : if Value then Result := 'T' else Result := 'F';
varString    : Result := Value;
else            Result := '';
end;
end;
Далее мы наконец-то напишем полный код на кнопку «Начать» для конвертации данных и станет все понятно.
procedure TForm1.BitBtn1Click(Sender: TObject);
var
i,j:integer;
name_fields:string;
begin
try
name_fields:='';
for i:=0  to ADOQuery1.FieldCount-1 do
begin
name_fields:=name_fields+'pole'+IntToStr(i)+' MEMO,';
end;
Delete(name_fields,length(name_fields),1);
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('CREATE TABLE OUT ('+name_fields+')');
ADOQuery2.ExecSQL;
ADOQuery1.First;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('SELECT * FROM OUT');
ADOQuery2.Active:=True;
ADOQuery2.First;
for i:=0 to ADOQuery1.RecordCount-1 do
begin
ProgressBar1.Max:=ADOQuery1.RecordCount;
ADOQuery2.Insert;
for j:=0 to ADOQuery1.FieldCount-1 do
begin
ADOQuery2.Fields[j].AsVariant:=ToString(ADOQuery1.Fields.Fields[j].AsVariant);
end;
ProgressBar1.Position:=ProgressBar1.Position+1;
ADOQuery2.Post;
ADOQuery1.Next;
end;
except
on e:Exception do
Application.MessageBox(Pchar(e.Message),'Внимание',MB_OK);
end;
end;
Как видите используем данную функцию и перехватываем ошибки, которые возникают у нас, также прикрутим наш ProgressBar, чтобы пользователь знал когда ему можно открывать уже БД. Ну как понравился урок? Думаю для начала неплохо, этот проект мы не забрасываем, а дальше усовершенствуем его, наведем порядок, оптимизируем немного, а также сделаем конвертацию данных наооборот, что будет неплохо. Ждем следующих статей
Исходники статьи можно скачать со страницы Исходники
Автор статьи - Andrey53

Метки: , , , , , , ,




К записи “Конвертация данных. Работа с ADO. Часть 1” оставлено комментариев: 11.

  1. zerdalert:

    А как наоборот из Access в Excel переконвертировать и сохранить в указанном месте. Данные скажем ADO DBGridEh Access при нажатии кнопки сохранить как, сохраняет данные в указанное пользователем место в файле Еxcel.

    • Andrey53:

      Точно также как и сейчас, делаем запрос в Access и этот запрос по одной записи записываем в excel-лист, будет время у меня рассмотрю это.!

  2. aleksey1307:

    Добрый день, ознакомился с вашей статьей. Но возникает ошибка при компиляции:
    [DCC Error] Unit1.pas(118): E2034 Too many actual parameters
    ругается на данную строчку:
    ADOQuery2.Fields[j].AsVariant:=ToString(ADOQuery1.Fields.Fields[j].AsVariant);

    • Andrey53:

      Здравствуйте, Мой исходник не компилирует? если Вы делаете свой, то не забудьте описать функцию ToString, которая преобразует любые значения в текстовые

  3. Андрей:

    По-русски надо писать ВыберИте файл, а не выберЕте.

  4. Zerdalert:

    Привет Андрей. Вот вынужден обратиться к тебе снова, поскольку нигде не могу найти вразумительного объяснения, как в ADO ACCESS, по нажатию клавиши Button, данные из DBGridEh сохранить в Excelевский файл? Если знаешь, объясни пожалуйста…

    • Andrey:

      можно импортировать в Excel, а можно создать заготовку Excel-файла с нужнеыми полями и подключить его как БД и с помощью запросов переносить туда данные

  5. Михаил:

    а как конвертировать не в мемо а в другие форматы, у меня проблема дбгрид не отображает данные типа мемо

  6. niky-ur:

    Доброго времени суток Андрей!
    При исполнении запроса к таблице Exl выдает следующее » Missing Connection or ConnectionString» Почему?

Оставить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*