Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаФотогалереяГазетаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Помогите с выгрузкой из Delphi в Exell

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

devil1987486



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нашел на просторах вот такой алгоритм вывода таблицы в 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. Как избежать данной проблемы?

Всего записей: 6 | Зарегистр. 28-08-2008 | Отправлено: 15:14 31-05-2016
asutp2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
devil1987486, предлагаю документы Excel формировать с помощью библиотек типа XLSReadWriteII, там явно можно задавать нужный формат данных, плюс все это работает значительно быстрее, чем через Ole и не требует установленного Excel-я на компе

Всего записей: 477 | Зарегистр. 22-10-2004 | Отправлено: 18:11 31-05-2016
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
devil1987486
У ячейки и у диапазона есть свойство NumberFormat.
Попробуй сделать типа такого NumberFormat := '#,##0.00'

Всего записей: 1010 | Зарегистр. 10-07-2013 | Отправлено: 19:12 31-05-2016
SuPriTo

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сделайте запись макроса и посмотрите какие команды были вызваны.
Потом этот код можно вызывать из Delphi.

Всего записей: 765 | Зарегистр. 24-03-2009 | Отправлено: 16:50 01-06-2016
devil1987486



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем спасибо, о результатах сообщу позднее

Всего записей: 6 | Зарегистр. 28-08-2008 | Отправлено: 17:59 06-06-2016
asutp2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
получилось?

Всего записей: 477 | Зарегистр. 22-10-2004 | Отправлено: 17:33 07-06-2016
devil1987486



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
извините отсутствовал(
Преобразовываем средствами EXELL из Delphi. Заменяем "." на ".", "," на ",".
Пример из кода:
//исправляем форматы
    Range.Replace(What:= ',', Replacement:= ',');
    Range.Replace(What:= '.', Replacement:= '.');

Всего записей: 6 | Зарегистр. 28-08-2008 | Отправлено: 12:58 11-01-2017 | Исправлено: devil1987486, 12:59 11-01-2017
landy



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
devil1987486, не совсем понятно - зачем заменять запятую на запятую, а точку на точку? Или ты имел в виду наоборот?

Всего записей: 495 | Зарегистр. 17-01-2003 | Отправлено: 15:17 16-01-2017
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В русской раскладке разделитель дробной части запятая, а в английской точка.

Всего записей: 489 | Зарегистр. 07-06-2007 | Отправлено: 00:02 18-01-2017
IJCuper

Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Нельзя забывать, что разделитель дробной части может быть установлен пользователем и быть отличным от системного. Может быть стоит получать информацию о текущем DecimalSeparator из Excel? В случае ТС это свойство ExcelApp.DecimalSeparator
И в зависимости от значения генерировать нужного вида строку форматирования

Всего записей: 581 | Зарегистр. 07-07-2004 | Отправлено: 01:08 18-01-2017
landy



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuriyRR
разделитель не привязан к раскладке клавиатуры, он глобально задан в региональных настройках или в самом excel

Всего записей: 495 | Зарегистр. 17-01-2003 | Отправлено: 17:00 18-01-2017
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Помогите с выгрузкой из Delphi в Exell

Имя:
Пароль:
Сообщение

Для вставки имени, кликните на нем.

Опции сообщенияДобавить свою подпись
Подписаться на получение ответов по e-mail
Добавить тему в личные закладки
Разрешить смайлики?
Запретить коды


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2017

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru