Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Есть вопросец по работе в связке Delphi-Excel


Ega23 ©   (01.07.13 13:01

Толком с Excel никогда не работал, а тут довольно сложный по структуре отчёт надо сделать.
Т.е. не просто некий VarArray в некий Range запихнуть, но ещё и потом отформатировать.
Делается всё это дело достаточно долго. После профилирования выяснил, что наиболее длительная операция - собственно выделение Range.
Вот в связи с этим вопрос: выделяю я range так:
var
 WS: _Worksheet;
 aRange: ExcelRange;
begin
 aRange := WS.Range[WS.cells.Items[x1, y1], WS.cells.Items[x2, y2]];
end;


Может я что-то делаю не так? Ну казалось бы, что проще кусок в строчку определить?
С Excel напрямую работал стопицот лет назад (можно сказать, что вообще не работал толком).


[ВладОшин] ©   (01.07.13 13:07[1]

1.
установлено?
Ёксель.EnableEvents := false

2.
если разбить на части?
 Cell1 := Sheet.Cells[BR, BC];
 Cell2 := Sheet.Cells[ER, EC];
 Range := Sheet.Range[Cell1, Cell2];


antonn ©   (01.07.13 13:19[2]


> Ega23 ©   (01.07.13 13:01)  

просто замечу, что если это будет под службой, то про OLE (или как оно сейчас там - COM/DCOM) вообще придется забыть...


Dimka Maslov ©   (01.07.13 13:20[3]

Могу скинуть модулёк, который при желании может сохранить xml-ку, которую можно будет подпихнуть ёкселю. Но она без комментариев.


Ega23 ©   (01.07.13 13:28[4]


> Ёксель.EnableEvents := false

Не повлияло.


> если разбить на части?
>  Cell1 := Sheet.Cells[BR, BC];
>  Cell2 := Sheet.Cells[ER, EC];
>  Range := Sheet.Range[Cell1, Cell2];
>


Не вижу особого смысла, но попробую...


> просто замечу, что если это будет под службой


Нет, не будет. Но спасибо за инфу.


> Могу скинуть модулёк, который при желании может сохранить
> xml-ку, которую можно будет подпихнуть ёкселю.


Нет, спасибо, я думал на ентот счёт, но отказался.


Excel   (01.07.13 13:32[5]


> Ega23 ©   (01.07.13 13:28) [4]
> > Могу скинуть модулёк, который при желании может сохранить
> > xml-ку, которую можно будет подпихнуть ёкселю.
> Нет, спасибо, я думал на ентот счёт, но отказался.

А здря... Димка плохого не посоветует.
Если версия офиса 2003 и старше, то это наилучший способ.


Ega23 ©   (01.07.13 13:33[6]

Я может быть не так сформулировал.
Данные передаются мгновенно через VarArray, с этим вопросов нет.
Вопрос с последующим форматированием данных: некоторые ячейки надо объединить, в некоторых - поменять фонт, и т.п.


Dimka Maslov ©   (01.07.13 13:35[7]


> Нет, спасибо, я думал на ентот счёт, но отказался.


Я тоже поначалу отказался. Но потом, когда после пяти минут расчётов отчёт генерировался полчаса, я на это всё это OLE забил, просидел недельку над изучением предмета и навоял модуль. Теперь всё летает. Ну или почти летает.


Dimka Maslov ©   (01.07.13 13:36[8]


> Вопрос с последующим форматированием данных: некоторые ячейки
> надо объединить, в некоторых - поменять фонт, и т.п.


Всё это имеет место в модуле. Практически все возможности форматирования.


Excel   (01.07.13 13:36[9]


> Ega23 ©   (01.07.13 13:33) [6]
> Я может быть не так сформулировал.
> Данные передаются мгновенно через VarArray, с этим вопросов нет.
> Вопрос с последующим форматированием данных: некоторые ячейки надо объединить, в некоторых - поменять фонт, и т.п.

Дык я об чем.
Это форматирование лучше задавать через XML.


[ВладОшин] ©   (01.07.13 13:38[10]

>> Dimka Maslov ©
а ,давай :)
гляну


Excel   (01.07.13 13:39[11]


> Dimka Maslov ©   (01.07.13 13:36) [8]
> Всё это имеет место в модуле. Практически все возможности  форматирования.

Димка - кинь линк на скачку, может и мне волшебный модулек сгодиться.
А то этому упоротому пока докажешь...


Ega23 ©   (01.07.13 13:42[12]


> Я тоже поначалу отказался. Но потом, когда после пяти минут
> расчётов отчёт генерировался полчаса, я на это всё это OLE
> забил, просидел недельку над изучением предмета и навоял
> модуль. Теперь всё летает. Ну или почти летает.


Да? ХМ, любопытно. Тогда давай, скидывай, ежели не жалко.


Ega23 ©   (01.07.13 13:43[13]


> Если версия офиса 2003 и старше, то это наилучший способ.


Были сомнения, что 2003. Сейчас подтвердили, что ниже 2003 не поддерживаем.


Dimka Maslov ©   (01.07.13 13:57[14]

http://www.daemys.com/f/xml.zip

Но знайте:

1. Протестирован под Delphi 2009.
2. Отжирает память при работе.
3. Без гарантии.
4. Пожалуйста, не спрашивайте, что там, как и почему, попытайтесь разобраться самостоятельно.
5. Читать он не умеет, только создавать.
6. У Ёкселя чавый отладчик - говорит, что проблема в таком-то теге, не утруждая себя показом конкретного места в файле.

Работает следующим образом:

Создаём объект класса TXlWorkbook, затем сколько надо TXlWorksheet, у них есть ячейки TXlCell, у ячейки есть Style со всеми необходимыми свойствами Color, Borders, Alignment, Font. Кроме того есть Value (строковое), Numeric (числовое), IsHtml - если есть верхние и нижние символы (задаются внутри <Sub> </Sub> <Sup> </Sup> в Value), для объединения ячеек используются св-ва MergeDown и MergeAcross.

Сохранение Workbook происходит двумя путями - через Flush (с созданием промежуточной xml-структуры в памяти), но лучше пользоваться FlushStream - прямое создание документа в поток. Если объеднялись ячейки, требуется перед сохранением вызвать RemoveMergedCells.

Пример дать не могу.


han_malign   (01.07.13 13:57[15]

"прямую адресацию" попробуй
Sheet.Range[Char(k+Byte('A'))+IntToStr(j+2)].NumberFormat:= '@';


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо