MapBasic. Отчет в Excel

MapInfo, MapBasic
enRai
Интересующийся
Сообщения: 18
Зарегистрирован: 22 июл 2009, 18:06
Репутация: 0

MapBasic. Отчет в Excel

Сообщение enRai » 28 июл 2009, 07:48

И снова здраствуйте!
Стоит задача: по итогам рассчетов из таблицы сделать отчет в 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?

enRai
Интересующийся
Сообщения: 18
Зарегистрирован: 22 июл 2009, 18:06
Репутация: 0

Re: MapBasic. Отчет в Excel

Сообщение enRai » 28 июл 2009, 07:49

Столбцы сбились :( Но думаю понятно будет

enRai
Интересующийся
Сообщения: 18
Зарегистрирован: 22 июл 2009, 18:06
Репутация: 0

Re: MapBasic. Отчет в Excel

Сообщение enRai » 28 июл 2009, 08:14

Вот сижу ковыряю Crystal Reports. Походу самое оно для составления моего отчета

Cancer
Участник
Сообщения: 56
Зарегистрирован: 25 фев 2009, 20:55
Репутация: 3
Откуда: Инструментарий для MapInfo
Контактная информация:

Re: MapBasic. Отчет в Excel

Сообщение Cancer » 28 июл 2009, 11:11

Если подойдет готовое решение - возьми Инструментарий и сформируй отчет.
www.map-info.ru

enRai
Интересующийся
Сообщения: 18
Зарегистрирован: 22 июл 2009, 18:06
Репутация: 0

Re: MapBasic. Отчет в Excel

Сообщение enRai » 28 июл 2009, 19:27

Спасибо, но не подходит :( Не могу понять как в CrystalReports сделать разделитель в виде имени, которое многократно повторяется в таблице, а после разделителя записать данные, в строках которых встречается это имя. То есть нужно сгруппировать записи по одному полю, но чтобы запись по которой производится группировка была отражена в отчете только один раз, в виде разделителя

И еще опять проблема с кодировкой. Русские символы отображаются некорректно в отчете.

bim2010
Гуру
Сообщения: 977
Зарегистрирован: 27 янв 2009, 22:57
Репутация: 258

Re: MapBasic. Отчет в Excel

Сообщение bim2010 » 28 июл 2009, 22:07

Отчет в Exel варианты:
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
Да и подсмотреть, как форматировать ячейки в Excel – создайте макрос, сохраните его. Затем откройте на редактирование в VB.

2 вариант
Создание форматированного RTF файла.
Создайте RTF файл с нужной Вам структурой столбцов и сохраните его.
Откройте затем этот файл каким ни будь известным Вам редактором (блокнотом или f4 в far) и вырежите шапку и подвал и сохраните их.
Разберитесь с форматирование основного вывода по строке (сколько отступов, пробелов или tab, где разделители и т.д.).
Суть второго варианта сводится к созданию обычного текстового файла в который Вы вставите шапку в начале, цикл с выводом основной информации и в конце вставите подвал. И никакого OLE.
Затем открываете форматированый RTF в EXCEL.
Скорость создания такого файла наивысшая, но внешний вид полученного более простой, чем в первом варианте.
Последний раз редактировалось bim2010 01 авг 2009, 09:44, всего редактировалось 1 раз.

enRai
Интересующийся
Сообщения: 18
Зарегистрирован: 22 июл 2009, 18:06
Репутация: 0

Re: MapBasic. Отчет в Excel

Сообщение enRai » 31 июл 2009, 20:51

Огромное спасибо!! Завтра все испробую. А про OLE я читал, но так и не нашел как управлять приложением из MapBasica, видимо плохо смотрел... Буду искать подробную информацию

bim2010
Гуру
Сообщения: 977
Зарегистрирован: 27 янв 2009, 22:57
Репутация: 258

Re: MapBasic. Отчет в Excel

Сообщение bim2010 » 01 авг 2009, 09:20

Если вы решите использовать вариант с OLE, то возможно Вам понадобится файлик excel.h
с описанием параметров 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 скачивания

enRai
Интересующийся
Сообщения: 18
Зарегистрирован: 22 июл 2009, 18:06
Репутация: 0

Re: MapBasic. Отчет в Excel

Сообщение enRai » 01 авг 2009, 22:12

В общем решил все сделать через 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

enRai
Интересующийся
Сообщения: 18
Зарегистрирован: 22 июл 2009, 18:06
Репутация: 0

Re: MapBasic. Отчет в Excel

Сообщение enRai » 01 авг 2009, 22:16

Спасибо bim2010 за потдержку :) А как управлять приложением из MB через OLE я так и не понял :) Пересмотрел весь мануал, как русский, так и английский, но у CreateObject только один синтаксис и он явно не относится к OLE. Чего-то я тут не понимаю! :)

bim2010
Гуру
Сообщения: 977
Зарегистрирован: 27 янв 2009, 22:57
Репутация: 258

Re: MapBasic. Отчет в Excel

Сообщение bim2010 » 02 авг 2009, 09:40

Позволю себе процетировать Borisа
Основная ошибка - это считать MapBasic' языком разработки диалоговых приложений.
MapBasic - это язык несложных приложений, выполняющих команды MapInfo любой сложности.
Конечно же для работы с Excel через OLE мы обращаемся из delphi или Visul FoxPro.
А чтобы взять данные из MI для своего приложения аналогично через OLE обращаемся к нему из delphi или Vfp используя MB. Хочешь порулить Excel - изучи VB, хочешь порулить MI - изучи MB или MapX.

enRai
Интересующийся
Сообщения: 18
Зарегистрирован: 22 июл 2009, 18:06
Репутация: 0

Re: MapBasic. Отчет в Excel

Сообщение enRai » 02 авг 2009, 10:10

Да! У меня изначально была идея написать програмульку на Visual C, чтобы она служила лишь посредником между Excel'ем и MB. Но с компьютером проблемы, поставить Visual Studio не смог, а разбираться некогда, шеф уже требует автоматизации поставленной задачи :) Ну и не судите строго, я не профи в ГИС, а всего лишь студент, проходящий практику :)

Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: MapBasic. Отчет в Excel

Сообщение Boris » 02 авг 2009, 16:18

Рискну встрять в вашу высокотехнологичную беседу.
А отчеты в Access делать не удобнее?
Там вроде весь инструментарий под это имеется уже не первую версию. Да и данные в Access можно передавать просто сохранив таблицу в этом формате.

enRai
Интересующийся
Сообщения: 18
Зарегистрирован: 22 июл 2009, 18:06
Репутация: 0

Re: MapBasic. Отчет в Excel

Сообщение enRai » 02 авг 2009, 23:03

Ну это уже не моя привелегия :) Сказали в Excel, делаю в нем отчет. Моя проблема только в выполнении поставленной задачи. Да и не жалею я, что сделал "лишнюю" работу. Чуток разобрался в MB и действительно понял, что лучше всю нагрузку на вычисления и алгоритм возложить на другой язык программирования, так как функционала у MB явно не хватает. Да и сколько нервов уходит на отладку. Трассировщик в MB отсутствует под чистую.

bim2010
Гуру
Сообщения: 977
Зарегистрирован: 27 янв 2009, 22:57
Репутация: 258

Re: MapBasic. Отчет в Excel

Сообщение bim2010 » 03 авг 2009, 01:19

Конечно, Вы правы 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!

Ответить

Вернуться в «MapInfo»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость