я не сошёл с ума и не славы ради, а токмо пользы для не читающих по-английски для и с благословления вышестоящей инстанции пишу опять
то же самое здесь, но уже по-русски.
Порой бывает нужно на скорую руку посмотреть перевод какой-то метки на другой язык, а иногда полезно получить все метки с заданного слоя, например, USR, на котором мы вели разработку во время проекта.
Следующий скрипт выгружает все метки на заданных языках с заданного слоя в Excel.
Для его создания я воспользовался двумя примерами кода с нашего форума:
Нахождение всех неиспользуемых меток
ADODB.Recordset в оперативной памяти без связи с БД
Сначала вычисляется общее количество выгружаемых меток, затем отображается окно хода выполнения, и в конце концов открывается файл Excel, сохраняемый под именем вида Labels from "+#LayerId+ " in "+#English+", "+#French+", "+#Russian+".xls".
В данном конкретном случае выгружаются метки на указанных выше трёх языках из слоя SYS, но вы легко можете изменить их под свои нужды.
X++:
static void SisPrintAllLabelsOnGivenLanguages(Args _args)
{
// needed layer
#define.LayerId("SYS")
// all needed languages
#define.English("en-us")
#define.French("fr-ca")
#define.Russian("ru")
// label classes
Label lEn = new Label(#English);
Label lFr = new Label(#French);
Label lRu = new Label(#Russian);
// start looking every label
str 250 lId;
int totalLabels;
RunbaseProgress progress;
#macrolib.AviFiles
//Excel variables section
COM rstAxa = new COM('ADODB.Recordset'); // ADO: Recordset
COM flds = rstAxa.Fields();
COM fld;
#define.LabelId("LabelId")
COM xlApp;
COM wbks, wbk;
COM wkss, wks;
COM rng, cell, rngCR;
COM font;
COM entCol;
COM actWin;
int i, iMax;
;
print("@SYS34745");
// start looking every label
lId = lEn.searchFirst('');
while (lId)
{
if (lEn.moduleId(lId) == #LayerId) // The particular label file
{
// count labels
totalLabels++;
}
lId = lEn.searchNext();
}
print(strfmt("%1 = %2", "@SYS54695", totalLabels));
print("@SYS76178");
if (totalLabels<=0)
return;
progress = RunbaseProgress::construct(1,null);
progress.setCaption("@SYS76178");
progress.setTotal(totalLabels);
progress.setAnimation(#AviPrint);
// <--- create excel fields in a worksheet
flds.Append(#LabelId, 8);
flds.Append(#English, 8);
flds.Append(#French, 8);
flds.Append(#Russian, 8);
rstAxa.Open();
xlApp = new COM('Excel.Application');
xlApp.Visible(false);
wbks = xlApp.Workbooks();
wbk = wbks.Add();
wkss = wbk.Worksheets();
wks = wkss.Item(1);
wks.Name("Labels");
rng = wks.Range('A1');
flds = rstAxa.Fields();
iMax = flds.Count() - 1;
for (i = 0; i <= iMax; i += 1)
{
fld = flds.Item(i);
cell = rng.Offset(0, i);
cell.Value2(fld.Name());
}
rngCR = rng.CurrentRegion();
font = rngCR.Font();
font.Bold(true);
cell = rng.Offset(1, 0);
// <--- end of creating of excel fields in a worksheet
lId = lEn.searchFirst('');
while (lId)
{
if (lEn.moduleId(lId) == #LayerId) // The particular label file
{
// print to excel
progress.incCount();
rstAxa.AddNew();
fld = flds.Item(#LabelId); fld.Value(lId);
fld = flds.Item(#English); fld.Value(lEn.extractString(lId));
fld = flds.Item(#French); fld.Value(lFr.extractString(lId));
fld = flds.Item(#Russian); fld.Value(lRu.extractString(lId));
rstAxa.Update();
}
lId = lEn.searchNext();
}
cell.CopyFromRecordset(rstAxa);
progress.kill();
// format excel worksheet
rngCR = rng.CurrentRegion();
entCol = rngCR.EntireColumn();
entCol.AutoFit();
cell.Select();
actWin = xlApp.ActiveWindow();
actWin.FreezePanes(true);
rstAxa.Close();
xlApp.Visible(true);
wbk.SaveAs("Labels from "+#LayerId+ " in "+#English+", "+#French+", "+#Russian+".xls");
}