Независимый форум, посвященный системе БОСС-Кадровик  и всему, что с ней связано
  | 
				 
				 | 
			 
		 
		 
	
		| Предыдущая тема :: Следующая тема   | 
	 
	
	
		| Автор | 
		Сообщение | 
	 
	
		KruZer
 
 
  Зарегистрирован: 06.04.2020 Сообщения: 4
 
  | 
		
			
				 Добавлено: Пн Апр 06, 2020 12:47    Заголовок сообщения: Выгрузка с помощью z-процедуры в несколько файлов Excel | 
				     | 
			 
			
				
  | 
			 
			
				Здравствуйте!
 
Возникла проблема: не получается вывести данные по разным Excel файлам, на основе шаблона.. Не понятно, как в z-процедуре, в цикле, сделать так, чтобы выводились данные в множество Excel файлов, а не в один..
 
 
Как наглядный пример, упрощенный, для понимания:
 
 
{
 
var file,kolichestvo_rabotnikov,summa_zp;
 
...
 
 
Opent t1
 
...
 
while(1){
 
Fetch t1,file,kolichestvo_rabotnikov,summa_zp;
 
if (teot(t1)) break;
 
	
 
		//Загружаем шаблон
 
		m_Excel.Init(sid);
 
		m_Excel.LoadShablon("shablon");
 
		
 
		//Выводим в разные Excel файлы строку с количеством работников и суммой
 
		ins_Excel_num(sid,1,1,kolichestvo_rabotnikov);
 
		ins_Excel_num(sid,1,2,summa_zp);
 
		
 
		//В следущем проходе цикла должен создаться другой файл, как это сделать?
 
		
 
}
 
Close t1;
 
 
..
 
return 0
 
}
 
 
Подскажите, пожалуйста, как это осуществить.. И осуществимо ли? | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		NewAge
 
 
  Зарегистрирован: 11.06.2010 Сообщения: 110
 
  | 
		
			
				 Добавлено: Вт Апр 07, 2020 18:55    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				| Так-с... Это Oracle? А можете кинуть код m_Excel? Может проанализировав его что и подскажу. У нас с этим вроде не так все сложно в SQL))) | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		KruZer
 
 
  Зарегистрирован: 06.04.2020 Сообщения: 4
 
  | 
		
			
				 Добавлено: Вт Апр 07, 2020 20:21    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Здравствуйте! Да, платформа Oracle. Доберусь до компьютера - обязательно скину.
 
Большое спасибо за отзывчивость! | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		KruZer
 
 
  Зарегистрирован: 06.04.2020 Сообщения: 4
 
  | 
		
			
				 Добавлено: Ср Апр 08, 2020 03:44    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Не нашел как прикрепить текстовый файл.. Вот код m_Excel:
 
 
 	  | Код: | 	 		  
 
// module  m_Excel;
 
// Вспомогательный модуль для формирования отчетов в Excel
 
 
string sid[20] = "", empty[2]="";
 
 
function Err0() {
 
  put("необходимо сначала вызвать функцию Init(sid);");
 
  return 1;
 
}
 
 
number xlsx = 0;
 
function Init*(string asid[]) {
 
  if ((asid == "2" || asid == "x") && sid == empty) {
 
     xlsx = 1;
 
     strcpy(sid, asid);
 
     return ins_Excel(sid, 0, 0, "__OPEN__");
 
  }
 
  if (sid == empty) strcpy(sid, asid);
 
  return 1;
 
}
 
 
function LoadShablon*(string shab[]) {
 
  if (sid == empty) return Err0();
 
  string s[300];
 
  sput(s, "__LOADSHABLON__%s", shab);
 
  return ins_Excel(sid, 0, 0, s);
 
}
 
 
/*
 
Скрипт на упрощенном Visual Basic.
 
Доступны только вызовы методов и установка свойств.
 
Это не вызов Visual Basic, а интерпретация кода путем преобразования
 
в вызовы методов пакета UOLE2.
 
Следовательно символические константы (xlAutomatic, ...) недопустимы
 
Их значения можно выяснить в макросах Excel
 
Скрипт : Оператор { ';' Оператор }
 
Оператор : ВызовМетода { '.' ВызовМетода } [ '=' (строка | число) ]
 
ВызовМетода : Идентификатор [ '('(строка | число | стдИдент) { ',' (строка | число | стдИдент) } ')' ]
 
стдИдент: empty | ActiveCell | ActiveSheet | ActiveWorkBook | ActiveChart 
 
строка : '"' символ { символ } '"'
 
 
  m_Excel.VBScript(
 
      "visible=0; WorkBooks.Add;"
 
      "ActiveSheet.Cells(1,1).Value=\"TEST1\";"
 
      "ActiveSheet.Cells(2,1).Value=\"TEST2\";"
 
      "ActiveSheet.Cells(1,2).Value=3.14;"
 
      "ActiveSheet.Cells(2,2).Value=2.78;"
 
      "Columns(\"B:B\").ColumnWidth=39;"
 
      "Rows(\"2:4\").RowHeight=48;"
 
      "Range(\"B4\").Interior.ColorIndex=3;"
 
      "Range(\"B3\").Interior.ColorIndex=5;"
 
      "Range(\"B2:B4\").Select;"
 
      "Selection.Borders(7).LineStyle=1;"
 
      "Selection.Borders(8).LineStyle=1;"
 
      "Selection.Borders(9).LineStyle=1;"
 
      "Selection.Borders(10).LineStyle=1;"
 
      "Range(\"A1\").Select;");
 
 
  // 5-я строка заголовок страницы, ориентация страницы - пейзаж
 
  m_Excel.VBScript(
 
    "ActiveSheet.PageSetup.PrintTitleRows=\"$5:$5\""
 
    "ActiveSheet.PageSetup.PrintTitleColumns=\"\";"
 
    "ActiveSheet.PageSetup.Orientation=2;");  // 2- xlLandscape, 1- xlPortrait
 
*/
 
function VBScript0(string scr[]) {
 
  string s[4040];
 
  if (sid == empty) return Err0();
 
  if (xlsx) return 0;
 
  sput(s, "__OLE_SCRIPT__%s", scr);
 
  return ins_Excel(sid, 0, 0, s);
 
}
 
 
function VBScript*(string scr[]) {
 
  return VBScript0(scr);
 
}
 
 
// сформировать строку диапазона ячеек c1r1:c2r2 или c1:c2
 
function cRange*(number r1, number c1, number r2, number c2, string &rw) {
 
  number cc1, cc2, nm;
 
  string s[20];
 
  nm = ord("A") - 1;
 
  if (r1 > 0 && c1 == 0) c1 = 1;
 
  if (r2 > 0 && c2 == 0) c2 = 255;
 
  cc1 = c1 % 26;  if (cc1 <= 0.5) cc1 = 26;
 
  cc2 = c2 % 26;  if (cc2 <= 0.5) cc2 = 26;
 
  cc1 = cc1+ nm;  cc2 = cc2+ nm;
 
  if (c1 > 26) {
 
     chr(cc1, s); 
 
     chr(nm+ trunc((c1-1)/26, 1), rw);  strcat(rw, s);
 
  }
 
  else
 
     chr(cc1, rw);
 
  if (r1 > 0) { sput(s, "%d", r1);  strcat(rw, s); }
 
  strcat(rw, ":");
 
  if (c2 > 26) {
 
     chr(nm+ trunc((c2-1)/26, 1), s);  strcat(rw, s);
 
  }
 
  chr(cc2, s);  strcat(rw, s);
 
  if (r2 > 0) { sput(s, "%d", r2);  strcat(rw, s); }
 
  
 
  return 0;
 
}
 
 
function SelectCell0(number row, number col) {
 
  if (sid == empty) return Err0();
 
  string s[100];
 
  if (xlsx) return ins_Excel(sid, row, col, "__SELECTCELL__");
 
  if (row > 0 && col > 0)
 
     sput(s, "ActiveSheet.Cells(%d,%d).Select;", row, col);
 
  else if (row > 0 && col == 0)
 
     sput(s, "ActiveSheet.Rows(\"%d:%d\").Select;", row, row);
 
  else if (row == 0 && col > 0) {
 
     string cols[6];
 
     cRange(0, col, 0, col, cols);
 
     sput(s, "ActiveSheet.Columns(\"%s\").Select;", cols);
 
  }
 
  else
 
     return -1;
 
  return VBScript0(s);
 
}
 
 
// выделить ячейку (row, сol)
 
function SelectCell*(number row, number col) {
 
  return SelectCell0(row, col);
 
}
 
 
// выделить колонку сol
 
function SelectColumn*(number col) {
 
  return SelectCell0(0, col);
 
}
 
 
// выделить строку row
 
function SelectRow*(number row) {
 
  return SelectCell0(row, 0);
 
}
 
 
// добавить строку перед строкой с номером row
 
function InsertRowBefore*(number row) {
 
  if (sid == empty) return Err0();
 
  if (row) SelectCell(row, 1);
 
  return ins_Excel(sid, row, 0, "__INSERT__");
 
}
 
 
// добавить строку перед текущей
 
// Selection.EntireRow.Insert
 
function InsertRow*() {
 
  return InsertRowBefore(0);
 
}
 
 
// удалить строку с номером row
 
function DeleteRow*(number row) {
 
  if (sid == empty) return Err0();
 
  return ins_Excel(sid, row, 1, "__DELETE__");
 
}
 
 
// удалить текущую строку
 
function DeleteCurRow*() {
 
  return DeleteRow(0);
 
}
 
 
// добавить столбец(колонку) перед столбцом col
 
function InsertColumnBefore*(number col) {
 
  if (sid == empty) return Err0();
 
  number row;
 
  if (col) row = 1; else row = 0;
 
  return ins_Excel(sid, row, col, "__ADDCOLUMN__");
 
}
 
 
// добавить столбец перед текущим
 
// Selection.EntireColumn.Insert
 
function InsertColumn*() {
 
  return InsertColumnBefore(0);
 
}
 
 
// добавить символ перевода страницы
 
function PageBreak*() {
 
  if (sid == empty) return Err0();
 
  return ins_Excel(sid, 0, 0, "__PAGEBREAK__");
 
}
 
 
// выполнить макро macro с аргументами param
 
function RunMacro*(string macro[], string param[]) {
 
  if (sid == empty) return Err0();
 
  string s[1000];
 
  if (xlsx) return -1;
 
  sput(s, "__RUNMACRO__%s %s", macro, param);
 
  return ins_Excel(sid, 0, 0, s);
 
}
 
 
// объединить ячейки (row, col) (row2,col2) в одну
 
function MergeCells*(number row, number col, number row2, number col2) {
 
  if (sid == empty) return Err0();
 
  string s[100];
 
  sput(s, "__MERGE__%d %d", row2, col2);
 
  return ins_Excel(sid, row, col, s);
 
}
 
 
function BoldCell0(number row, number col) {
 
  if (sid == empty) return Err0();
 
  return ins_Excel(sid, row, col, "__FONT_BOLD__");
 
}
 
 
// установить полужирный шрифт в ячейке (row, сol)
 
function BoldCell*(number row, number col) {
 
  return BoldCell0(row, col);
 
}
 
 
// установить полужирный шрифт в колонке сol
 
function BoldColumn*(number col) {
 
  return BoldCell0(0, col);
 
}
 
 
// установить полужирный шрифт в строке row
 
function BoldRow*(number row) {
 
  return BoldCell0(row, 0);
 
}
 
 
function ItalicCell0(number row, number col) {
 
  if (sid == empty) return Err0();
 
  return ins_Excel(sid, row, col, "__FONT_ITALIC__");
 
}
 
 
// установить шрифт-курсив в ячейке (row, сol)
 
function ItalicCell*(number row, number col) {
 
  return ItalicCell0(row, col);
 
}
 
 
// установить шрифт-курсив в колонке сol
 
function ItalicColumn*(number col) {
 
  return ItalicCell0(0, col);
 
}
 
 
// установить шрифт-курсив в строке row
 
function ItalicRow*(number row) {
 
  return ItalicCell0(row, 0);
 
}
 
 
function NormalCell0(number row, number col) {
 
  if (sid == empty) return Err0();
 
  return ins_Excel(sid, row, col, "__FONT_NORMAL__");
 
}
 
 
// установить нормальный шрифт в строке row
 
function NormalCell*(number row, number col) {
 
  return NormalCell0(row, col);
 
}
 
 
// установить нормальный шрифт в колонке сol
 
function NormalColumn*(number col) {
 
  return NormalCell0(0, col);
 
}
 
 
// установить нормальный шрифт в строке row
 
function NormalRow*(number row) {
 
  return NormalCell0(row, 0);
 
}
 
 
function ColorCell0(number row, number col, number color) {
 
  if (sid == empty) return Err0();
 
  string s[100];
 
  if (xlsx) {
 
     sput(s, "__SET_BGCOLOR__%d", color+ 7);
 
     return ins_Excel(sid, row, col, s);
 
  }
 
  if (row > 0 && col > 0)
 
     sput(s, "ActiveSheet.Cells(%d,%d).Interior.ColorIndex=%d;", row, col, color);
 
  else if (row > 0 && col == 0)
 
     sput(s, "ActiveSheet.Rows(\"%d:%d\").Interior.ColorIndex=%d;", row, row, color);
 
  else if (row == 0 && col > 0) {
 
     string cols[6];
 
     cRange(0, col, 0, col, cols);
 
     sput(s, "ActiveSheet.Columns(\"%s\").Interior.ColorIndex=%d;", cols, color);
 
  }
 
  else
 
     return -1;
 
  return VBScript0(s);
 
}
 
 
// установить цвет color в ячейке (row, сol)
 
// 3- красный, 4 - зеленый, 5 - синий и т.д.
 
function ColorCell*(number row, number col, number color) {
 
  return ColorCell0(row, col, color);
 
}
 
 
// установить цвет color в строке row
 
function ColorRow*(number row, number color) {
 
  return ColorCell0(row, 0, color);
 
}
 
 
// установить цвет color в колонке сol
 
function ColorColumn*(number col, number color) {
 
  return ColorCell0(0, col, color);
 
}
 
 
// установить цвет color в дипазоне ячеек r1c1: r2c2
 
function ColorRegion*(number r1, number c1, number r2, number c2, number color) {
 
  string s[100], rg[16];
 
  cRange(r1, c1, r2, c2, rg);
 
  if (xlsx) {
 
     sput(s, "__SET_BGCOLOR__%d %d %d", color+ 7, r2, c2);
 
     return ins_Excel(sid, r1, c1, s);
 
  }
 
  sput(s, "ActiveSheet.Range(\"%s\").Interior.ColorIndex=%d;", rg, color);
 
  return VBScript0(s);
 
}
 
 
function BorderSingleCell0(number row, number col, number row2, number col2) {
 
  if (sid == empty) return Err0();
 
  string s[100];
 
  if (row2 > 0)
 
     sput(s, "__BORDER_SINGLE__%d %d", row2, col2);
 
  else
 
     sput(s, "__BORDER_SINGLE__");
 
  return ins_Excel(sid, row, col, s);
 
}
 
 
function BorderSingleCell*(number row, number col) {
 
  return BorderSingleCell0(row, col, 0, 0);
 
}
 
 
function BorderSingleRegion*(number row, number col, number row2, number col2) {
 
  return BorderSingleCell0(row, col, row2, col2);
 
}
 
 
function BorderDoubleCell0(number row, number col, number row2, number col2) {
 
  if (sid == empty) return Err0();
 
  string s[100];
 
  if (row2 > 0)
 
     sput(s, "__BORDER_DOUBLE__%d %d", row2, col2);
 
  else
 
     sput(s, "__BORDER_DOUBLE__");
 
  return ins_Excel(sid, row, col, s);
 
}
 
 
function BorderDoubleCell*(number row, number col) {
 
  return BorderDoubleCell0(row, col, 0, 0);
 
}
 
 
function BorderDoubleRegion*(number row, number col, number row2, number col2) {
 
  return BorderDoubleCell0(row, col, row2, col2);
 
}
 
 
// для RANGE r1c1:r2c2 установить границы st = "LineStyle, Weight, ColorIndex"
 
