Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
5 / 5 / 2
Регистрация: 04.10.2010
Сообщений: 205

Записать данных из нескольких файлов Excel в одну таблицу

10.04.2015, 12:51. Показов 1477. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, форумчане!
Возник вопрос с занесением данных из нескольких файлов Excel в одну таблицу. Каюсь, мне помогли реализовать часть кода, который реализует по принципу : test.XLS => test.DBF, 123.XLS => 123.DBF, но решил переписать, чтобы все писалось все же в один файл.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function TForm1.ProcBook(const aExApp : OleVariant; const aFileName : String;
  const aTableName : String; aTblNames : TStrings) : Boolean;
var
  exBook, exSh : OleVariant;
  Arr : TArr;
  i, ErrCode : Integer;
  Path : String;
begin
  Result := False;
  //Путь к директорию, в котором лежит исполняемый файл программы.
  Path := ExtractFilePath(ParamStr(0));
  Arr := nil;
  try
    try
      //Открываем рабочую книгу и получаем ссылку на её интерфейс.
      exBook := aExApp.Workbooks.Open(FileName:=aFileName);
      //Получаем ссылку на интерфейс первого листа рабочей книги.
      exSh := exBook.Worksheets[1];
      //Получаем с листа MS Excel все данные из нужных колонок.
      Arr := ExRangeToDArr(exSh, 2, 1, 0, 0);
        
      //Если таблица уже существует, то удаляем её.
      if aTblNames.IndexOf(aTableName) > -1 then
      try
        ADOQuery1.SQL.Text := 'DROP TABLE [' + aTableName + ']'; //SQL запрос для удаления таблицы.
        ADOQuery1.ExecSQL;
      except
      end;
 
     ... 
      //Запускаем транзакцию.
      ADOConnection1.BeginTrans;
      //Из данных массива Arr формируем пакет для записи в базу данных.
      for i := 0 to High(Arr) do
      begin
        //SQL команда для вставки данных в таблицу.
        ADOQuery1.SQL.Text := 'INSERT INTO [' + aTableName + ']'
          + ' VALUES (:ПОЛЕ, :ПОЛЕ1, :ПОЛЕ2, :ПОЛЕ3 );';
...
Сами файлы Excel уже преобразованы так, что по структуре соответствуют таблице базы данных (указаны форматы ячеек, имена столбцов).

В операциях постарался вместо "aTableName " указать имя одной единственной таблицы, но такой подход не сработал.
Выслушаю все мысли, идеи и замечания. Прошу, нужна ваша помощь!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.04.2015, 12:51
Ответы с готовыми решениями:

Объединение нескольких файлов в одну таблицу (макрос не работает)
Нашел макрос Sub LoadDataFromWorkbooks() On Error Resume Next: Err.Clear Dim AskForFolder As Boolean: AskForFolder = Not...

Access 2003. Добавление данных из нескольких полей в одну таблицу
Нужна помощь знающих людей. Необходимо, после нажатия кнопки <Ввод данных>, добавить введенные данные из нескольких полей в одну таблицу, а...

Макросы на копирование данных из нескольких файлов excel в один файл excel
Здравствуйте! Помогите сделать два макроса в excel, которые будут копировать данные из множества файлов excel в один файл excel. Я...

6
 Аватар для Mawrat
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
10.04.2015, 17:35
Удаление таблицы надо убрать - строки № 22...28. И должно заработать.

Добавлено через 2 минуты
Хотя, надо ещё учесть первый запуск - когда первый файл обрабатывается. В этом случае удаление таблицы должно присутствовать в коде. Можно соответствующий флаг передавать в функцию - True - первый запуск, False - второй и последующие запуски.
0
132 / 129 / 31
Регистрация: 12.12.2011
Сообщений: 463
10.04.2015, 17:37
Цитата Сообщение от Пётр Нефедов Посмотреть сообщение
//Если таблица уже существует, то удаляем её.
А это зачем?
Delphi
1
2
if ADOQuery1.ExecSQL({ADOQuery1.SQL.Text->UpdateCommandText}) = 0 then
   ADOQuery1.ExecSQL({ADOQuery1.SQL.Text->InsertCommandText});
0
 Аватар для Mawrat
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
10.04.2015, 17:38
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function TForm1.ProcBook(const aExApp : OleVariant; const aFileName : String;
  const aTableName : String; aTblNames : TStrings; const aDrop : Boolean) : Boolean;
