Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 264

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты! Подскажите, есть ли возможность внести данные в базу MS Access из таблице MS Excel . То есть я хочу что бы в программе задал путь к таблице, потом указал диапазон ячеек например (A2:A1249), а программа внесла эти значения в MS Access в столбец «фамилия». Тем самым я упрощу работу, не внося информацию о студентах в ручную через программу, а с уже готовой Excel таблице считаю данные! Возможно ли это, будьте любезны посоветуйте, каким кодом это сделать!

alexlafa Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: alexlafa (статус: Посетитель)
Вопрос отправлен: 7 мая 2011, 11:15
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Шичко Игорь

Здравствуйте, alexlafa!
В приложении разместил примерный код.
На форме только кнопка.
Компоненты ADOConnection1 и ADOQuery1 не забудьте добавить.
Вопросы - пишите в форум.

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls, ComObj, DB, ADODB;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Button1: TButton;
  12. ADOConnection1: TADOConnection;
  13. ADOQuery1: TADOQuery;
  14. procedure Button1Click(Sender: TObject);
  15. private
  16. { Private declarations }
  17. public
  18. { Public declarations }
  19. end;
  20.  
  21. var
  22. Form1: TForm1;
  23. Excel, WorkBook, Sheet: variant;
  24.  
  25. implementation
  26.  
  27. {$R *.dfm}
  28.  
  29. procedure TForm1.Button1Click(Sender: TObject);
  30. var
  31. row_tek: integer;
  32. param: array of string;
  33. s: string;
  34.  
  35. begin
  36.  
  37. Excel:= CreateOleObject('Excel.Application');
  38. Excel.DisplayAlerts:= False;
  39. Excel.Visible:= True;
  40.  
  41.  
  42.  
  43.  
  44.  
  45. begin
  46. SetLength(param, 0); SetLength(param, 6);
  47.  
  48. param[1]:= TrimLeft(Sheet.Range['b' + IntToStr(row_tek)].text);
  49. param[2]:= TrimLeft(Sheet.Range['c' + IntToStr(row_tek)].text);
  50. param[3]:= TrimLeft(Sheet.Range['d' + IntToStr(row_tek)].text);
  51. param[4]:= TrimLeft(Sheet.Range['e' + IntToStr(row_tek)].text);
  52. param[5]:= TrimLeft(Sheet.Range['f' + IntToStr(row_tek)].text);
  53. ADOQuery1.SQL.Clear;
  54. s:= '';
  55.  
  56. s:= s + param[0] + ''', ''' + param[1] + ''', ''' + param[2] + ''', ''' + param[3] + ''', ''' + param[4] + ''', ''' + param[5] + ''')';
  57. ADOQuery1.SQL.Text:= s;
  58.  
  59.  
  60.  
  61.  
  62. end;
  63.  
  64.  
  65. WorkBook.Close;
  66. Excel.Quit;
  67. Excel:= UnAssigned;
  68.  
  69. end;
  70.  
  71. end.
  72.  


Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 7 мая 2011, 14:01
Оценка за ответ: 5

Комментарий к оценке: Большое спасибо!

Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 7 мая 2011, 17:22; участников в обсуждении: 3.
Егор

Егор (статус: 10-ый класс), 7 мая 2011, 11:24 [#1]:

а что мешает в экселе выделить ячейки, перейти в аксесс и сделать вставку?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
alexlafa

alexlafa (статус: Посетитель), 7 мая 2011, 11:39 [#2]:

Не это конечно можно сделать! Просто я дипломную работу делаю, чем больше я автоматизирую тем лучше будет! и хотелось узнать, можно ли сделать программно и как сделать примерно!
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 7 мая 2011, 12:37 [#3]:

Переносить предусматривается только один столбец данных или их будет много?
alexlafa

alexlafa (статус: Посетитель), 7 мая 2011, 12:59 [#4]:

Переносить буду около 30 столбцов, допустим в «комбобоксе» я выбрал столбец базы Access, указал диапазон в «Едите» таблицы Excel, и программа сама перенесла данные с этого диапазона в столбец Access! И так же сделать для каждого столбца!
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 7 мая 2011, 13:03 [#5]:

А почему бы не перенести данные целиком. Т.е. считываем построчно и записываем сразу несколько полей
alexlafa

alexlafa (статус: Посетитель), 7 мая 2011, 13:15 [#6]:

Столбцы таблице несколько отличаются со столбцами в Excel. Если я начну вносить информацию построчно то записи внесутся не правильно! Поэтому мне нужно уточнить столбец Access и считать данные именно по диапазону! Если я конечно правильно понял вашу идею!? Но я буду признателен если вы подскажите каким кодом можно перенести все целиком?! Может это как то мне поможет!
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 7 мая 2011, 13:21 [#7]:

Сейчас попробую, у меня где-то было похожее.
alexlafa

alexlafa (статус: Посетитель), 7 мая 2011, 13:25 [#8]:

Благодарю, буду очень признателен!
alexlafa

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;

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:36
Выполнено за 0.03 сек.