AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.05.2007, 12:13   #1  
vasiliy is offline
vasiliy
Программер
 
288 / 17 (1) ++
Регистрация: 21.10.2004
Адрес: E-burg
? Как определить конец страницы в Excel
В Excel выгружается куча строк, при печати соответственно все это дело разбивается на страницы. Как при выгрузке можно определить что достигнут конец страницы? Высота строк может быть разной, поэтому простой подсчет не подходит.
Заранее спасибо.
Старый 02.05.2007, 12:20   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
если это нужно для того, чтобы вывести что-то в нижнем углу каждой страницы, так там (в Excel) для этого есть специальная опция/настройка. Правда не подскажу, как до нее добраться.
Старый 02.05.2007, 12:29   #3  
vasiliy is offline
vasiliy
Программер
 
288 / 17 (1) ++
Регистрация: 21.10.2004
Адрес: E-burg
Нужно итог выводить постраничный
Старый 02.05.2007, 12:38   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от vasiliy Посмотреть сообщение
Нужно итог выводить постраничный
мда, геморрная, конечно, задачка... когда-то я нечто подобное советовал для Word - попробуйте применить по аналогии, вдруг получится: Победить Word - отследить переход страницы.

P.S. Некоторая неприятность заключается в том, что у Excel я не нашёл такого простенького способа определения страниц, как через ComputeStatistics в Ворде. Но можно попробовать следить за кол-вом HPageBreaks на текущем листе после вывода очередной строки данных. Если увеличилось на 1, значит произошёл переход на следующую страницу.
Старый 02.05.2007, 13:08   #5  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Gustav Посмотреть сообщение
Некоторая неприятность заключается в том, что у Excel я не нашёл такого простенького способа определения страниц, как через ComputeStatistics в Ворде.
Вот такая компактная "полухакерская" конструкция возвращает текущее кол-во страниц в Excel на текущем sheet'е:
X++:
COM xlApp;      // Excel.Application
COMVariant cv;
....................................
// кол-во страниц на текущем (активном) рабочем листе Excel
cv = xlApp.ExecuteExcel4Macro('GET.DOCUMENT(50)');
info( strfmt('%1', cv.double()) );
Ну и теперь, собственно, можно применить "вордовый подход", о котором я говорю выше.

Последний раз редактировалось Gustav; 02.05.2007 в 15:04. Причина: исправил: кол-во страниц возвращается же в виде COMVariant ! Семен Семёныч...
Старый 02.05.2007, 12:59   #6  
3oppo is offline
3oppo
Участник
Аватар для 3oppo
 
222 / 32 (2) +++
Регистрация: 30.06.2005
Цитата:
Сообщение от vasiliy Посмотреть сообщение
......
Высота строк может быть разной, поэтому простой подсчет не подходит.
.....
Используй сложный подсчёт! Сам так делал.
Старый 02.05.2007, 13:17   #7  
vasiliy is offline
vasiliy
Программер
 
288 / 17 (1) ++
Регистрация: 21.10.2004
Адрес: E-burg
А что за функция ExecuteExcel4Macro?
Старый 02.05.2007, 13:21   #8  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от vasiliy Посмотреть сообщение
А что за функция ExecuteExcel4Macro?
Ну, это в хелпе по Excel VBA можно почитать. Запускает макрофункции Excel версии 4. Иногда в этих аналах истории встречаются полезные вещи.

Чтобы было не страшно пользоваться конструкцией, которую я привел, вот выдержка из хелпа (что это не "палёнка" ):

Цитата:
Сообщение от Microsoft Excel 4.0 Macro Functions
GET.DOCUMENT

Returns information about a sheet in a workbook.

Syntax

GET.DOCUMENT(type_num , name_text)

Type_num is a number that specifies what type of information you want. The following lists show the possible values of type_num and the corresponding results.

Type_num -- Returns
50 -- The total number of pages that would be printed based on current settings, excluding notes, or 1 if the document is a chart.

Name_text is the name of an open workbook. If name_text is omitted, it is assumed to be the active workbook.
Читая эту цитату, необходимо иметь в виду, что "workbook" в версии 4.0 это фактически то, что сейчас "worksheet". Давным-давно в одном файле Excel был только один рабочий лист.
Старый 02.05.2007, 13:38   #9  
vasiliy is offline
vasiliy
Программер
 
288 / 17 (1) ++
Регистрация: 21.10.2004
Адрес: E-burg
А как добраться до ExecuteExcel4Macro из ComEcelDocument_RU? Что-то у меня куда его ни приставь все ошибка вылетает, мол неверная функция
Старый 02.05.2007, 13:52   #10  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от vasiliy Посмотреть сообщение
Что-то у меня куда его ни приставь все ошибка вылетает, мол неверная функция
Приставьте его к m_comApplication. И учтите, что будет возвращаться COMVariant. Сорри, это я немного лажанул выше - уже исправил.
Старый 02.05.2007, 13:58   #11  
vasiliy is offline
vasiliy
Программер
 
288 / 17 (1) ++
Регистрация: 21.10.2004
Адрес: E-burg
Сработало. Только почему то возвращает всегда одно и то же число "-2146826259" %)
Старый 02.05.2007, 14:02   #12  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
А покажите весь метод?
Старый 02.05.2007, 14:15   #13  
vasiliy is offline
vasiliy
Программер
 
288 / 17 (1) ++
Регистрация: 21.10.2004
Адрес: E-burg
X++:
    RNumDateInWordConverter converter = new RNumDateInWordConverter("ru"); //direct setup "ru" for external templates
    com comapp, comapp2;
    COMVariant cv;
    ;
    if (this.makeDocument())
    {
         .......
        rowCount = 0;
        while select assetInventoryTrans
            where assetInventoryTrans.InventoryTableRecId == assetInventoryTable.RecId &&
                  assetInventoryTrans.assetStandardId     == assetStandardId
        {
            assetTable = RAssetTable::find(assetInventoryTrans.AccountNum);
            rowCount++;
            excellDocument.insertRow(j);
            excellDocument.insertValue(ComExcelDocument_RU::numToNameCell(1, j), rowCount);
            ........
            j++;
            comapp = excellDocument.getComDocument();//.Application();
            comapp2 = comapp.application();
            cv = comapp2.ExecuteExcel4Macro('GET.DOCUMENT(50)');
            info( strfmt("%1", cv.char() ));
        }
        excellDocument.deleteRow(40);
        excellDocument.deleteRow(40 + rowCount);
        excellDocument.insertValue(ComExcelDocument_RU::numToNameCell(4, 43 + rowCount), converter.numeralsToTxt(rowCount));
        excellDocument.insertValue(ComExcelDocument_RU::numToNameCell(9, 62 + rowCount), rowCount);
        excellDocument.visible(true);
    }
}
Часть кода упустил. Это стандартный отчет Инвентаризация ОС, полный код можно посмотреть в классе \Classes\RAssetInventoryToExcell.
Старый 02.05.2007, 14:25   #14  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Оператору info( strfmt("%1", cv.char() )); - отказать! И даже моему cv.int() - тоже... (уф!пошёл исправлять выше)

А вот cv.double() - пойдёт как надо!

Потому что если мы посмотрим на конец строки, возвращаемой cv.toString(), то увидим там VT_R8, что и есть double.
Старый 02.05.2007, 14:41   #15  
vasiliy is offline
vasiliy
Программер
 
288 / 17 (1) ++
Регистрация: 21.10.2004
Адрес: E-burg
Все равно значение не изменяется. Может надо выставлять ориентацию листа вдобавок?
Старый 02.05.2007, 14:56   #16  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от vasiliy Посмотреть сообщение
Все равно значение не изменяется. Может надо выставлять ориентацию листа вдобавок?
С какого значения значение не меняется? Я посмотрел: сам пустой шаблон AssetInventory.XLT содержит 3 страницы. Причем строки выводятся вставкой во вторую страницу, смещая вниз элементы, расположенные ниже (сорри за тавтологию). Какой момент окончания заполнения мы ищем? Когда по нашей формуле с GET.DOCUMENT страниц станет не 3, а 4?

КСТАТИ! А у Вас этот лист является активным?! Если нет, то надо сделать ему где-нибудь Select !
Старый 02.05.2007, 15:13   #17  
vasiliy is offline
vasiliy
Программер
 
288 / 17 (1) ++
Регистрация: 21.10.2004
Адрес: E-burg
Аксаптой клянусь. 0 выводится
Зато объект HPageBreaks правду говорит. 6 страниц отчета.
Старый 02.05.2007, 15:16   #18  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
C cv.double() ноль выводится?! Какая версия Аксапты?

Если с cv.double() выводится 0, то фокус стоит на каком-то абсолютно пустом листе, возможно, в другой рабочей книге.

Собственно, конечно, с HPageBreaks мы и начали. Если оно подходит, так можно и закончить на этом. Я не настаиваю именно на версии с GET.DOCUMENT. Единственное, что имейте в виду, что в этом шаблоне страницы в исходном виде - "двойные", и поэтому после 6 пойдет сразу 8, а не 7. Можно полечить, приведя к начальным 3, дав шаблону ручную команду "Файл - Параметры страницы - Разместить не более чем на 1 стр. в ширину".
Старый 02.05.2007, 15:33   #19  
vasiliy is offline
vasiliy
Программер
 
288 / 17 (1) ++
Регистрация: 21.10.2004
Адрес: E-burg
Аксапта 3.0 сп3. Фокус никуда вроде специально не подставляется.
Старый 02.05.2007, 15:36   #20  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
ок, см. выше.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
[Excel] - Несколько версий Excel на машине клиента Андре DAX: Программирование 11 07.08.2007 13:45
Вызов Item() для коллекций Excel Владимир Максимов DAX: Программирование 15 17.08.2006 19:47
Параметры страницы Excel через COM Sada DAX: Программирование 3 18.05.2006 10:30
Разрыв страницы в Excel Plushy DAX: Программирование 11 14.12.2005 09:39

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 10:12.