Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Помогите с выгрузкой из Delphi в Exell

Автор: devil1987486
Дата сообщения: 31.05.2016 15:14
Нашел на просторах вот такой алгоритм вывода таблицы в Exell по средствам Delphi:

Можно выводить данные последовательно в каждую ячейку, но это очинь сильно замедляет работу. Лучше сформировать вариантный массив, и выполнить присвоение области (Range) этого массива.


var
ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData : Variant;
TemplateFile : String;
BeginCol, BeginRow, i, j : integer;
RowCount, ColCount : integer;
begin
// Координаты левого верхнего угла области, в которую будем выводить данные
BeginCol := 1;
BeginRow := 5;

// Размеры выводимого массива данных
RowCount := 100;
ColCount := 50;

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

// Отключаем реакцию Excel на события, чтобы ускорить вывод информации
ExcelApp.Application.EnableEvents := false;

// Создаем Книгу (Workbook)
// Если заполняем шаблон, то Workbook := ExcelApp.WorkBooks.Add('C:\MyTemplate.xls');
Workbook := ExcelApp.WorkBooks.Add;

// Создаем Вариантный Массив, который заполним выходными данными
ArrayData := VarArrayCreate([1, RowCount, 1, ColCount], varVariant);

// Заполняем массив
for I := 1 to RowCount do
for J := 1 to ColCount do
ArrayData[I, J] := J * 10 + I;

// Левая верхняя ячейка области, в которую будем выводить данные
Cell1 := WorkBook.WorkSheets[1].Cells[BeginRow, BeginCol];
// Правая нижняя ячейка области, в которую будем выводить данные
Cell2 := WorkBook.WorkSheets[1].Cells[BeginRow + RowCount - 1, BeginCol +
ColCount - 1];

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

// А вот и сам вывод данных
// Намного быстрее поячеечного присвоения
Range.Value := ArrayData;

// Делаем Excel видимым
ExcelApp.Visible := true;

Выводит быстро, но существует 1 проблема - числа типа 15,26 (то есть дробные) выводятся как строка. То есть чтобы просчитать (просумировать/отсортировать/выбрать больше 1000 и т.д.) их в дальнейшем приходится их преобразовывать в число самостоятельно (вручную) средствами Exell. Как избежать данной проблемы?
Автор: asutp2
Дата сообщения: 31.05.2016 18:11
devil1987486, предлагаю документы Excel формировать с помощью библиотек типа XLSReadWriteII, там явно можно задавать нужный формат данных, плюс все это работает значительно быстрее, чем через Ole и не требует установленного Excel-я на компе
Автор: Alexzzy
Дата сообщения: 31.05.2016 19:12
devil1987486
У ячейки и у диапазона есть свойство NumberFormat.
Попробуй сделать типа такого NumberFormat := '#,##0.00'
Автор: SuPriTo
Дата сообщения: 01.06.2016 16:50
Сделайте запись макроса и посмотрите какие команды были вызваны.
Потом этот код можно вызывать из Delphi.
Автор: devil1987486
Дата сообщения: 06.06.2016 17:59
Всем спасибо, о результатах сообщу позднее
Автор: asutp2
Дата сообщения: 07.06.2016 17:33
получилось?

Страницы: 1

Предыдущая тема: Полазил в биосе


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.