// т.е тип линии, толщина, цвет
 
// для top(верх), right( справа), bottom (снизу), left(слева)
 
// st = "1" или "1,2" - то же что BorderSingle
 
// st = "1,-4138" - то же что BorderDouble 
 
// st = "1,2,5" - синий BorderSingle
 
function BorderRegionEx*(number r1, number c1, number r2, number c2, top, right, bottom, left, string st[]) {
 
  string s[4000], s2[100], rg[16];
 
  number lineSt, w, color;
 
  
 
  if (xlsx) return 0;
 
  number i = strstr(st, ",");
 
  if (i > 0) {
 
     strn2cpy(s2, st, 0, i);
 
     strnum(s2, lineSt);
 
     strn2cpy(s, st, i+ 1, 100- i);
 
     i = strstr(s, ",");
 
     if (i > 0) {
 
        strn2cpy(s2, s, 0, i);
 
        strnum(s2, w);
 
        strn2cpy(s2, s, i+ 1, 20);
 
        strnum(s2, color);
 
     }
 
     else {
 
        strnum(s, w);  color = -4105;
 
     }   
 
  }
 
  else {
 
     if (strlen(st) == 0) lineSt = 1; else strnum(st, lineSt);
 
     w = 2;  color = -4105;
 
  }   
 
 
  cRange(r1, c1, r2, c2, rg);
 
  s = "";
 
  if (top) {
 
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(8).LineStyle=%d;", rg, lineSt);
 
     strcat(s, s2);
 
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(8).Weight=%d;", rg, w);
 
     strcat(s, s2);
 
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(8).ColorIndex=%d;", rg, color);
 
     strcat(s, s2);
 
  }
 
  if (right) {
 
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(10).LineStyle=%d;", rg, lineSt);
 
     strcat(s, s2);
 
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(10).Weight=%d;", rg, w);
 
     strcat(s, s2);
 
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(10).ColorIndex=%d;", rg, color);
 
     strcat(s, s2);
 
  }
 
  if (bottom) {
 
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(9).LineStyle=%d;", rg, lineSt);
 
     strcat(s, s2);
 
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(9).Weight=%d;", rg, w);
 
     strcat(s, s2);
 
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(9).ColorIndex=%d;", rg, color);
 
     strcat(s, s2);
 
  }
 
  if (left) {
 
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(7).LineStyle=%d;", rg, lineSt);
 
     strcat(s, s2);
 
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(7).Weight=%d;", rg, w);
 
     strcat(s, s2);
 
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(7).ColorIndex=%d;", rg, color);
 
     strcat(s, s2);
 
  }
 
  //sput(s2, "ActiveSheet.Range(\"%s\").Select;", rg);
 
  //strcat(s, s2);
 
  if (s != "") VBScript0(s);
 
  return 0;
 
}
 
 
 
function FormatCell0(number row, number col, string fmt[]) {
 
  if (sid == empty) return Err0();
 
  string s[100], s2[100];
 
  if (xlsx) {
 
     string s1[2];
 
     strtrunc(s2, 0);
 
     number i = 0, len = strlen(fmt);
 
     while (i < len) {
 
        strn2cpy(s1, fmt, i, 1);
 
        if (strcmp(s1, "М") == 0) strcat(s2, "m");
 
        else if (strcmp(s1, "Д") == 0) strcat(s2, "d");
 
        else if (strcmp(s1, "Г") == 0) strcat(s2, "y");
 
        else if (strcmp(s1, "Ч") == 0) strcat(s2, "h");
 
        else if (strcmp(s1, "С") == 0) strcat(s2, "s");
 
        else strcat(s2, s1);
 
        i = i+ 1;
 
     }
 
     if (strcmp(s2, "m/d/yyyy") == 0) strcpy(s2, "dd/mm/yyyy;@");
 
     else if (strcmp(s2, "m/d/yyyy h:mm") == 0) strcpy(s2, "dd/mm/yy\\ h:mm:ss;@");
 
     else if (strcmp(s2, "m/d/yyyy h:mm;@") == 0) strcpy(s2, "dd/mm/yy\\ h:mm:ss;@");
 
  }
 
  else strcpy(s2, fmt);
 
  sput(s, "__CELL_FORMAT__%s", s2);
 
  return ins_Excel(sid, row, col, s);
 
}
 
 
// установить формат ячейки (row, col) в fmt
 
function FormatCell*(number row, number col, string fmt[]) {
 
  return FormatCell0(row, col, fmt);
 
}
 
 
/* установить формат столбца col в fmt
 
    Selection.NumberFormat = "@"  -- текст
 
    Selection.NumberFormat = "0.00" -- число
 
    Selection.NumberFormat = "m/d/yyyy" -- дата
 
    Selection.NumberFormat = "dd/mm/yy h:mm;@" -- дата со временем
 
    Selection.NumberFormat = "General"
 
    Selection.NumberFormat = "0.00E+00"
 
    Selection.NumberFormat = "[$-419]d-mmm-yyyy;@"  14-мар-2003
 
*/
 
function FormatColumn*(number col, string fmt[]) {
 
  return FormatCell0(0, col, fmt);
 
}
 
 
function WidthCell0(number row, number col, number w) {
 
  if (sid == empty) return Err0();
 
  string s[100];
 
  sput(s, "__COLWIDTH__%d", w);
 
  return ins_Excel(sid, row, col, s);
 
}
 
 
// установить ширину ячейки (row, col) равной w
 
function WidthCell*(number row, number col, number w) {
 
  return WidthCell0(row, col, w);
 
}
 
 
// установить ширину столбца col равной w
 
function WidthColumn*(number col, number w) {
 
  return WidthCell0(0, col, w);
 
}
 
 
// установить высоту ячейки (row, col) равной h
 
function HeightCell*(number row, number col, number h) {
 
  if (sid == empty) return Err0();
 
  string s[100];
 
  if (xlsx) {
 
     sput(s, "__ROWHEIGHT__%d", h);
 
     return ins_Excel(sid, row, col, s);
 
  }
 
  if (row > 0 && col > 0)
 
     sput(s, "ActiveSheet.Cells(%d,%d).RowHeight=%d;", row, col, h);
 
  else if (row > 0 && col == 0)
 
     sput(s, "ActiveSheet.Rows(\"%d:%d\").RowHeight=%d;", row, row, h);
 
  else
 
     return -1;
 
  return VBScript0(s);
 
}
 
 
// установить высоту строки row равной h
 
function HeightRow*(number row, number h) {
 
  return HeightCell(row, 0, h);
 
}
 
 
// выравнять ячейку (-1 влево, 0 по центру, 1 вправо, иначе отмена выравнивания
 
function AlignCell0(number row, number col, number a) {
 
  if (sid == empty) return Err0();
 
  string s[100];
 
  if (xlsx) {
 
     sput(s, "__ALIGNCOL__%d", a);
 
     return ins_Excel(sid, row, col, s);
 
  }
 
  if (a == -1) a = -4131;
 
  else if (a == 0) a = -4108;
 
  else if (a == 1) a = -4152;
 
  else a = 1;
 
  if (row > 0 && col > 0)
 
     sput(s, "ActiveSheet.Cells(%d,%d).HorizontalAlignment=%d;", row, col, a);
 
  else if (row > 0 && col == 0)
 
     sput(s, "ActiveSheet.Rows(\"%d:%d\").HorizontalAlignment=%d;", row, row, a);
 
  else if (row == 0 && col > 0) {
 
     string cols[6];
 
     cRange(0, col, 0, col, cols);
 
     sput(s, "ActiveSheet.Columns(\"%s\").HorizontalAlignment=%d;", cols, a);
 
  }
 
  else
 
     return -1;
 
  return VBScript0(s);
 
}
 
 
// выравнять ячейку (-1 влево, 0 по центру, 1 вправо, иначе отмена выравнивания
 
function AlignCell*(number row, number col, number a) {
 
  return AlignCell0(row, col, a);
 
}
 
// выравнять столбец (-1 влево, 0 по центру, 1 вправо, иначе отмена выравнивания
 
function AlignColumn*(number col, number a) {
 
  return AlignCell0(0, col, a);
 
}
 
 
// установить шрифт диапазона ячеек r1c1:r2c2 в fnt размером в size
 
// если fnt пусто установить размер, если size = 0, то только устанвить шрифт
 
function setFontRegion*(number r1, number c1, number r2, number c2, string fnt[], number size) {
 
  if (sid == empty) return Err0();
 
  string s[200], rg[40];
 
  if (xlsx) return 0;
 
  if (c1 == 0 && c2 == 0)
 
     sput(rg, "ActiveSheet.Rows(\"%d:%d\")", r1, r2);
 
  else {
 
     cRange(r1, c1, r2, c2, s);
 
     sput(rg, "ActiveSheet.Range(\"%s\")", s);
 
  }
 
  if (fnt != "")
 
     sput(s, "%s.Font.Name=\"%s\";", rg, fnt);
 
  else
 
     s = "";
 
  if (size > 0 && size < 40) {
 
     string s2[100];
 
     sput(s2, "%s.Font.Size=%d;", rg, size);
 
     strcat(s, s2);
 
  }
 
  if (s != "") return VBScript0(s);
 
  return 0;
 
}
 
 
// установить значение ячейки (row, сol) в val
 
function str*(number row, number col, string val[]) {
 
  if (sid == empty) return Err0();
 
  //if (xlsx) {
 
  //   string s[400];
 
  //   sput(s, "__SET_STR__%s", val);
 
  //   return ins_Excel(sid, row, col, s);
 
  //}
 
  return ins_Excel(sid, row, col, val);
 
}
 
 
// установить значение ячейки (row, сol) в val
 
function num*(number row, number col, number val) {
 
  if (sid == empty) return Err0();
 
  //if (xlsx) {
 
  //   string s[60];
 
  //   sput(s, "__SET_NUMBER__%d", val);
 
  //   return ins_Excel(sid, row, col, s);
 
  //}
 
  return ins_Excel_num(sid, row, col, val);
 
}
 
 
// установить значение ячейки (row, сol) в val, 0- не печатать
 
function numnz*(number row, number col, number val) {
 
  if (sid == empty) return Err0();
 
  if (abs(val) < 0.00000000000001)
 
     return str(row, col, empty);
 
  return num(row, col, val);
 
}
 
 
// установить значение ячейки (row, сol) в val жирным шрифтом
 
function numb*(number row, number col, number val) {
 
  if (sid == empty) return Err0();
 
  if (xlsx) {
 
     num(row, col, val);
 
     return BoldCell0(row, col);
 
  }
 
  if (row > 0 && col > 0) {
 
     string s[400];
 
     sput(s, "ActiveSheet.Cells(%d,%d).Font.Bold=1;ActiveSheet.Cells(%d,%d).Value=%d;",
 
       row, col, row, col, round(val, 0.00000001));
 
     return VBScript0(s);
 
  }
 
  return 0;
 
}
 
 
// установить значение ячейки (row, сol) в первые n знаков val
 
