02.05.2007, 12:13 | #1 |
Программер
|
Как определить конец страницы в Excel
В Excel выгружается куча строк, при печати соответственно все это дело разбивается на страницы. Как при выгрузке можно определить что достигнут конец страницы? Высота строк может быть разной, поэтому простой подсчет не подходит.
Заранее спасибо. |
|
02.05.2007, 12:20 | #2 |
Участник
|
если это нужно для того, чтобы вывести что-то в нижнем углу каждой страницы, так там (в Excel) для этого есть специальная опция/настройка. Правда не подскажу, как до нее добраться.
|
|
02.05.2007, 12:29 | #3 |
Программер
|
Нужно итог выводить постраничный
|
|
02.05.2007, 12:38 | #4 |
Moderator
|
мда, геморрная, конечно, задачка... когда-то я нечто подобное советовал для Word - попробуйте применить по аналогии, вдруг получится: Победить Word - отследить переход страницы.
P.S. Некоторая неприятность заключается в том, что у Excel я не нашёл такого простенького способа определения страниц, как через ComputeStatistics в Ворде. Но можно попробовать следить за кол-вом HPageBreaks на текущем листе после вывода очередной строки данных. Если увеличилось на 1, значит произошёл переход на следующую страницу. |
|
02.05.2007, 12:59 | #5 |
Участник
|
Используй сложный подсчёт! Сам так делал.
__________________
PS. Сложно приехать в Москву, но ещё сложнее уехать отсюда. |
|
02.05.2007, 13:08 | #6 |
Moderator
|
Цитата:
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, 13:17 | #7 |
Программер
|
А что за функция ExecuteExcel4Macro?
|
|
02.05.2007, 13:21 | #8 |
Moderator
|
Ну, это в хелпе по 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. |
|
02.05.2007, 13:38 | #9 |
Программер
|
А как добраться до ExecuteExcel4Macro из ComEcelDocument_RU? Что-то у меня куда его ни приставь все ошибка вылетает, мол неверная функция
|
|
02.05.2007, 13:52 | #10 |
Moderator
|
|
|
02.05.2007, 13:58 | #11 |
Программер
|
Сработало. Только почему то возвращает всегда одно и то же число "-2146826259" %)
|
|
02.05.2007, 14:02 | #12 |
Moderator
|
А покажите весь метод?
|
|
02.05.2007, 14:15 | #13 |
Программер
|
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); } } |
|
02.05.2007, 14:25 | #14 |
Moderator
|
Оператору info( strfmt("%1", cv.char() )); - отказать! И даже моему cv.int() - тоже... (уф!пошёл исправлять выше)
А вот cv.double() - пойдёт как надо! Потому что если мы посмотрим на конец строки, возвращаемой cv.toString(), то увидим там VT_R8, что и есть double. |
|
02.05.2007, 14:41 | #15 |
Программер
|
Все равно значение не изменяется. Может надо выставлять ориентацию листа вдобавок?
|
|
02.05.2007, 14:56 | #16 |
Moderator
|
Цитата:
КСТАТИ! А у Вас этот лист является активным?! Если нет, то надо сделать ему где-нибудь Select ! |
|
02.05.2007, 15:13 | #17 |
Программер
|
Аксаптой клянусь. 0 выводится
Зато объект HPageBreaks правду говорит. 6 страниц отчета. |
|
02.05.2007, 15:16 | #18 |
Moderator
|
C cv.double() ноль выводится?! Какая версия Аксапты?
Если с cv.double() выводится 0, то фокус стоит на каком-то абсолютно пустом листе, возможно, в другой рабочей книге. Собственно, конечно, с HPageBreaks мы и начали. Если оно подходит, так можно и закончить на этом. Я не настаиваю именно на версии с GET.DOCUMENT. Единственное, что имейте в виду, что в этом шаблоне страницы в исходном виде - "двойные", и поэтому после 6 пойдет сразу 8, а не 7. Можно полечить, приведя к начальным 3, дав шаблону ручную команду "Файл - Параметры страницы - Разместить не более чем на 1 стр. в ширину". |
|
02.05.2007, 15:33 | #19 |
Программер
|
Аксапта 3.0 сп3. Фокус никуда вроде специально не подставляется.
|
|
02.05.2007, 15:36 | #20 |
Moderator
|
ок, см. выше.
|
|