...
begin
...
      //Если есть разрешение на удаление (первый запуск) и таблица уже существует, то удаляем её.
      if aDrop and (aTblNames.IndexOf(aTableName) > -1) then
      try
        ADOQuery1.SQL.Text := 'DROP TABLE [' + aTableName + ']'; //SQL запрос для удаления таблицы.
        ADOQuery1.ExecSQL;
      except
      end;
...
end;
0
132 / 129 / 31
Регистрация: 12.12.2011
Сообщений: 463
10.04.2015, 17:44
37,38 строку вынести из цикла. В цикле подставляются только параметры и ExecSQL();
0
5 / 5 / 2
Регистрация: 04.10.2010
Сообщений: 205
10.04.2015, 23:04  [ТС]

Не по теме:

Пока ехал в маршрутке пришли пару запасных вариантов, но из них только один сработает - открываем еще раз все Excel-файлы и записываем данные в один файл, с общим отступом, а потом пустые строки удаляем. Такой файл и заносим в БД, но это запасной план =) Если реализация силами ADO не получится.

Цитата Сообщение от Mawrat Посмотреть сообщение
Удаление таблицы надо убрать - строки № 22...28. И должно заработать.
Пробовал в самом начале, но не сработало. Тем более что шаг с удалением таблицы в отдельных случаях можно было бы опустить по моим представлением и программа отработает нормально.
С ключом для первого прохода поинтереснее. Реализовал, но словил ошибку "Объект не найден ядром базы данных Microsoft Jet". Так понимаю я ошибочно предположил, что указание имени для новой таблицы хватит да и только:
Delphi
1
2
//SQL команда для вставки данных в таблицу.
        ADOQuery1.SQL.Text := 'INSERT INTO NEW_TABLE' ..
Теперь так понимаю еще необходимо следует правильно настроить ADOConnection1.ConnectionString . Сейчас в классическом виде:
Delphi
1
2
3
4
5
6
//{ Драйвер Microsoft.Jet.OLEDB.4.0/Microsoft.ACE.OLEDB.12.0
  ADOConnection1.ConnectionString :=
   'Provider=Microsoft.Jet.OLEDB.4.0;'
    + 'Data Source="' + Path + gPathDBase + '";'
    + 'Extended Properties="dBASE III;User ID=;Password=;";'
    ;
Я понимаю, что что-то делаю явно не так и чего-то не понимаю, поэтому можно ограничится советом, чтобы сам копал в нужном направлении, а не "барахтался" на месте Это если не сложно.
0
5 / 5 / 2
Регистрация: 04.10.2010
Сообщений: 205
12.04.2015, 19:09  [ТС]
Цитата Сообщение от Mawrat Посмотреть сообщение
Хотя, надо ещё учесть первый запуск - когда первый файл обрабатывается. В этом случае удаление таблицы должно присутствовать в коде. Можно соответствующий флаг передавать в функцию - True - первый запуск, False - второй и последующие запуски.
Сделал только через глобальную переменную, а не как в примере "aDrop" =)
Цитата Сообщение от Vabos Посмотреть сообщение
37,38 строку вынести из цикла. В цикле подставляются только параметры и ExecSQL();
Не надо ничего выносить)
В итоге сделал, лишь оказалось, что при работе с таблицей через "DROP" и "INSERT" надо указать расширение для файла DBF, пример:
Delphi
1
2
 ADOQuery1.SQL.Text := 'INSERT INTO Table.dbf'
          + ' VALUES (:POLE1, :POLE2, :POLE3, :POLE4);';
и все функционировать стало без сбоев!
Большое спасибо всем за помощь
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.04.2015, 19:09
Помогаю со студенческими работами здесь

Экспорт данных из нескольких DataGridView в одну книгу Excel
необходимо из нескольких таблиц(например 2х) DataGridView экспортировать данные в одну книгу Excel на разные листы. Каждый DataGridView...

Многотабличный запрос sql access, загрузка в одну таблицу данных из нескольких
в продолжение темы подскажите в такой проблеме нужно на основании имеющегося ключевого поля вывести таблицу связанную с ней, а в той...

Перенос данных из 31 таблицы Excel в одну таблицу
Доброго времени суток! Прошу помощи, как сам не знаю как справится с этой проблемой. Каждый день составляются отчеты по добыче по...

Перенос данных из 31 таблицы Excel в одну таблицу part 2
Ранее был задан такой вопрос: Прошу помощи, как сам не знаю как справится с этой проблемой. Каждый день составляются отчеты по...

Перенос данных из нескольких файлов excel в один
Как из множества файлов Excel перенести значения в одну сводную таблицу в отдельном файле? Суть в том, что людям рассылаются анкеты в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru