MapBasic. Отчет в Excel
-
- Интересующийся
- Сообщения: 18
- Зарегистрирован: 22 июл 2009, 18:06
- Репутация: 0
MapBasic. Отчет в Excel
И снова здраствуйте!
Стоит задача: по итогам рассчетов из таблицы сделать отчет в Excel'e. Как это реализовать? Я подумал и решил в xml сделать, шапку в отдельном файле, потом к ней строки будут добавляться. Но сразу проблема, excel работает с кодировкой utf-8, а MapBasic вроде как в такой кодировке ни записывать, ни читать не умеет. Или может у вас есть другие варианты по составлению отчета?
Примерно опишу ситуацию, чтобы было понятнее.
Таблица:
ID(integer уникальное неупорядоченное по строкам), name(string многократно повторяющееся в строках), value (float), num(integer упорядоченное), type(integer) То есть name будут выстроены по порядку если сортировать по num, сначало несколько строк с num1, потом с num2 и так далее.
Отчет:
(то есть в зависимости от типа
-----Шапка----- value записывается в
num | value(type1) | value(type2) | value(type3) | определенную строку)
-------------------------------------------------------------------------------------------------
name(далее только те строки, которые содержат именно эту строку в таблице)
-------------------------------------------------------------------------------------------------
num 1 | | | |
-------------------------------------------------------------------------------------------------
num 2 | | | |
-------------------------------------------------------------------------------------------------
num ... | | | |
-------------------------------------------------------------------------------------------------
num n | | | |
-------------------------------------------------------------------------------------------------
name(далее только те строки, которые содержат именно эту строку в таблице)
-------------------------------------------------------------------------------------------------
........
Итак далее.
Может это можно реализовать в Crystal Reports?
Стоит задача: по итогам рассчетов из таблицы сделать отчет в Excel'e. Как это реализовать? Я подумал и решил в xml сделать, шапку в отдельном файле, потом к ней строки будут добавляться. Но сразу проблема, excel работает с кодировкой utf-8, а MapBasic вроде как в такой кодировке ни записывать, ни читать не умеет. Или может у вас есть другие варианты по составлению отчета?
Примерно опишу ситуацию, чтобы было понятнее.
Таблица:
ID(integer уникальное неупорядоченное по строкам), name(string многократно повторяющееся в строках), value (float), num(integer упорядоченное), type(integer) То есть name будут выстроены по порядку если сортировать по num, сначало несколько строк с num1, потом с num2 и так далее.
Отчет:
(то есть в зависимости от типа
-----Шапка----- value записывается в
num | value(type1) | value(type2) | value(type3) | определенную строку)
-------------------------------------------------------------------------------------------------
name(далее только те строки, которые содержат именно эту строку в таблице)
-------------------------------------------------------------------------------------------------
num 1 | | | |
-------------------------------------------------------------------------------------------------
num 2 | | | |
-------------------------------------------------------------------------------------------------
num ... | | | |
-------------------------------------------------------------------------------------------------
num n | | | |
-------------------------------------------------------------------------------------------------
name(далее только те строки, которые содержат именно эту строку в таблице)
-------------------------------------------------------------------------------------------------
........
Итак далее.
Может это можно реализовать в Crystal Reports?
-
- Интересующийся
- Сообщения: 18
- Зарегистрирован: 22 июл 2009, 18:06
- Репутация: 0
Re: MapBasic. Отчет в Excel
Столбцы сбились
Но думаю понятно будет

-
- Интересующийся
- Сообщения: 18
- Зарегистрирован: 22 июл 2009, 18:06
- Репутация: 0
Re: MapBasic. Отчет в Excel
Вот сижу ковыряю Crystal Reports. Походу самое оно для составления моего отчета
-
- Участник
- Сообщения: 56
- Зарегистрирован: 25 фев 2009, 20:55
- Репутация: 3
- Откуда: Инструментарий для MapInfo
- Контактная информация:
Re: MapBasic. Отчет в Excel
Если подойдет готовое решение - возьми Инструментарий и сформируй отчет.
www.map-info.ru
www.map-info.ru
-
- Интересующийся
- Сообщения: 18
- Зарегистрирован: 22 июл 2009, 18:06
- Репутация: 0
Re: MapBasic. Отчет в Excel
Спасибо, но не подходит
Не могу понять как в CrystalReports сделать разделитель в виде имени, которое многократно повторяется в таблице, а после разделителя записать данные, в строках которых встречается это имя. То есть нужно сгруппировать записи по одному полю, но чтобы запись по которой производится группировка была отражена в отчете только один раз, в виде разделителя
И еще опять проблема с кодировкой. Русские символы отображаются некорректно в отчете.

И еще опять проблема с кодировкой. Русские символы отображаются некорректно в отчете.
-
- Гуру
- Сообщения: 977
- Зарегистрирован: 27 янв 2009, 22:57
- Репутация: 258
Re: MapBasic. Отчет в Excel
Отчет в Exel варианты:
1 вариант
Создайте заранее шаблон в Excel в котором, заранее будет подготовлена шапка.
Затем откройте Ваш шаблон используя OLE Application
…
Затем делаете цикл в котором записываете в ячейки Вашу информацию
В конце для визуализации вашего файла
Да и подсмотреть, как форматировать ячейки в Excel – создайте макрос, сохраните его. Затем откройте на редактирование в VB.
2 вариант
Создание форматированного RTF файла.
Создайте RTF файл с нужной Вам структурой столбцов и сохраните его.
Откройте затем этот файл каким ни будь известным Вам редактором (блокнотом или f4 в far) и вырежите шапку и подвал и сохраните их.
Разберитесь с форматирование основного вывода по строке (сколько отступов, пробелов или tab, где разделители и т.д.).
Суть второго варианта сводится к созданию обычного текстового файла в который Вы вставите шапку в начале, цикл с выводом основной информации и в конце вставите подвал. И никакого OLE.
Затем открываете форматированый RTF в EXCEL.
Скорость создания такого файла наивысшая, но внешний вид полученного более простой, чем в первом варианте.
1 вариант
Создайте заранее шаблон в Excel в котором, заранее будет подготовлена шапка.
Затем откройте Ваш шаблон используя OLE Application
Код: Выделить всё
oExcel=CreateObject("Excel.Application")
WITH oExcel
.WorkBooks.Open("c:\map\maphablon.xlt")
Затем делаете цикл в котором записываете в ячейки Вашу информацию
Код: Выделить всё
.Cells(lnRow,1)=m.id
.Cells(lnRow,2)=m.name
.Cells(lnRow,3)=m.num
Код: Выделить всё
.Visible = .T.
ENDWITH
2 вариант
Создание форматированного RTF файла.
Создайте RTF файл с нужной Вам структурой столбцов и сохраните его.
Откройте затем этот файл каким ни будь известным Вам редактором (блокнотом или f4 в far) и вырежите шапку и подвал и сохраните их.
Разберитесь с форматирование основного вывода по строке (сколько отступов, пробелов или tab, где разделители и т.д.).
Суть второго варианта сводится к созданию обычного текстового файла в который Вы вставите шапку в начале, цикл с выводом основной информации и в конце вставите подвал. И никакого OLE.
Затем открываете форматированый RTF в EXCEL.
Скорость создания такого файла наивысшая, но внешний вид полученного более простой, чем в первом варианте.
Последний раз редактировалось bim2010 01 авг 2009, 09:44, всего редактировалось 1 раз.
-
- Интересующийся
- Сообщения: 18
- Зарегистрирован: 22 июл 2009, 18:06
- Репутация: 0
Re: MapBasic. Отчет в Excel
Огромное спасибо!! Завтра все испробую. А про OLE я читал, но так и не нашел как управлять приложением из MapBasica, видимо плохо смотрел... Буду искать подробную информацию
-
- Гуру
- Сообщения: 977
- Зарегистрирован: 27 янв 2009, 22:57
- Репутация: 258
Re: MapBasic. Отчет в Excel
Если вы решите использовать вариант с OLE, то возможно Вам понадобится файлик excel.h
с описанием параметров Microsoft Visual Basic. Почему рекомендую использовать именно шаблоны Excel а не просто .xls - две причины:
1. Это сетевое решение, т.е. шаблоны у меня лежат на сервере, и при обращении открывается и заполняется копия для конкретного пользователя, т.е. отчет могут одновременно формировать несколько пользователей.
2. Удобство отладки - в случае ошибок. Исправляю шаблон, не перезапуская программу.
Еще совет - если Вы выводите относительной большой объем данных в Excel а затем начинает форматирование этих ячеек то это может занять безобразно неприличное время.
А вот команда на удаление ячеек выполняется мгновенно. Поэтому форматирование выполняю заранее и по максимуму, даже с запасом, а затем удаляю все лишнее.
Еще советую почитать про оптимизацию вывода в Excel и использованием массивов.
Просьба - как получите результат, может быть опишите Ваши действия.
Думаю, это будет полезно форумчанам.
Успеха!
с описанием параметров Microsoft Visual Basic. Почему рекомендую использовать именно шаблоны Excel а не просто .xls - две причины:
1. Это сетевое решение, т.е. шаблоны у меня лежат на сервере, и при обращении открывается и заполняется копия для конкретного пользователя, т.е. отчет могут одновременно формировать несколько пользователей.
2. Удобство отладки - в случае ошибок. Исправляю шаблон, не перезапуская программу.
Еще совет - если Вы выводите относительной большой объем данных в Excel а затем начинает форматирование этих ячеек то это может занять безобразно неприличное время.
Код: Выделить всё
.range(.Cells(8,1),.Cells(lnRow,3)).select
WITH .Selection
.Font.Size = 12
FOR lnCount = 7 TO IIF(lnRow-10>1,12,11)
WITH .Borders(lnCount)
.LineStyle = 1
.Weight = 2
.ColorIndex = -4105
ENDWIT
ENDFOR
ENDWITH
...
.Visible = .T.
Еще советую почитать про оптимизацию вывода в Excel и использованием массивов.
Просьба - как получите результат, может быть опишите Ваши действия.
Думаю, это будет полезно форумчанам.
Успеха!
- Вложения
-
EXCEL.H
- (44.58 КБ) 994 скачивания
-
- Интересующийся
- Сообщения: 18
- Зарегистрирован: 22 июл 2009, 18:06
- Репутация: 0
Re: MapBasic. Отчет в Excel
В общем решил все сделать через xml, и все вроде бы получилось. Кому интересно вкратце поясню.
Создал шаблон путем сохранения шапки и подвала документа exel в формате xml. Вот тут по синтаксису информация: msdn.microsoft.com/en-us/library/aa140066(office.10).aspx Хотя разобраться я думаю будет легко, я не сталкиваясь ранее с xml сделал шаблон часа за 2. Далее вставил свои теги на обозначение вставляемых данных, формул в ячейки и обозначения циклов. Потом обработка в Mapbasic'е, с xml шаблона скидывается все в файл отчета до первого тега, который обозначает начало составления таблицы из данных, от начала до конца этого тега все записывал в таблицу, с одним строковым столбцом (массивы в MapBasic'е я не нашел, может есть и более оптимальный вариант, я MIи MB первый раз две недели назад в глаза увидел), далее идет поиск встроенных тегов в вышестоящие, тоже записывается в отдельную таблицу, так до последнего уровня. Далее вставка данных и осуществление цикла. Ставим в цикл первую полученную таблицу, нужное количество раз, в зависимости от объема данных. При нахождении тега более низкого уровня переходим на обработку таблицы, связанную с этим тегом. Так же с последующими "вложенными" таблицами. По завершении обработки данных в таблице низкого уровня переходим на обработку на уровень выше и так далее. В итоге получается красивый форматированный отчет.
И еще вам наверняка пригодится данная функция, так как MB не умеет работать с файлами UTF-8 кодировки, а Exel понимает только ее и отучить от UTF его никакими тегами в xml невозможно:
Создал шаблон путем сохранения шапки и подвала документа exel в формате xml. Вот тут по синтаксису информация: msdn.microsoft.com/en-us/library/aa140066(office.10).aspx Хотя разобраться я думаю будет легко, я не сталкиваясь ранее с xml сделал шаблон часа за 2. Далее вставил свои теги на обозначение вставляемых данных, формул в ячейки и обозначения циклов. Потом обработка в Mapbasic'е, с xml шаблона скидывается все в файл отчета до первого тега, который обозначает начало составления таблицы из данных, от начала до конца этого тега все записывал в таблицу, с одним строковым столбцом (массивы в MapBasic'е я не нашел, может есть и более оптимальный вариант, я MIи MB первый раз две недели назад в глаза увидел), далее идет поиск встроенных тегов в вышестоящие, тоже записывается в отдельную таблицу, так до последнего уровня. Далее вставка данных и осуществление цикла. Ставим в цикл первую полученную таблицу, нужное количество раз, в зависимости от объема данных. При нахождении тега более низкого уровня переходим на обработку таблицы, связанную с этим тегом. Так же с последующими "вложенными" таблицами. По завершении обработки данных в таблице низкого уровня переходим на обработку на уровень выше и так далее. В итоге получается красивый форматированный отчет.
И еще вам наверняка пригодится данная функция, так как MB не умеет работать с файлами UTF-8 кодировки, а Exel понимает только ее и отучить от UTF его никакими тегами в xml невозможно:
Код: Выделить всё
function win2utf(str as string) as string
dim i, ii as integer, out_str, i_chr as string
out_str = ""
ii = len(str)
for i=1 to ii
i_chr=mid$(str, i, 1)
if asc(i_chr)>=192 and asc(i_chr)<=239 then out_str = out_str + chr$(208) + chr$(asc(i_chr)-48) end if
if asc(i_chr)>=240 and asc(i_chr)<=255 then out_str = out_str + chr$(209) + chr$(asc(i_chr)-112) end if
if i_chr="Ё" then out_str = out_str + chr$(208) + chr$(149)end if
if i_chr = "ё" then out_str = out_str + chr$(208) + chr$(181) end if
if i_chr = "Ъ" then out_str = out_str +chr$(208) + chr$(172) end if
if i_chr = "Ь" then out_str = out_str + chr$(208) + chr$(170) end if
if i_chr = "ъ" then out_str = out_str + chr$(208) + chr$(140) end if
if i_chr = "ь" then out_str = out_str + chr$(208) + chr$(138) end if
if asc(i_chr) < 192 then out_str = out_str + i_chr end if
next
win2utf = out_str
end function
-
- Интересующийся
- Сообщения: 18
- Зарегистрирован: 22 июл 2009, 18:06
- Репутация: 0
Re: MapBasic. Отчет в Excel
Спасибо bim2010 за потдержку
А как управлять приложением из MB через OLE я так и не понял
Пересмотрел весь мануал, как русский, так и английский, но у CreateObject только один синтаксис и он явно не относится к OLE. Чего-то я тут не понимаю! 