function strn*(number row, number col, string val[], number n) {
 
  string s[1000];
 
  if (sid == empty) return Err0();
 
  if (n > 999 || n < 0) n = 999;
 
  strn2cpy(s, val, 0, n);
 
  return str(row, col, s);
 
}
 
 
// установить значение ячейки (row, сol) в val жирным шрифтом
 
function strb*(number row, number col, string val[]) {
 
  if (sid == empty) return Err0();
 
  if (xlsx) {
 
     str(row, col, val);
 
     return BoldCell0(row, col);
 
  }
 
  if (row > 0 && col > 0) {
 
     string s[400];
 
     sput(s, "ActiveSheet.Cells(%d,%d).Font.Bold=1;ActiveSheet.Cells(%d,%d).Value=\"%s\";",
 
       row, col, row, col, val);
 
     return VBScript0(s);
 
  }
 
  return 0;
 
}
 
 
// установить значение ячейки (row, сol) в val курсивом
 
function stri*(number row, number col, string val[]) {
 
  if (sid == empty) return Err0();
 
  if (xlsx) {
 
     str(row, col, val);
 
     return ItalicCell0(row, col);
 
  }
 
  if (row > 0 && col > 0) {
 
     string s[400];
 
     sput(s, "ActiveSheet.Cells(%d,%d).Font.Italic=1;ActiveSheet.Cells(%d,%d).Value=\"%s\";",
 
       row, col, row, col, val);
 
     return VBScript0(s);
 
  }
 
  return 0;
 
}
 
// установить значение ячейки (row, сol) в val с явным указанием текстового формата
 
function strt*(number row, number col, string val[]) {
 
  if (sid == empty) return Err0();
 
  if (xlsx) {
 
     str(row, col, val);
 
     return FormatCell(row, col, "@");
 
  }
 
  FormatCell(row, col, "@");
 
  return ins_Excel(sid, row, col, val);
 
}
 
 
// добавить копию диапазона ячеек r1_from-c1_from:r2_from-c2_from листа wsname
 
// в ячейку r_to-c_to текущего листа
 
//  ActiveSheet.Cells(r_to,c_to).Select;
 
//  Sheets(wsname).Range().Copy(ActiveCell);
 
// работает только с set_mode(3)
 
function CopyRegion*(number r_to, c_to, string wsname[], number r1_from, c1_from, r2_from, c2_from) {
 
  if (sid == empty) return Err0();
 
  string s[500], rg[16];
 
  if (xlsx) {
 
     sput(s, "__COPYREGION__%d,%d,%d,%d,`%s`", r1_from, c1_from, r2_from, c2_from, wsname); 
 
     return ins_Excel(sid, r_to, c_to, s);
 
  }
 
  cRange(r1_from, c1_from, r2_from, c2_from, rg); 
 
  sput(s, "ActiveSheet.Cells(%d,%d).Select;Sheets(\"%s\").Range(\"%s\").Copy(ActiveCell);", 
 
    r_to, c_to, wsname, rg);
 
  return VBScript0(s);
 
}
 
 
// установить текущим лист wsname
 
function ActivateWorkSheet*(string wsname[]) {
 
  if (sid == empty) return Err0();
 
  string s[200];
 
  if (xlsx) {
 
     sput(s, "__ACTIVATEWORKSHEET__%s", wsname);
 
     return ins_Excel(sid, 0, 0, s);
 
  }
 
  sput(s, "ActiveWorkBook.Sheets(\"%s\").Select;", wsname);
 
  return VBScript0(s);
 
}
 
 
// добавить копию листа wsname перед листом before и назвать wsnew
 
//  Sheets(wsname).Copy Before := wsbefore
 
//  ActiveSheet.name = wsnew;
 
// работает только с set_mode(3)
 
function CopyWorkSheet*(string wsname[], string before[], string wsnew[]) {
 
  if (sid == empty) return Err0();
 
  string s[500];
 
  if (xlsx) {
 
     sput(s, "__COPYWORKSHEET__`%s`,`%s`,`%s`", wsname, before, wsnew); 
 
     return ins_Excel(sid, 0, 0, s);
 
  }
 
  sput(s, "ActiveWorkBook.Sheets(\"%s\").Select;Sheets(\"%s\").Copy(ActiveSheet);ActiveSheet.Name = \"%s\";", 
 
    before, wsname, wsnew);
 
  return VBScript0(s);
 
 
  //sput(s, "__COPYWORKSHEET__%s,%s,%s", wsname, before, wsnew);
 
  //ins_Excel(sid, 0, 0, s);
 
  //return 0;
 
}
 
 
// Переименовать лист wsname1 в лист wsname2
 
// Если wsname1 = "", то переименовать текущий лист в лист wsname2
 
function RenameWorkSheet*(string wsname1[], string wsname2[]) {
 
  if (sid == empty) return Err0();
 
  string s[100];
 
  if (xlsx) {
 
     sput(s, "__RENAMEWORKSHEET__`%s`,`%s`", wsname1, wsname2);
 
     return ins_Excel(sid, 0, 0, s);
 
  }
 
  if (strcmp(wsname1, "") == 0)
 
     sput(s, "ActiveSheet.Name = \"%s\";", wsname2);
 
  else
 
     sput(s, "ActiveWorkBook.Sheets(\"%s\").Name = \"%s\";", wsname1, wsname2);
 
  return VBScript0(s);
 
}
 
 
// Удалить лист wsname
 
