07.02.2007, 16:15 | #1 |
Участник
|
экспорт в шаблон excel
Добрый день!
Знаю, что похожие вещи обсуждались на этом форуме много раз, но всё же... Есть шаблон MyTemplate.xlt (акт приема на хранение). В шаблоне есть некая шапка (с названием нашей компании), затем несколько столбцов в которые надо положить наши данные, затем несколько ячеек с итогом. Через ComExcelDocument_RU очень выводится очень медленно, хотелось бы побыстрей, но с сохранением форматирования, которое применяется в шаблоне. Что можете подсказать? |
|
07.02.2007, 16:21 | #2 |
Участник
|
Это типа использовали буфер обмена и медленно ??
|
|
07.02.2007, 16:33 | #3 |
Участник
|
Нет, буфер обмена не использовал. К сожалению, никак не могу понять, как добавлять в буфер обмена данные и потом их в эксель вставлять в несколько столбцов .
|
|
07.02.2007, 18:18 | #4 |
Участник
|
Цитата:
Код: textBuffer textBuffer = new TextBuffer(); str MyText; ; while select inventtable { MyText = inventtable.ItemId + num2char(9) // символ 9 - это табуляция для перехода в следующую колонку + inventtable.ItemName + num2char(9) + "\n"; // это перевод строки textbuffer.appendText(MyText); } file.InsertText("A2", textBuffer); // вставляем буфер начиная с ячейки А2 |
|
|
За это сообщение автора поблагодарили: Dimk (1). |
07.02.2007, 18:53 | #5 |
Moderator
|
Цитата:
P.S. Да, и текстовое значение "000333" после вставки останется текстовым значением "000333", не превратившись в число 333. |
|
|
За это сообщение автора поблагодарили: Dimk (1). |
08.02.2007, 11:03 | #6 |
Участник
|
всем спасибо, буду разбираться дальше
|
|
10.02.2007, 12:03 | #7 |
Участник
|
Цитата:
X++: #define.ReportTemplateName ('ReportTemplate.xlt') // нзвания полей - заголовков табличной части шаблона и названия колонок в RecordSet #define.fldAccountNum ('AccountNum') #define.fldTransDate ('TransDate') #define.fldDocumentDesc ('DocumentDesc') #define.fldAmount ('LineAmount') // названия полей в шапке шаблона #define.fldHdrLine1 ('headerLine1') #define.fldHdrLine2 ('headerLine2') #define.fldHdrLine3 ('headerLine3') // название ячейки, откуда будет начат вывод строк #define.fldReportLines ('reportLines') // экземпляр Uni_ReportChannelExcel, созданный на клиенте и переданный отчету Uni_ReportChannel repChannel; // ... { Map mapReport; real nLine; // номер строки данных отчета в Map - вдруг диапазона int не хватит... void outputReportHeader() { UserInfo userInfo; ; repChannel.initReportChannel(#ReportTemplatePath_RU + #ReportTemplateName); select firstonly name from userInfo where userInfo.id == curuserid(); repChannel.insertReportValue(#fldHdrLine1, this.reportTitle()); repChannel.insertReportValue(#fldHdrLine2, strfmt("@DIS10758", currencyCode)); repChannel.insertReportValue(#fldHdrLine3, strfmt("Отчет сформирован: %1 %2, пользователь: %3", today(), time2str(timenow(),0,0), userInfo.name)); repChannel.insertReportValue(#fldAccountNum,"@DIS8614"); // и т.д. - вставка полей шапки отчета } void outputReportBody() {; repChannel.outputReportBody(mapReport.pack(), #fldReportLines); } void outputReportFooter() {; // вставка итоговых полей отчета // освобождение используемых COM-объектов repChannel.finalize(); } void dumpReportStr(str _p1, TransDate _p2, str _p3, Amount _p4) {; mapReport.insert(nLine,[_p1, // #fldAccountNum _p2, // #fldTransDate _p3, // #fldDocumentDesc _p4]); // #fldAmount nLine++; } void initReportStruct() { #CCADO Array arrFields = new Array(Types::Container); int i = 1; ; arrFields.value(i, [#fldAccountNum, #adBSTR] ); i++; arrFields.value(i, [#fldTransDate, #adDBDate]); i++; arrFields.value(i, [#fldDocumentDesc, #adBSTR] ); i++; arrFields.value(i, [#fldAmount, #adDouble]); repChannel.initReportBuffer(arrFields.pack()); } ; // поехали... initReportStruct(); mapReport = new Map(Types::Real, Types::Container); nLine = 1.0; while select * from tmpTbl order by TransDate { // подготовка данных к выводу и... dumpReportStr(tmpTbl.AccountNum, tmpTbl.TransDate, tmpTbl.DocDesc, tmpTable.Amount); } // вывод в Excel outputReportHeader(); outputReportBody(); outputReportFooter(); } |
|
|
За это сообщение автора поблагодарили: aidsua (1), Gustav (9). |
12.02.2007, 05:23 | #8 |
Участник
|
См. также http://axapta.mazzy.ru/lib/direct_sql/
|
|
|
За это сообщение автора поблагодарили: Dimk (1). |
29.04.2009, 13:05 | #9 |
Участник
|
Поскольку задача вывода отчетов в Excel все-таки возникает достаточно часто, предыдущие наработки были доведены до ума, в результате чего "канал вывода в Excel" стал более функциональным, а кроме того, появился некий скелет отчета, собирающего данные на сервере и затем использующего этот канал вывода для создания Excel-файла на клиенте, в т.ч. на несколько листов.
Одной из "заковырок" вывода данных в Excel через ADO.Recordset является возникающая порой необходимость как-то избавиться от "незначащих" значений (в основном нулей и дат datenull()) - эта задача и возможные решения, в частности, обсуждаются в исходной теме, благодаря которой и появились эти классы. В доработанном классе вывода в Excel эта задача также была решена, правда, несколько иначе: при необходимости в той или иной колонке табличных данных производится замена средствами самого Excel "незначащих" значений на то, что возвращает COMVariant::createNoValue(). PS. Проект приведен для DAX3 |
|
|
За это сообщение автора поблагодарили: NataLee (1), Roman N. Krivov (1). |
29.04.2009, 18:11 | #10 |
Moderator
|
Ах, какой я себе кусочек лакомый нашёл в методе clearEmptyCells
X++: // формируем адрес диапазона ячеек *относительно* _cell strAddr = ComExceldocument_RU::numToNameCell( n, 1 ); if (cnRows > 1) strAddr += @':' + ComExceldocument_RU::numToNameCell( n, cnRows ); oRng = _cell.range( strAddr ); // получаем столбец внутри диапазона _cell oRng.Replace( cvSrcValue, cvDstValue, #xlWhole, #xlByColumns ); X++: // получаем столбец внутри диапазона _cell: // Шаг 1. выбираем n-й столбец по первой строке ("координата X") // Шаг 2. воображаем этот столбец вниз на cnRows строк ("координата Y") oRng = _cell.offset( 0, n-1 ); // Шаг 1. oRng = oRng.resize( cnRows, 1 ); // Шаг 2. oRng.Replace( cvSrcValue, cvDstValue, #xlWhole, #xlByColumns ); |
|
|
За это сообщение автора поблагодарили: gl00mie (3). |
Теги |
ax3.0, excel, законченный пример, отчет, экспорт, экспорт в excel, шаблон |
|
|