| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Быстрый способ вывода данных в Excel с картинками
			 
			
			Здравствуйте! 
		
		
		
		
		
		
		
	Есть необходимость ускорить вывод данных в Excel. Отчёт содержит картинки. Перечитал много тем на форуме, касающихся вывода данных в Excel. Сделал вариант через SpreadSheets. Работает на порядок быстрее. Но этот способ, к сожалению, не позволяет выводить картинки. Быть может кто-нибудь подскажет быстрый способ вывода данных в Excel с картинками? :-)  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Ищущий знания... 
		
			
	 | 
	
	
	
		
		
		
		 
			
			я реализовывал вот так, через класс Image: 
		
		
		
		
		
		
			X++:     Image           Image;
    COM             comWorksheet;
    COM             comShapes;
    COM             Range;
    ;
    while select tmpTableForImage
    {
        Image   = new Image();
        Image.setData(tmpTableForImage.Image);
        Image.resize(130,100,3);
        comWorksheet    = excel.ActiveSheet();
        comShapes       = comWorkSheet.shapes();
        Range           = excel.Range(tmpTableForImage.NumRow, tmpTableForImage.NumCol);
        Range.select();
        Image.clipboardCopy();
        excel.WorkSheetCur().pasteSpecial(0);
        excel.Range(tmpTableForImage.NumRow, tmpTableForImage.NumCol).select();
        excel.Selection().RowHeight(78);
    }
				__________________ 
		
		
		
		
	"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Ищущий знания... 
		
			
	 | 
	
	
	
		
		
		
		 
			
			забыла написать, поле Image, во временной табличке куда я собирал картинки, типа Container.
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Ищущий знания... 
		
			
	 | 
	
	
	
		
		
		
		 
			
			вот инициализация временной таблицы, вытаскивал картинку из файла: 
		
		
		
		
		
		
			X++: FilePath pathFileLoc;// путь к файлу Bindata binData; ; binData = new BinData(); tmpTableForImage.clear(); tmpTableForImage.NumCol = colPict;// столбец для вставки tmpTableForImage.NumRow = startRow + lineNum - 1; // строка для вставки if (binData.loadFile(pathFileLoc)) tmpTableForImage.Image = binData.getData(); tmpTableForImage.insert(); 
				__________________ 
		
		
		
		
	"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			я делаю вывод картинки аналогичным образом...  но нужно ускорить этот процесс(желание не моё)... 
		
		
		
		
		
		
		
	Сейчас скорость такая: 400 строк выводятся за 1,5 минуты...  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Ищущий знания... 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
  секунд 15-20. Класс выполняется на клиенте.
		
				__________________ 
		
		
		
		
	"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			visible(true) для Excel, конечно, в самом конце делаете? Если нет, то сделайте в самом конце. 
		
		
		
		
		
		
		
	Еще можно для Excel перед циклом поставить Application.ScreenUpdating(false), а после - Application.ScreenUpdating(true). Даже при visible = false это дает некоторую экономию по времени.  | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			приложение делаю видимым по окончании выгрузки...
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Поскольку мне неоткуда почитать картинки из таблицы, набросал джоб, выводящий в файл 400 фрагментов экрана (image.captureScreen). Время работы 2-3 секунды. 
		
		
		
		
		
		
		
	X++: static void Job98(Args _args) { ComExcelDocument_RU doc = new ComExcelDocument_RU(); Image image = new Image(); COM xlApp; COM wbook; COM activeSheet; COM range; int i, timeStart; ; timeStart = timenow(); doc.NewFile('',false); wbook = doc.getComDocument(); xlApp = wbook.Parent(); activeSheet = xlApp.ActiveSheet(); range = activeSheet.Range('B1'); xlApp.ScreenUpdating(false); for (i=1;i<=400;i++) { image.captureScreen(0+(i-1)*2, 0+(i-1)*2, 300+(i-1)*2, 100+(i-1)*2); image.clipboardCopy(); range.RowHeight(78); //range.Select(); //activeSheet.Paste(); range.pasteSpecial(0); range = range.Offset(1,0); } xlApp.ScreenUpdating(true); doc.visible(true); box::info(strFmt('Всего секунд: %1', timenow()-timeStart)); } Опять в упор не понимаю, что означает конструкция pasteSpecial(0) применительно к Range (не к Worksheet!). Ну, нет там такой подпольной константы! По логике должна быть какая-то -4104 = xlPasteAll, но с ней валится.... А с 0 работает! Во дела... В каких же недокументированных анналах это прописано? Что-то подобное мы уже обсуждали здесь: Параметры pastespecial()  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: gl00mie (3), Molchun (1). | |
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Спасибо всем за помощь! :-)
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Gustav
			 
 
			Опять в упор не понимаю, что означает конструкция pasteSpecial(0) применительно к Range (не к Worksheet!). Ну, нет там такой подпольной константы! По логике должна быть какая-то -4104 = xlPasteAll, но с ней валится.... А с 0 работает! Во дела... В каких же недокументированных анналах это прописано? 
		
	X++: range.pasteSpecial( 0 ); range.pasteSpecial( 01\01\1900 ); range.pasteSpecial( false ); range.pasteSpecial( '' ); range.pasteSpecial( 'какая-то фигня непонятная...'); range.pasteSpecial( COMArgument::NoValue ); range.pasteSpecial( COMVariant::createNoValue() );  | 
| 
	
 | 
| 
	
	 | 
	
		
  |