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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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. Как избежать данной проблемы?

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

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

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

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

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



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

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



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

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

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

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



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

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



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

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



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

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



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

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



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

Всего записей: 576 | Зарегистр. 17-01-2003 | Отправлено: 17:00 18-01-2017
devil1987486



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Суть замены в следующем!
Цитата:
Преобразовываем средствами EXELL из Delphi. Заменяем "." на ".", "," на ",".  

ври вставке "куска" таблицы в exell, он дробные числа (а точнее сказать все!) воспринимает как текст (не зависит от региональных настроек и прочего...). При замене точки на точку(для дат), Exell преобразует их в правильный формат.
По сути мы просто обновляем ячейку.

Всего записей: 7 | Зарегистр. 28-08-2008 | Отправлено: 09:52 19-04-2017
maxsv2



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А  обязательно нужно  самостоятельно писать в Excel  через Excel.Application?  
Нет желания посмотреть готовые компоненты экспорта данных в Excel с разным уровнем возможностей?
Не вижу большого смысла заново "изобретать велосипед" и биться о различные кочки на пути,
если только не стоит задача повысить знания и свой уровень скила в мастерстве программирования.

Всего записей: 191 | Зарегистр. 24-01-2004 | Отправлено: 15:32 29-04-2017
Vo1T



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если в наборе есть DevExpress то там есть замечательные способы выгрузки через TdxSpreadSheet - метода крайне шустрая - советую )

Всего записей: 312 | Зарегистр. 20-08-2008 | Отправлено: 16:33 26-04-2018
Sufferer



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как то столкнулся с похожей проблемой, у меня там были даты, решение оказалось забавным надо просто заполнять не значениями ячейки, а формулами. Т.е пишем  не "1" в чяейку, а "=1".
 
Добавлено:
Собственно темка хоть и древняя, но может кому пригодится такое решение.

Всего записей: 271 | Зарегистр. 21-07-2001 | Отправлено: 21:30 29-05-2018
perceptron

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2 Sufferer: и на сколько это ускорило работу в % ? и это только для дат работает ?

Всего записей: 433 | Зарегистр. 23-12-2005 | Отправлено: 17:54 30-05-2018
Открыть новую тему     Написать ответ в эту тему

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


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

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru