Независимый форум, посвященный системе БОСС-Кадровик и всему, что с ней связано
|
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 Сообщения: 108
|
Добавлено: Вт Апр 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 Сообщения: 108
|
Добавлено: Ср Апр 08, 2020 14:14 Заголовок сообщения: |
|
|
Я конечно не спец по оракловому боссу, но тут прочитал, что z процедура сначала пишет все в таблицу и только по ее завершению уже формируется реальный файл. Тогда может в данном случае использовать две z процедуры. Одна для формирования файла. А в другой будет цикл по записям и запуск процедуры формирования файла с передачей параметров для формирования файла. |
|
Вернуться к началу |
|
|
KruZer
Зарегистрирован: 06.04.2020 Сообщения: 4
|
Добавлено: Чт Апр 09, 2020 12:32 Заголовок сообщения: |
|
|
Попробовал и такой вариант (раскидав на несколько процедур) - не получилось, выгрузился Excel с последними данными из цикла.. Такое ощущение, что он просто перезаписывал несколько раз файл.
Нашел альтернативный выход: сколько проходов имеется в цикле, столько раз копируется область шаблона с разрывом страницы на всех листах документа, после чего данные выводятся по своим листам и страницам на этих листах.
Другого выхода не нашел.. В несколько файлов отчет так и не смог выгрузить, только по разным листам данные раскидал..
Спасибо за помощь |
|
Вернуться к началу |
|
|
NewAge
Зарегистрирован: 11.06.2010 Сообщения: 108
|
Добавлено: Пт Апр 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. |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|