Доступ к Excel файлам

Тема в разделе "WASM.ZEN", создана пользователем Alena, 8 ноя 2005.

  1. Alena

    Alena New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2005
    Сообщения:
    8
    Адрес:
    Russia
    Есть данные, которые надо поместить в excel файл, можно ли как-нибудь программно это сделать ?? Какие библиотеки для этого нужны и какой язык самый подходящий для этого ?
     
  2. Shama

    Shama New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2005
    Сообщения:
    17
    Адрес:
    Ukraine
    Ny a esli serjozno, ne v jazuke delo! nado ispolzovat biblioteli ODBC! Vstavljaew svoi dannue SQL zaprosom! Tolko nedavno nachal igratsja s etim, vot priatachil gljychnyjy versijy moej progi! S Ekselem rabotaet ne ochen, ny a s access-om ochen dazhe! :) Bydyt voprosu - piwi! Da i sjyda mozhno ICQ#235121047

    [​IMG] _515189015__SqlQuery.exe
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Alena

    Java Excel API. Не требует наличия Excel. Добавление данных в XLS осуществляется "парой" строчек кода.
     
  4. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    можно собрать CSV файл, Excel его грузит.

    его вид:

    11,12,13

    21,22,23

    31,...

    разделитель- "," и EOL.
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    А что, асм уже не годится для этого? Сразу Делфи, Васик, Ява..



    При установленном Excel'e это можно сделать через его OLE API, а так как это COM, то язык неважен.
     
  6. const

    const New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2004
    Сообщения:
    121
    Alena

    Прошу пардону, я просто хочу уточнить. Нужно добавить какие-то данные в уже существующий xls-документ или все-таки создать файл, который понимает Excel?
     
  7. Alena

    Alena New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2005
    Сообщения:
    8
    Адрес:
    Russia
    Quantum, а можно увижеть пример кода ? Он должен быть написан на Java ?

    yureckor, я уже пыталась преобразовать XLS файл в CSV, но потом, при загрузки его в Excel - вид таблицы очень портился, т.е. все криво выводилось :-(

    IceStudent, полностью с тобой согласна, не мог бы ты пример привести ? Я с этим ни разу не сталкивалась.

    const, надо и так и так .. А какой можно сделать еще "нормальный" файл, что бы его понял Excel и был нормальный вид в самом Excel.
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Alena



    Tutorial -> Copying and Modifying Spreadsheets





    Можно, конечно, и ASM/C или любой другой язык через JNI прикрутить, но зачем? В 100 раз проще скопипастить тот пример из туториала.



    yureckor

    В CSV нельзя вставлять картинки и даже форматировать данные тоже нельзя. Лучше уж XML использовать.



    IceStudent



    Вот именно: нужен установленный Excel и активированный COM.
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Alena

    Пример писать — это долго. Тем более, что ты сама должна будешь разбираться. Если тебе всё равно, на каком языке писать, тогда выбери то, что удобней. Есть много статей, посвящённых этой теме. На "Королевстве Делфи" — для Делфи, на РСДН — для C++. Находятся очень легко.



    Если всё же хочется ассемблера, то на этом сайте есть раздел "Технология СОМ" — для понимания, как работать с СОМ на асме, а непосредственно по доступу к Excel'ю прочти любую из статей.



    Quantum

    А так нужна установленная Ява :)



    Впрочем, есть альтернатива — взять на WotSit.org описание формата XLS и написать код для работы с ним.
     
  10. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    есть еще вариант- в Excel есть программа Query (Данные->Внешние данные->Создать запрос), можно написать на SQL выборку из разных баз данных, в том числе из текста.
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    А почему бы просто не написать на VBA в самом Excel, при необходимости можно и dll-ку прицепить ;))
     
  12. Alena

    Alena New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2005
    Сообщения:
    8
    Адрес:
    Russia
    Все, понятно. Склоняюсь больше к ASM, либо к C++ .. а может и к самоубийству :derisive:
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Да основное мясо, подготавливающее текст, можно писать на чем угодно, а затем элементарным макросом VBA вставить этот текст в готовый шаблон. С тем же CSV - раз при непосредственном открытии получается "некрасиво" и приходится возиться с форматированием, то нужно поступить иначе: создать "красивый" шаблон xlt и набросать простейший макрос, который будет открывать csv, копировать из него текст и вставлять в шаблон, а csv закрывать без сохранения. Но лучше не возиться с csv, а слепить dll, которая будет готовить текстовую таблицу(ы) и копировать ее(их) в clipboard
     
  14. Alena

    Alena New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2005
    Сообщения:
    8
    Адрес:
    Russia
    leo, не подскажешь, по какому принципу будет работать эта dll ?
     
  15. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Принцип такой. Поскольку VBA - язык довольно куций и неприятный (ИМХО), то основную нагрузку по подготовке текста перекладываем на dll, которая в итоге должна копировать подготовленные текстовые таблицы (с разделителями Tab) в буфер обмена, а отдельные строки передавать "напрямую" в VBA, заполняя буфер строки. Поэтому в Excel нам остается подготовить нужные шаблоны документов (*.xlt) с именованными диапазонами для вставки данных и создать надстройку (*.xla) с менюшкой или панелью инструментов для удобства вызова макросов создания документов. Поскольку текст мы получаем из dll, то макросы получаются довольно простыми - выделить именованный диапазон и вставить текст (форматирование определяется шаблоном документа). Подключаем надстройку к Excel через Сервис\Надстройка и получаем дополнительное меню или панель с кнопками, жмем и документ готов. (Чтобы не возиться с VBA я и различные диалоги выбора типа документа, исходных данных и т.п. клепаю на дельфях и сую в ту же dll).



    Возьмем для примера простенький случай заполнения одной таблицы и одной строки (ячейки) названия таблицы

    1) В Excel создаем шаблон документа с нужным форматированием, удаляя лишние неиспользуемые листы. В таблице под данные отводим две строки, выделяем эти две строки таблицы и присваиваем этому диапазону имя, например TableBody (с левой стороны строки формул). Аналогично присваиваем имя ячейке названия таблицы, например TableTitle. Сохраняем шаблон, к примеру как TestTable.xlt



    2) На любом родном языке создаем TestDll.dll, экспортирующую функции

    int _stdcall CopyMyTable(VOID) //копирует текст.таблицу в буфер обмена и возвращает число строк

    int _stdcall GetMyTableTitle(char *Buf,int MaxLen) //копирует название в Buf и возвращает число символов

    Копируем dll в папку с шаблоном TestTable.xlt



    3) В Excel cоздаем новую книгу, оставляем один пустой лист и сохраняем ее как надстройку Excel (*.xla) к примеру как TestTableMaker.xla (сохраняем в ту же папку, где лежит шаблон и dll). Открываем этот xla-файл (из списка ранее открывавшихся файлов) и идем в Сервис\Макрос\Редактор Visual Basic. Выделяем наш xla в списке проектов и делаем Вставка(Insert) \ Модуль (Module), и дважды щелкаем на появившемся Модуль1 - справа появляется окно для ввода кода, куда пишем следующую "тарабарщину" (здесь приведу несколько упрощенный вариант без проверок и обработки ошибок):
    Код (Text):
    1. Private Declare Function CopyMyTable Lib "TestDll.dll" () As Long  'импорт функции из нашей dll
    2. Private Declare Function GetMyTableTitle Lib "TestDll.dll" (ByVal Buf As string,ByVal MaxLen as Long) As Long
    3. 'макрос создания таблицы (упрощенный вариант без контроля загрузки dll)
    4. Sub MakeTestTable()
    5.   Dim i as Long, j as long, R as Range, S as String
    6.   'вставка текста в таблицу
    7.   Workbooks.Add Template:=ThisWorkbook.Path + "\TestTable.xlt"  'создаем книгу с заданным шаблоном
    8.   i = CopyMyTable           'вызов dll для копированием текстовой таблицы, return число строк
    9.   Set R = ActiveSheet.Range("TableBody") 'R = тело таблицы по заданному названию диапазона
    10.   j = R.Rows.Count                       'число строк в шаблоне >= 2
    11.   If j < i Then R.Offset(1, 0).Resize(RowSize:=i - j).Insert Shift:=xlDown 'увеличиваем число строк
    12.   R.Cells(1, 1).Select      'выделяем первую ячейку
    13.   ActiveSheet.Paste         'вставляем текст в таблицу - Готово
    14.   'вставка названия таблицы
    15.   S = String$(64,Chr(0))    'выделяем буфер строки (в VBA возможны строки из 0-й ?!!)
    16.   i = GetMyTableTitle(S,64) 'заполняем буфер в dll, return длина строки
    17.   if i > 0 then S = Left$(S,i) Else S = ""
    18.   ActiveSheet.Range("TableTitle").Value = S
    19. End Sub
    4) В принципе уже можно пользоваться, но для удобства нужно создать менюшку или кнопочку, которая будет вызывать MakeTestTable. Для этого в списке проектов под нашим xla дважды щелкаем по Microsoft Excel Объекты -> ЭтаКнига (ThisWorkbook) - также справа появляется окно для кода, в котором задаем отклики на события открытия, включения и отключения нашеей надстройки:
    Код (Text):
    1. Sub Workbook_AddinInstall() 'отклик на включение надстройки
    2.   ... 'создаем меню или кнопку и задаем OnAction = "MakeTestTable"
    3.   ... '~10 строчек, пример см. в аттаче
    4. End Sub
    5. Sub Workbook_Open()      'загрузка включенной надстройки
    6.   Workbook_AddinInstall  'дублируем, т.к. если Excel загружается с вкл.надстройкой то событие вкл.не генерится
    7. End Sub
    8. Sub Workbook_AddinUninstall() 'отклик на отключение надстройки
    9.   ... 'пара строк - удаляем панель и вызываем kernel32.FreeLibrary
    10. End Sub
    Компилим, если че не так правим и сохраняем xla (из редактора Файл\Сохранить...).

    Идем в Excel и проверяем подключение надстройки в Сервис\Надстройки. Если нет в списке, то подключаем xla через Обзор..

    Включаем и выключаем надстройку установкой галочки. Если галочка включена, то можно править код в редакторе VBA.

    Готово - теперь при включенной надстройке у нас есть кнопочка - жмем и получаем готовый документ.

    Освоившись, понимаем что не так страшен VBA, как его малюют, возможно даже входим во вкус и начинаем развлекаться, наращивая функции dll и надстройки ;))



    В аттаче простой рабочий примерчик - xla,xlt,dll и ее исходник на фасме





    [​IMG] _1580152680__TestTable.zip
     
  16. Alena

    Alena New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2005
    Сообщения:
    8
    Адрес:
    Russia
    Спасибо большое!!!!! Буду разбиратсья.
     
  17. Peshuha

    Peshuha New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2003
    Сообщения:
    41
    Я пардоню, но по-моему идея с dll очень череватая и очень тяжелая (обяз нужен excel, его надо запустить, он должен загрузить dll и т.д.)!!!. Вы когда-нибудь пытались отлаживать эту dll из-под excel, особенно com-server?

    Если на то пошло, то:

    1) если нужны только данные, то ODBC

    2) если excel Нет ваще -> Java/CSV/Native

    3) если необх форматирование и т.д., то COM

    В последнем случае проигрываете макрос а дальше аналогичный код в C/Asm
     
  18. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Peshuha

    Эх, ученые теоретики ;)

    Мне по долгу службы приходится периодически от нескольких сот до нескольких тысяч страниц бумажного вала на ворде автоматом формировать, да еще с рисуночками-чертежиками (а ворд, кстати "попротивнее" экселя будет, приходится закладочками пользоваться вместо прямой адресации диапазонов). Поэтому "малость" представляю о чем говорю ;)

    Вопрос №1: нафига "отлаживать эту dll из-под excel" ? Dll на то и делается, чтобы писать и отлаживать ее отдельно, не привязываясь к хосту на котором она будет использоваться. Ты можешь себе представить, чтобы микрософт отлаживал kernel32 из-под excel ?!! Обычно все делается с точностью до наоборот: берется готовая рабочая dll и отлаживается прога использующая эту dll. В связи с этим вопрос №2. Речь идет именно о создании готового документа с нужным форматированием, поэтому ODBC и иже с ним не в счет. Поэтому вопрос - как ты собираешься отлаживать создание документа не имея под рукой ворда\экселя и не видя, что в итоге получается. Ты представляешь сколько недокументированных подводных какашек напихал горячо любимый микрософт в свои суперпродукты ? Поэтому без проверки тут и делать нечего, нет экселя - так установи ;)

    Остается вопрос: использовать COM\OLE в своей проге или писать на VBA в самом ворде\экселе. Тезис "нужен excel, его надо запустить, он должен загрузить dll и т.д" выглядит странным, т.к. то же самое относится и к COM. Поэтому если отбросить присущую "крутым кодерам" предвзятость к VB, то вопрос сводится лишь к удобству - и отладки и использования. COM логично использовать в многофункциональных прогах, которые между делом позволяют сохранить данные в формате ворда\экселя. Если же прога только и делает, что формирует отчеты по некоторым исходным текстовым или двоичным данным, то логичнее ее и привязать к самому ворду\экселю - сформировал, распечатал и забыл. Да и отлаживать VBА ИМХО проще - синтаксис проверил и можно запустить любую процедуру на исполнение прямо из окна редактора (держишь для отладки открытый документ, после отработки макроса можно легко и просто сделать отмену и вернуться к исходному виду). Ну а с COM'ом, ес-но все не так просто, особенно по неопытности и невнимательности можно дровишек наломать (тут тебе и утечки памяти и подвешивание ворда и прочие прелести ;) Хотя терпенье и труд все перетрут ;) Так что - кому что нравится, если ты не привык искать легких путей и идея важнее быстрого результата, то флаг тебе в руки ;)))
     
  19. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев


    Не проще тогда уже прямо в ртф писать? За пару месяцев вполне можно работающий вариант написать - с картинками, букмарками и пр. Или еще проще - в хмл/хтмл, а потом если надо - в ворд импортировать...

    А если часто и много надо - поднапрячь руководство и купить за <=$1K уже готовое решение и писать и в ворд и в эксель что угодно.
     
  20. Avalonec

    Avalonec New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    111
    Адрес:
    Тула
    Здесь было много чего написано и предложено что использовать, но готовых многофункциональных решений не было представленно.

    Скоро станет доступным для использования NVY_small.



    Скриптовый язык NVY_small имеет следующие возможности:

    - Свободная работа с переменными - автоматическая конвертация и переконвертация

    - Возможность использовать встроенные объекты, такие как работа с файлами и пр.

    - Интеграция с БД dbt 4

    - Интеграция со скриптовым языком Sctx и его переменными

    - Улучшенный синтаксис VB

    - Возможность вызова из скрипта процедур dll

    - Возможность передачи параметров в переменные окружения скрпита из асма и др. языков

    - Возможность вызова процедур из исполняемой программы (в частности процедур на ассемблере)

    - Доступ на чтение/запись к ячейкам excel - работа с экселем и работа с вордом

    - Возможность хранения переменных типа сессий

    - Запуск по расширению