• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Проблема с выгрузкой в Excel

  • Автор темы antonio2040
  • Дата начала
A

antonio2040

СРОЧНО нужна помощь!!! Для начало вкратце объясню суть задачи. Есть огромная dbf-таблица. Из нее необходимо выбрать данные по определенным критериям и сформировать отчет в Excel. Я делаю с помощью технологии ADO, вывожу в DBGrid саму таблицу. А вот отчет сделать не могу. Таблица должна состоять из нескольких строк, в каждой из которых содержится сумма всех элементов, обладающих сходными свойствами. Проблема состоит в том, что я не могу сформировать правильный SQL-запрос. Как в него добавить строки или что-то вроде того?

Или...

Есть еще идея. Можно выгружать в Excel по строке. Но есть одно "но". В процедуре выгрузки файл перезаписывается. Можно ли сделать так, чтобы сначала выгрузились все данные, а потом только он сохранился?

Вот процедура выгрузки:
Код:
// Выгрузка в Excel
procedure SendtoExcel(ShFile: string; Querys: TADOQuery; m,n:Integer);
var
ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData: variant;
BeginCol, BeginRow, j: integer;
RowCount, ColCount: integer;
begin

// Задаем верхнюю левую ячейку
BeginCol:=2;
BeginRow:=4;

// Задаем размеры области, в которую выводятся данные
RowCount:=Querys.RecordCount+1;
ColCount:=Querys.FieldDefs.Count;

// Создание Excel
ExcelApp:=CreateOleObject('Excel.Application');

// Отключение реакции Excel на события
ExcelApp.Application.EnableEvents:=False;

// Создание книги (Workbook)
// Если заполняем шаблон, то
Workbook:=ExcelApp.Workbooks.Add(ShFile);
Workbook.SaveAs(ShFile);
ArrayData:=VarArrayCreate([1, RowCount, 1, ColCount], varVariant);

// Заполнение массива
Querys.DisableControls;
Querys.First;
while not Querys.Eof do
begin
for j:=1 to Querys.FieldDefs.Count do
begin
ArrayData[Querys.RecNo, j]:=
Querys.FieldbyName(Querys.FieldDefs.Items[j-1].DisplayName).Value;
end;
Querys.Next;
end;
Querys.EnableControls;

// Левая верхняя ячейка
Cell1:=Workbook.Worksheets[1].Cells[BeginRow, BeginCol];

// Правая нижняя ячейка
Cell2:=Workbook.Worksheets[1].Cells[m, n];

// Область, в которую выводятся данные
Range:=Workbook.Worksheets[1].Range[Cell1,Cell2];

// Вывод данных
Range.Value:=ArrayData;

// Делаем Excel видимым
ExcelApp.Visible:=True;
end;
ПОМОГИТЕ плиз, а то на работе прибьют
 
V

VahaC

Имхо в вашем случае нужно делать вот так

1 Получаем данные из бд с помощью TQuery (к которому подключен TDBGrid)
2 Экспортируем данные из TDBGrid в Excel (примеры есть в сети)
 
M

morpheus

так может легче
 
A

antonio2040

Я делаю по технологии ADO. Далее мне необходимо выбрать 2 суммы(красные столбцы) из таблицы с учетом условий(синие столбцы).
 
C

caramba

Я делаю по технологии ADO. Далее мне необходимо выбрать 2 суммы(красные столбцы) из таблицы с учетом условий(синие столбцы).
По технологии АДО это самый не технологичный способ.
Попробуйте сделать так - через OLE дерните Excel и откройте DBF, как файл.
Далее сохраните его как Excel-документ, добавьте нужные формулы в ячейки, доработайте дизайн, если нужно.
И еще одно предложение - работа с Excel по OLE очень медленна. Поэтому избегайте циклов по тысячам ячеек :rolleyes: Используйте работу с диапазонами.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!