-
- Гуру
- Сообщения: 977
- Зарегистрирован: 27 янв 2009, 22:57
- Репутация: 258
Re: MapBasic. Отчет в Excel
Позволю себе процетировать Borisа
А чтобы взять данные из MI для своего приложения аналогично через OLE обращаемся к нему из delphi или Vfp используя MB. Хочешь порулить Excel - изучи VB, хочешь порулить MI - изучи MB или MapX.
Конечно же для работы с Excel через OLE мы обращаемся из delphi или Visul FoxPro.Основная ошибка - это считать MapBasic' языком разработки диалоговых приложений.
MapBasic - это язык несложных приложений, выполняющих команды MapInfo любой сложности.
А чтобы взять данные из MI для своего приложения аналогично через OLE обращаемся к нему из delphi или Vfp используя MB. Хочешь порулить Excel - изучи VB, хочешь порулить MI - изучи MB или MapX.
-
- Интересующийся
- Сообщения: 18
- Зарегистрирован: 22 июл 2009, 18:06
- Репутация: 0
Re: MapBasic. Отчет в Excel
Да! У меня изначально была идея написать програмульку на Visual C, чтобы она служила лишь посредником между Excel'ем и MB. Но с компьютером проблемы, поставить Visual Studio не смог, а разбираться некогда, шеф уже требует автоматизации поставленной задачи
Ну и не судите строго, я не профи в ГИС, а всего лишь студент, проходящий практику 


