| 
| 
 | Вопрос # 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);varrow_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;
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |