|
![]() |
#1 |
Участник
|
Не слушайте его. Он все врет.
В общем моя ошибка - пропустил один из параметров, в результате Range передавался не как FieldInfo, а как OtherChar. ![]() Время выгрузки - 20с X++: static void ExportExcelTXT1(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 Workbooks; Array fields; Com sheet; Com range; str leftBrace; str rightBrace; str columnSeparator; str rowSeparator; #define.xlDelimited(0x00000001) #define.xlDoubleQuote(0x00000001) #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("%1 ", rowSeparator) : "") + strfmt("%1%3%2", field.value(1), field.value(2), columnSeparator); } return ret; } void ArrayLocal(COM xlApp) { COMVariant var; str alternateArraySeparator; str decimalSeparator; #define.xlDecimalSeparator(0x00000003) #define.xlLeftBrace(0x0000000C) #define.xlRightBrace(0x0000000D) #define.xlColumnSeparator(0x0000000E) #define.xlRowSeparator(0x0000000F) #define.xlAlternateArraySeparator(0x00000010) ; if (!xlApp) { leftBrace = "{"; rightBrace = "}"; columnSeparator = ";"; rowSeparator = ":"; return; } var = xlApp.International(#xlDecimalSeparator); if (var) decimalSeparator = var.bStr(); else decimalSeparator = ","; var = xlApp.International(#xlLeftBrace); if (var) leftBrace = var.bStr(); else leftBrace = "{"; var = xlApp.International(#xlRightBrace); if (var) rightBrace = var.bStr(); else rightBrace = "}"; var = xlApp.International(#xlColumnSeparator); if (var) columnSeparator = var.bStr(); else columnSeparator = ";"; var = xlApp.International(#xlRowSeparator); if (var) rowSeparator = var.bStr(); else rowSeparator = ":"; var = xlApp.International(#xlAlternateArraySeparator); if (var) alternateArraySeparator = var.bStr(); else alternateArraySeparator = "&"; columnSeparator = (columnSeparator == decimalSeparator ? alternateArraySeparator : columnSeparator); rowSeparator = (rowSeparator == decimalSeparator ? alternateArraySeparator : rowSeparator); } // засекаем время timeFullStart = timenow(); excel = new ComExcelDocument_Ru(); excel.newFile("", false); doc = excel.getComDocument(); app = doc.application(); ArrayLocal(app); 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); 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)); Workbook = app.ActiveWorkbook(); sheet = app.ActiveSheet(); range = sheet.range("A1:B10"); s = strfmt("=%1%3%2", leftBrace, rightBrace, getFields()); range.FormulaArray(s); Workbooks = app.Workbooks(); Workbooks.OpenText(#fileName, COMVariant::createFromInt(1251), 1, #xlDelimited, #xlDoubleQuote, False, True, False, False, False, False, "", range, True, ",", " "); 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; 22.06.2006 в 17:26. |
|
|
За это сообщение автора поблагодарили: NataLee (1). |
![]() |
#2 |
Moderator
|
Цитата:
Сообщение от AndyD
Не слушайте его. Он все врет.
![]() Ага, я сам тоже поковырялся, и ТОЖЕ в процессе сначала пропустил параметр и почти расстроился... Потом стал считать параметры, загибая пальцы... Прикладываю свою простенькую процедурку, которая только открывает и чуть форматирует ранее сформированный файл: X++: static void Test_OpenText_FormulaArray(Args _args) { COM xlApp; COM rng; COM wbks, wbk; COM wkss, wks; ; xlApp = new COM('Excel.Application'); xlApp.Visible(true); wbks = xlApp.Workbooks(); wbk = wbks.Add(); wkss = wbk.Worksheets(); wks = wkss.Item(1); rng = wks.Range('A1', 'B10'); rng.FormulaArray(@'={1\1;2\2;3\2;4\2;5\2;6\1;7\1;8\1;9\1;10\1}'); wbks.OpenText ( 'C:\\demo.txt', //FileName 1251, // Origin, 1, // StartRow, 1, // DataType 1, // TextQualifier false, // ConsecutiveDelimiter, true, // Tab, false, // Semicolon, false, // Comma, false, // Space, false, // Other, '', // OtherChar, rng // FieldInfo ); } |
|
![]() |
#3 |
Moderator
|
Остается как-то взять под контроль сепараторы колонок и строк массива...
X++: //у меня работает вот так rng.FormulaArray(@'={1\1; 2\2; 3\2; 4\2; 5\2; 6\1; 7\1; 8\1; 9\1; 10\1}'); //и НЕ работает вот так: rng.FormulaArray(@'={1;1: 2;2: 3;2: 4;2: 5;2: 6;1: 7;1: 8;1: 9;1: 10;1}'); |
|
Теги |
benchmark, download, excel, faq, xml, законченный пример, производительность, экспорт/импорт |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|