function DeleteWorkSheet*(string wsname[]) {
 
  if (sid == empty) return Err0();
 
  string s[200];
 
  if (xlsx) {
 
     sput(s, "__DELETEWORKSHEET__%s", wsname);
 
     return ins_Excel(sid, 0, 0, s);
 
  }
 
  //sput(s, "DisplayAlerts=0;Sheets(\"%s\").Delete;DisplayAlerts=-1;", wsname);
 
  sput(s, "DisplayAlerts=0;ActiveWorkBook.Sheets(\"%s\").Delete;", wsname);
 
  return VBScript0(s);
 
}
 
 
// установить шрифт диапазона ячеек r1c1:r2c2 в fnt размером в size и вычесть высоту
 
// если fnt пусто установить размер, если size = 0, то только устанвить шрифт
 
function setHFontRegion*(number r1, number c1, number r2, number c2, string fnt[], number size, string valStr, number lCell) {
 
  if (sid == empty) return Err0();
 
  string s[200], rg[16];
 
  number HeigthCell, L_str, a, NumLines, cof;
 
  cRange(r1, c1, r2, c2, rg); 
 
  if (xlsx) return 0;
 
  if (fnt != "" && strlen(valStr) > 0 && lCell > 0) {
 
     sput(s, "ActiveSheet.Range(\"%s\").Font.Name=\"%s\";", rg, fnt);
 
     cof = 0.157 * size;
 
     L_str = strlen(valStr)*cof; //определили длину строки
 
     a = round(L_str, 1);
 
     if (a < lCell)
 
        HeigthCell = size + 3.75;         //определили высоту строки  
 
     else {
 
        NumLines = a/lCell;                  //определили кол-во строк в ячейке
 
        HeigthCell = (size + 3.75)*NumLines; //определили общую высоту ячейки
 
     }
 
  }
 
  else
 
     s = "";
 
  if (size > 0 && size < 40) {
 
     string s2[100];
 
     sput(s2, "ActiveSheet.Range(\"%s\").Font.Size=%d;", rg, size);
 
     strcat(s, s2);
 
  }
 
  if (s != "") VBScript0(s);
 
  return HeigthCell;
 
}
 
 
// установить режим работы OLE 1- серверный, 2 - клиентский, 3- серверный с библиотекой UOLE.dll
 
// при значении 2
 
//    шаблоны должны находиться в каталоге пользователя на клиенте
 
//    обязательно должен быть подкаталог PR с файлами empty.doc, empty.xls
 
//    скопированными из серверного каталога ..\CLI\PR
 
// вызов должен быть сразу после вызова Init(sid);
 
function set_mode*(number mode) {
 
  if (xlsx) return 0;
 
  if (mode != 1 && mode != 2 && mode != 3) return -1;
 
  if (sid == empty) return Err0();
 
  string s[100];
 
  sput(s, "__OLE_MODE__%d", mode);
 
  return ins_Excel(sid, 0, 0, s);
 
}
 
 
// побуквенно вывести строку в прямоугольную область
 
// добавлено расстояние между столбцами и строками
 
// abz - отступить в первой строке (абзац)
 
function strrectda*(number row, number col, number w, number h, number dx, number dy, number abz, string val[]) {
 
  number l, i, row1, col1;
 
  string ch[2];
 
  l = strlen(val);
 
  i = 0; row1 = row; col1 = col + abz * dx;
 
  while (i<l) {
 
    strn2cpy(ch, val, i, 1);
 
    str(row1, col1, ch);
 
    i = i+1;
 
    col1 = col1 + dx; 
 
    if (col1 >= col + w * dx) {
 
      col1 = col;
 
      row1 = row1 + dy;
 
      if (row1 >= row + h * dy) break;
 
    }
 
  }
 
  return 0;
 
}
 
function strrectd*(number row, number col, number w, number h, number dx, number dy, string val[]) {
 
  return strrectda(row, col, w, h, dx, dy, 0, val);
 
}
 
function strrectdu*(number row, number col, number w, number h, number dx, number dy, string val[]) {
 
  string val1[1000];
 
  val1 = val;
 
  strupr(val1);
 
  return strrectda(row, col, w, h, dx, dy, 0, val1);
 
}
 
function strrectdua*(number row, number col, number w, number h, number dx, number dy, number abz, string val[]) {
 
  string val1[1000];
 
  val1 = val;
 
  strupr(val1);
 
  return strrectda(row, col, w, h, dx, dy, abz, val1);
 
}
 
// побуквенно вывести строку в прямоугольную область
 
// abz - отступить в первой строке (абзац)
 
function strrecta*(number row, number col, number w, number h, number abz, string val[]) {
 
  return strrectda(row, col, w, h, 1, 1, abz, val);
 
}
 
function strrect*(number row, number col, number w, number h, string val[]) {
 
  return strrecta(row, col, w, h, 0, val);
 
}
 
function strrectua*(number row, number col, number w, number h, number abz, string val[]) {
 
  string val1[1000];
 
  val1 = val;
 
  strupr(val1);
 
  return strrecta(row, col, w, h, abz, val1);
 
}
 
function strrectu*(number row, number col, number w, number h, string val[]) {
 
  string val1[1000];
 
  val1 = val;
 
  strupr(val1);
 
  return strrect(row, col, w, h, val1);
 
}
 
function strrectx*(number row, number col, number dx, string val[]) {
 
  return strrectda(row, col, 100, 1, dx, 1, 0, val);
 
}
 
 
// получить значение ячейки (row, сol) в val
 