-
- Гуру
- Сообщения: 4231
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: -344969098
- Откуда: Париж
Re: MapBasic. Отчет в Excel
Рискну встрять в вашу высокотехнологичную беседу.
А отчеты в Access делать не удобнее?
Там вроде весь инструментарий под это имеется уже не первую версию. Да и данные в Access можно передавать просто сохранив таблицу в этом формате.
А отчеты в Access делать не удобнее?
Там вроде весь инструментарий под это имеется уже не первую версию. Да и данные в Access можно передавать просто сохранив таблицу в этом формате.
-
- Интересующийся
- Сообщения: 18
- Зарегистрирован: 22 июл 2009, 18:06
- Репутация: 0
Re: MapBasic. Отчет в Excel
Ну это уже не моя привелегия
Сказали в Excel, делаю в нем отчет. Моя проблема только в выполнении поставленной задачи. Да и не жалею я, что сделал "лишнюю" работу. Чуток разобрался в MB и действительно понял, что лучше всю нагрузку на вычисления и алгоритм возложить на другой язык программирования, так как функционала у MB явно не хватает. Да и сколько нервов уходит на отладку. Трассировщик в MB отсутствует под чистую.

-
- Гуру
- Сообщения: 977
- Зарегистрирован: 27 янв 2009, 22:57
- Репутация: 258
Re: MapBasic. Отчет в Excel
Конечно, Вы правы Boris сравнивая “превосходный” с “доступным”, победа будет за “доступным”.
А такой крамольной мысли как сохранить данные из MI (режим экспорт таблицы в файл) в dbf формате, а затем открыть их в “превосходном” или “доступном” у меня не было.
Попытка навязать народным массам работать в “доступным” у меня была. Народ сказал нет. Кстати про OpenOffice народ тоже сказал нет.
Да и овес этой зимой подорожал http://www.lensoftware.ru/category_14.html
Получается, чтобы сделать отчеты необходимо потратить на каждую машину около 19000 руб.
Хочу отметить, что trial версия Microsoft Office или такой Freewarный продукт как Excel Viewer кроме функций Viewerа и печати продолжают работать как OLE Server т.е. затраты на вывод отчетов, их просмотр и печать могут =0. Мне кажется, нет смысла сравнивать Excel и Access у них явно разная функциональность и назначение, а вот сравнить Access и Visul FoxPro …
При меньшей стоимости VFP по сравнению с Access на мой взгляд он превосходит его. А все что Вы делаете в Access и MI думаю выполняется и в VFP+MI, причем даже синтаксически очень схоже.
Vfp всегда славился высокоскоростной работой с базами данных в формате dbf
и скоростью работы индексных файлов.
На сегодня Microsoft прекратил разработку VFP и скоро прекратит его поддержку. Это отказ от поддержки старого формата DBF. Что же взамен dbf нам навязывает Microsoft? Какой гениальный формат данных они смогли разработать за последние 10 лет?
Где то чудо, которое нас всех спасет?
Аллилуйя! ... Аллилуйя XML!
А такой крамольной мысли как сохранить данные из MI (режим экспорт таблицы в файл) в dbf формате, а затем открыть их в “превосходном” или “доступном” у меня не было.
Попытка навязать народным массам работать в “доступным” у меня была. Народ сказал нет. Кстати про OpenOffice народ тоже сказал нет.
Да и овес этой зимой подорожал http://www.lensoftware.ru/category_14.html
Получается, чтобы сделать отчеты необходимо потратить на каждую машину около 19000 руб.
Хочу отметить, что trial версия Microsoft Office или такой Freewarный продукт как Excel Viewer кроме функций Viewerа и печати продолжают работать как OLE Server т.е. затраты на вывод отчетов, их просмотр и печать могут =0. Мне кажется, нет смысла сравнивать Excel и Access у них явно разная функциональность и назначение, а вот сравнить Access и Visul FoxPro …
При меньшей стоимости VFP по сравнению с Access на мой взгляд он превосходит его. А все что Вы делаете в Access и MI думаю выполняется и в VFP+MI, причем даже синтаксически очень схоже.
Vfp всегда славился высокоскоростной работой с базами данных в формате dbf
и скоростью работы индексных файлов.
На сегодня Microsoft прекратил разработку VFP и скоро прекратит его поддержку. Это отказ от поддержки старого формата DBF. Что же взамен dbf нам навязывает Microsoft? Какой гениальный формат данных они смогли разработать за последние 10 лет?
Где то чудо, которое нас всех спасет?
Аллилуйя! ... Аллилуйя XML!
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость