Конференция "Corba" » Есть вопросец по работе в связке Delphi-Excel
 
  • Ega23 © (01.07.13 13:01) [0]
    Толком с 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:= '@';

 
Конференция "Corba" » Есть вопросец по работе в связке Delphi-Excel
Есть новые Нет новых   [118654   +11][b:0][p:0.001]