function getCell*(number row, number col, string val[]) {
 
  if (sid == empty) return Err0();
 
  if (xlsx) {
 
     string s[4000];
 
     strcpy(s, "__GET_STR__");
 
     ins_Excel(sid, row, col, s);
 
     strcpy(val, s);
 
  }
 
  else val = "";
 
  return 0;
 
}
 
 
// получить значение ячейки (row, сol) в val
 
function getNum*(number row, number col, number &val) {
 
  if (sid == empty) return Err0();
 
  string sval[40];
 
  getCell(row, col, sval);
 
  strnum(sval, val);
 
  return 0;
 
}
 
 
// получить имя формируемого файла xlsx
 
function getFilename*(string val[]) {
 
  if (sid == empty) return Err0();
 
  if (xlsx) {
 
     string s[4000];
 
     strcpy(s, "__GET_FILE_NAME__");
 
     ins_Excel(sid, 0, 0, s);
 
     strcpy(val, s);
 
  }
 
  else val = "";
 
  return 0;
 
}
 
 
// изменить имя формируемого файла xlsx
 
// имя должно быть абсолютным путём или же относительным к каталогу fcgi
 
// C:\BK\TEMP\kt\k52.xlsx или ..\..\TEMP\kt\k52.xlsx
 
function setFilename*(string val[]) {
 
  if (sid == empty) return Err0();
 
  if (xlsx && strlen(val) > 12) {
 
     string s[300];
 
     sput(s, "__SET_FILE_NAME__%200s", val);
 
     ins_Excel(sid, 0, 0, s);
 
  }
 
  return 0;
 
}
 
 
{
 
  empty = "";  sid = empty;
 
  return 0;
 
}
 
 
/*
 
  m_Excel.Init(sid);
 
  m_Excel.str(9, 6, "deptname");
 
  //m_Excel.RunMacro(0, 0, "NextPage", "");
 
  m_Excel.num(8,  5, 789.20);
 
 
  m_Excel.BoldColumn(5);
 
  m_Excel.str(13, 6, "italic cell (13, 4)");
 
  m_Excel.FormatColumn(11, "m/d/yyyy");
 
  m_Excel.str(19, 11, "20.03.2008");
 
  m_Excel.str(20, 11, "22.04.2008");
 
 
  // установить ширину ячейки (row, col) равной w
 
  m_Excel.WidthColumn(11, 11);
 
  m_Excel.WidthColumn(12, 100);
 
  m_Excel.ColorRow(20, 5);
 
 
*/
 
 | 	 
  | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		NewAge
 
 
  Зарегистрирован: 11.06.2010 Сообщения: 110
 
  | 
		
			
				 Добавлено: Ср Апр 08, 2020 14:14    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				| Я конечно не спец по оракловому боссу, но тут прочитал, что z процедура сначала пишет все в таблицу и только по ее завершению уже формируется реальный файл. Тогда может в данном случае использовать две z процедуры. Одна для формирования файла. А в другой будет цикл по записям и запуск процедуры формирования файла с передачей параметров для формирования файла. | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		KruZer
 
 
  Зарегистрирован: 06.04.2020 Сообщения: 4
 
  | 
		
			
				 Добавлено: Чт Апр 09, 2020 12:32    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				Попробовал и такой вариант (раскидав на несколько процедур) - не получилось, выгрузился Excel с последними данными из цикла.. Такое ощущение, что он просто перезаписывал несколько раз файл.
 
Нашел альтернативный выход: сколько проходов имеется в цикле, столько раз копируется область шаблона с разрывом страницы на всех листах документа, после чего данные выводятся по своим листам и страницам на этих листах.
 
Другого выхода не нашел.. В несколько файлов отчет так и не смог выгрузить, только по разным листам данные раскидал..
 
Спасибо за помощь   | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		NewAge
 
 
  Зарегистрирован: 11.06.2010 Сообщения: 110
 
  | 
		
			
				 Добавлено: Пт Апр 10, 2020 10:50    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				А может еще в цикл для каждого файла устанавливать свое уникальное имя. Может это поможет.
 
 	  | Код: | 	 		  
 
// изменить имя формируемого файла xlsx
 
// имя должно быть абсолютным путём или же относительным к каталогу fcgi
 
// C:\BK\TEMP\kt\k52.xlsx или ..\..\TEMP\kt\k52.xlsx
 
function setFilename*(string val[]) {
 
  if (sid == empty) return Err0();
 
  if (xlsx && strlen(val) > 12) {
 
     string s[300];
 
     sput(s, "__SET_FILE_NAME__%200s", val);
 
     ins_Excel(sid, 0, 0, s);
 
  }
 
  return 0;
 
}
 
 | 	 
  | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		йцу
 
 
  Зарегистрирован: 28.01.2020 Сообщения: 4
 
  | 
		
			
				 Добавлено: Вт Апр 14, 2020 11:33    Заголовок сообщения:  | 
				     | 
			 
			
				
  | 
			 
			
				У меня была потребность формировать отчёты в отдельных документах, но в Word. Решила эту задачу с помощью запуска скрипта в цикле:
 
 
sput(strScript, "Application.ActiveDocument.SaveAs(\"%s\");", filename);
 
m_Word.VBScript(strScript);
 
 
В каждой итерации отчёт "сохраняется как" со своим именем.
 
 
Думаю, в Excel тоже можно попробовать решить задачу с помощью запуска скриптов VB. | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
	
	
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
  | 
   
 
		 |