|
Вопрос # 5 264/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты! Подскажите, есть ли возможность внести данные в базу MS Access из таблице MS Excel . То есть я хочу что бы в программе задал путь к таблице, потом указал диапазон ячеек например (A2:A1249), а программа внесла эти значения в MS Access в столбец «фамилия». Тем самым я упрощу работу, не внося информацию о студентах в ручную через программу, а с уже готовой Excel таблице считаю данные! Возможно ли это, будьте любезны посоветуйте, каким кодом это сделать!
 |
Вопрос задал: alexlafa (статус: Посетитель)
Вопрос отправлен: 7 мая 2011, 11:15
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Шичко Игорь
Здравствуйте, alexlafa!
В приложении разместил примерный код.
На форме только кнопка.
Компоненты ADOConnection1 и ADOQuery1 не забудьте добавить.
Вопросы - пишите в форум.
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, ComObj, DB, ADODB;
-
- type
- TForm1 = class(TForm)
- Button1: TButton;
- ADOConnection1: TADOConnection;
- ADOQuery1: TADOQuery;
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
- Excel, WorkBook, Sheet: variant;
-
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.Button1Click(Sender: TObject);
- var
- row_tek: integer;
- param: array of string;
- s: string;
-
- begin
-
- Excel:= CreateOleObject('Excel.Application');
- Excel.DisplayAlerts:= False;
- Excel.Visible:= True;
-
-
-
-
-
- begin
- SetLength(param, 0); SetLength(param, 6);
-
- param[1]:= TrimLeft(Sheet.Range['b' + IntToStr(row_tek)].text);
- param[2]:= TrimLeft(Sheet.Range['c' + IntToStr(row_tek)].text);
- param[3]:= TrimLeft(Sheet.Range['d' + IntToStr(row_tek)].text);
- param[4]:= TrimLeft(Sheet.Range['e' + IntToStr(row_tek)].text);
- param[5]:= TrimLeft(Sheet.Range['f' + IntToStr(row_tek)].text);
- ADOQuery1.SQL.Clear;
- s:= '';
-
- s:= s + param[0] + ''', ''' + param[1] + ''', ''' + param[2] + ''', ''' + param[3] + ''', ''' +
param[4] + ''', ''' + param[5] + ''')';
- ADOQuery1.SQL.Text:= s;
-
-
-
-
- end;
-
-
- WorkBook.Close;
- Excel.Quit;
- Excel:= UnAssigned;
-
- end;
-
- end.
-
 |
Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 7 мая 2011, 14:01
Оценка за ответ: 5
Комментарий к оценке: Большое спасибо!
|
Мини-форум вопроса
Всего сообщений: 10; последнее сообщение — 7 мая 2011, 17:22; участников в обсуждении: 3.
|
Егор (статус: 10-ый класс), 7 мая 2011, 11:24 [#1]:
а что мешает в экселе выделить ячейки, перейти в аксесс и сделать вставку?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
alexlafa (статус: Посетитель), 7 мая 2011, 11:39 [#2]:
Не это конечно можно сделать! Просто я дипломную работу делаю, чем больше я автоматизирую тем лучше будет! и хотелось узнать, можно ли сделать программно и как сделать примерно!
|
|
Шичко Игорь (статус: 9-ый класс), 7 мая 2011, 12:37 [#3]:
Переносить предусматривается только один столбец данных или их будет много?
|
|
alexlafa (статус: Посетитель), 7 мая 2011, 12:59 [#4]:
Переносить буду около 30 столбцов, допустим в «комбобоксе» я выбрал столбец базы Access, указал диапазон в «Едите» таблицы Excel, и программа сама перенесла данные с этого диапазона в столбец Access! И так же сделать для каждого столбца!
|
|
Шичко Игорь (статус: 9-ый класс), 7 мая 2011, 13:03 [#5]:
А почему бы не перенести данные целиком. Т.е. считываем построчно и записываем сразу несколько полей
|
|
alexlafa (статус: Посетитель), 7 мая 2011, 13:15 [#6]:
Столбцы таблице несколько отличаются со столбцами в Excel. Если я начну вносить информацию построчно то записи внесутся не правильно! Поэтому мне нужно уточнить столбец Access и считать данные именно по диапазону! Если я конечно правильно понял вашу идею!? Но я буду признателен если вы подскажите каким кодом можно перенести все целиком?! Может это как то мне поможет!
|
|
Шичко Игорь (статус: 9-ый класс), 7 мая 2011, 13:21 [#7]:
Сейчас попробую, у меня где-то было похожее.
|
|
alexlafa (статус: Посетитель), 7 мая 2011, 13:25 [#8]:
Благодарю, буду очень признателен!
|
|
alexlafa (статус: Посетитель), 7 мая 2011, 17:09 [#9]:
while Trim(Sheet.Range['a' + IntToStr(row_tek)]) > '' do // до тех пор пока в столбце А есть данные
begin
SetLength(param, 0); SetLength(param, 6);
param[0]:= TrimLeft(Sheet.Range['a' + IntToStr(row_tek)].text); // считываем данные
param[1]:= TrimLeft(Sheet.Range['b' + IntToStr(row_tek)].text);
param[2]:= TrimLeft(Sheet.Range['c' + IntToStr(row_tek)].text);
param[3]:= TrimLeft(Sheet.Range['d' + IntToStr(row_tek)].text);
param[4]:= TrimLeft(Sheet.Range['e' + IntToStr(row_tek)].text);
param[5]:= TrimLeft(Sheet.Range['f' + IntToStr(row_tek)].text);
ADOQuery1.SQL.Clear;
s:= '';
s:= s + 'Insert Into Student (pole_1,pole_2, pole_3, pole_4, pole_5, pole_6) values ('''; //
пишем в поля
s:= s + param[0] + ''', ''' + param[1] + ''', ''' + param[2] + ''', ''' + param[3] + ''', ''' +
param[4] + ''', ''' + param[5] + ''')';
ADOQuery1.SQL.Text:= s;
ADOQuery1.ExecSQL; // выполняем запрос
row_tek:= row_tek + 1; // переходим на следующую строку
end;
Не сочтите за наглость, не могли бы вы дать подробней комментарий к вот этой части кода. Поместил на форму все вышеуказанные компоненты, программа работает без ошибок, может я, что то не понял, не могу понять что выполняет программа!?
|
|
Шичко Игорь (статус: 9-ый класс), 7 мая 2011, 17:22 [#10]:
while Trim(Sheet.Range['a' + IntToStr(row_tek)]) > '' do // перебираем строки до тех пор пока в столбце А есть данные
begin
SetLength(param, 0); SetLength(param, 6); // обнуляем массив данных, устанавливаем его длину
param[0]:= TrimLeft(Sheet.Range['a' + IntToStr(row_tek)].text); // считываем данные в массив с ячейки a2, a3 и т.д.
param[1]:= TrimLeft(Sheet.Range['b' + IntToStr(row_tek)].text); // считываем данные в массив с ячейки b2, b3 и т.д.
param[2]:= TrimLeft(Sheet.Range['c' + IntToStr(row_tek)].text); // считываем данные в массив с ячейки с2, с3 и т.д.
param[3]:= TrimLeft(Sheet.Range['d' + IntToStr(row_tek)].text);
param[4]:= TrimLeft(Sheet.Range['e' + IntToStr(row_tek)].text);
param[5]:= TrimLeft(Sheet.Range['f' + IntToStr(row_tek)].text);
ADOQuery1.SQL.Clear; // очищаем запрос
s:= '';
s:= s + 'Insert Into Student (pole_1,pole_2, pole_3, pole_4, pole_5, pole_6) values ('''; //
формируем запрос на вставку данных из массива в соответствующие поля
s:= s + param[0] + ''', ''' + param[1] + ''', ''' + param[2] + ''', ''' + param[3] + ''', ''' +
param[4] + ''', ''' + param[5] + ''')';
ADOQuery1.SQL.Text:= s; // присваиваем значение текста запроса
ADOQuery1.ExecSQL; // выполняем запрос
row_tek:= row_tek + 1; // переходим на следующую строку
end;
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|