Участник
|
Продолжим
Выгрузка в текстовый файл с последующей загрузкой в Excel
В кач-ве особенности - в книге Excel создается макрос для загрузки текстового файла с помощью функции OpenText. Затем этот макрос запускается и происходит открытие этого файла с учетом типов данных в столбцах.
Почему такой путь - для передачи типов данных в столбцах функция требует передачи в кач-ве одного из параметров массива массивов. К сожалению, не знаю как это организовать в Axapta без привлечения сторонних средств
Время полета - 20 с
PS Для того, что бы этот код выполнился, необходимо включить в Excel параметр "Доверять доступ к Visual Basic Project" в форме управления безопасностью макросов
Еще информация по этой теме
Axapta программирует Excel на VBA
X++: static void ExportExcelTXT(Args _args)
{
LedgerTrans ledgerTrans;
LedgerTable ledgerTable;
int timeFullStart, timeFullFinish, timeFullTotal;
int cnt = 0;
str Buf, s;
ComExcelDocument_Ru excel;
COM doc;
COM app;
TextBuffer tb;
COM Workbook;
COM prj;
COM comp;
COM module;
COM code;
Array fields;
#define.vbext_ct_StdModule(1)
#define.fileName("d:\\temp\\demo.txt")
void AddField(int fldNum, TableId tbl, FieldId fld)
{
DictField dictField;
Array field;
#define.xlGeneralFormat(0x00000001)
#define.xlTextFormat(0x00000002)
#define.xlMDYFormat(0x00000003)
#define.xlDMYFormat(0x00000004)
#define.xlYMDFormat(0x00000005)
#define.xlMYDFormat(0x00000006)
#define.xlDYMFormat(0x00000007)
#define.xlYDMFormat(0x00000008)
#define.xlSkipColumn(0x00000009)
;
if (!fields)
fields = new Array(Types::Class);
dictField = new dictField( tbl, fld );
field = new Array(Types::Integer);
field.value(1, fldNum);
if (dictField)
{
switch (dictField.baseType())
{
case Types::Date:
field.value(2, #xlDMYFormat);
break;
case Types::Enum, Types::String:
field.value(2, #xlTextFormat);
break;
default:
field.value(2, #xlGeneralFormat);
}
}
else
field.value(2, #xlGeneralFormat);
fields.value((fields.lastIndex()+1), field);
}
str getFields()
{
str ret = "";
int i;
Array field;
;
if (!fields) return "";
for (i=1; i<= fields.lastIndex(); i++)
{
field = fields.value(i);
if (field)
ret += (ret ? ", " : "") + strfmt("Array(%1,%2)", field.value(1), field.value(2));
}
if (ret)
return "FieldInfo:=Array(" + ret + "), ";
return "";
}
// засекаем время
timeFullStart = timenow();
excel = new ComExcelDocument_Ru();
excel.newFile("", false);
doc = excel.getComDocument();
app = doc.application();
buf = "RecId\tAccountNum\tAccountName\tAccountPlType\tBondBatchTrans_RU\tBondBatch_RU\tTransDate\tTxt\tAmountMST\tCrediting\n";
cnt++;
while select ledgerTrans
join ledgerTable
where ledgerTrans.AccountNum == ledgerTable.AccountNum
&& ledgerTrans.TransDate >= str2date('dd.mm.yy',123) && ledgerTrans.TransDate <= str2date('DD.MM.YY',123)
{
// 10 полей
buf +=
strfmt(
"%1\t%2\t%3\t%4\t%5\t%6\t%7\t%8\t%9\t%10\n",
ledgerTrans.RecId, ledgerTrans.AccountNum, ledgerTable.AccountName, ledgerTable.AccountPlType,
ledgerTrans.BondBatchTrans_RU, ledgerTrans.BondBatch_RU,
date2str(ledgerTrans.TransDate, 123, 2, 2, 2, 2, 4), ledgerTrans.Txt,
strltrim(strrem(num2str(ledgerTrans.AmountMST, 10, 2, 2, 3), "+")), ledgerTrans.Crediting);
cnt++;
if (cnt >=65000) break;
}
tb = new TextBuffer();
tb.setText(buf);
tb.toFile(#fileName);
Workbook = app.ActiveWorkbook();
prj = Workbook.VBProject();
comp = prj.VBComponents();
comp.add(#vbext_ct_StdModule);
module = comp.item(comp.count());
code = module.CodeModule();
addField( 1, ledgerTrans.TableId, fieldnum(ledgerTrans, RecId));
addField( 2, ledgerTrans.TableId, fieldnum(ledgerTrans, AccountNum));
addField( 3, ledgerTable.TableId, fieldnum(ledgerTable, AccountName));
addField( 4, ledgerTable.TableId, fieldnum(ledgerTable, AccountPlType));
addField( 5, ledgerTrans.TableId, fieldnum(ledgerTrans, BondBatchTrans_RU));
addField( 6, ledgerTrans.TableId, fieldnum(ledgerTrans, BondBatch_RU));
addField( 7, ledgerTrans.TableId, fieldnum(ledgerTrans, TransDate));
addField( 8, ledgerTrans.TableId, fieldnum(ledgerTrans, Txt));
addField( 9, ledgerTrans.TableId, fieldnum(ledgerTrans, AmountMST));
addField(10, ledgerTrans.TableId, fieldnum(ledgerTrans, Crediting));
s = strfmt( "sub OpenDemo()\n" +
" Workbooks.OpenText Filename:=\"%1\", Origin:=1251, StartRow:= 1, _\n" +
" DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Tab:=True, _\n" +
" %2TrailingMinusNumbers:=True, _\n" +
" DecimalSeparator:=\",\", ThousandsSeparator:=\" \"\n" +
"End Sub", #fileName, getFields());
code.addFromString(s);
app.Run(strfmt("%1.OpenDemo", module.name()));
App.DisplayAlerts(false);
Workbook.Close();
App.DisplayAlerts(true);
excel.visible(true);
timeFullFinish = timenow();
timeFullTotal = timeFullFinish - timeFullStart;
info('Время выполнения, сек');
info(int2str(timeFullTotal));
}
__________________
Axapta v.3.0 sp5 kr2
Последний раз редактировалось AndyD; 20.06.2006 в 14:25.
|