Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Принудительный разрыв страницы в POI / 17 сообщений из 17, страница 1 из 1
28.09.2012, 15:57:18
    #37976187
m77
m77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный разрыв страницы в POI
Нужно сделать принудительное разбиение документа по листам. Почему-то туплю и не могу никак найти. Подскажите, пожалуйста!
...
Рейтинг: 0 / 0
28.09.2012, 20:15:11
    #37976558
Alexey Kuznetsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный разрыв страницы в POI
m77,

так?
...
Рейтинг: 0 / 0
01.10.2012, 12:15:10
    #37978235
m77
m77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный разрыв страницы в POI
Alexey Kuznetsov,
Спасибо. Не сразу заметил ответ, поэтому среагировал только сейчас...

Насколько я въехал - там не совсем то. Мне нужно самому разорвать страницу в нужном месте, отключив экселевскую разбивку по страницам.

Задача в общем-то такая: у меня отчеты в php, но часть отчетов - из десктопного комплекса. Нужно выводить запрос+заголовки столбцов в эксель. Все это сделано, но возникла еще стандартная задача - разбивка в нужном месте листа, нумерация страниц, шапка на каждом листе и и т.д., т.п.

Как это делается в дельфях, например, я хорошо знал, хотя теперь смутно помню, но как это все перевести на джаву - чего-то никак не соображу. То есть просто нужен конкретный оператор, а я не соображу какой. Задача не первоочередная, но в очереди стоит...
...
Рейтинг: 0 / 0
01.10.2012, 12:34:22
    #37978282
m77
m77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный разрыв страницы в POI
Насколько я понял sheet.setAutobreaks не разрывает страницу, а просто отключает автоматическую экселевскую разбивку по страницам.

А мне нужно не просто отключить разбивку экселя, но и "включить" свою. Как я помню, далее нужно отслеживать "пиксельную высоту" строк ( суммируя row.getHeight()) и в нужном месте вставлять разрыв.

Вобщем, задача-то стандартная, но чего-то не могу быстро найти и попутно пока решаю еще 4-5 задач...

Никто не поможет?
...
Рейтинг: 0 / 0
01.10.2012, 15:49:13
    #37978757
Alexey Kuznetsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный разрыв страницы в POI
m77,

напиши как бы ты это в делфях делал, может подскажу как на джаве сделать.
я в свое время POI достаточно глубоко копал, даже баг репорты и патчи им слал :)
...
Рейтинг: 0 / 0
01.10.2012, 17:25:52
    #37979040
m77
m77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный разрыв страницы в POI
Alexey Kuznetsovнапиши как бы ты это в делфях делал, может подскажу как на джаве сделать.
я в свое время POI достаточно глубоко копал, даже баг репорты и патчи им слал :)
Спасибо! В моем представлении ( насколько я помню "дельфовый" механизм ) нужно сделать так:

Отключить стандартный механизм разбиения на страницы, просуммировать row.getHeight() (не помню в чем он - в мм или пикселях), отследить, превышается ли с учетом следующей строки размер страницы и, если да, сделать принудительный разрыв страницы. Просто подсчитывать кол-во строк некорректно, т.к. может быть сделан перенос строки внутри ячейки.

Как я помню, на странице размещается стандартная высота - не болеее чего-то. Также, как и высота ячейки не может превышать 409 с чем-то там у.е. (мм? пикселей? какая разница?)
...
Рейтинг: 0 / 0
01.10.2012, 17:38:56
    #37979073
m77
m77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный разрыв страницы в POI
Или нужен дельфовый код? Ему уже лет пять от роду...
...
Рейтинг: 0 / 0
01.10.2012, 18:10:02
    #37979144
Alexey Kuznetsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный разрыв страницы в POI
m77,

да, код делфовый покажи, моет соображу как то же самое на POI сделать
...
Рейтинг: 0 / 0
02.10.2012, 10:59:35
    #37979728
m77
m77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный разрыв страницы в POI
Нашел только какой-то кривоватый и сложный вариант, где скорость была не самым важным делом, но все работало. Выгрузка для 1С, где нужно было большие строки разбивать на несколько строк в зависимости от длины строки. Привожу вкратце - только то, что относится к разбиению по страницам.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
  PageHeightCnt  : Double; // Для подсчета высоты
...
  PageHeightCnt := 0;

  try
    Excel := CreateOleObject('Excel.Application');
  except
    if not VarIsEmpty(Excel) then Excel := Unassigned;
		ShowMessage('.. ....... .......... .......... . Excel!');
		Exit;
  end;
.....
      //Проверка - не превышена ли высота страницы с учетом следующем строки(на самом деле брал из спец.функции, но здесь -     
      // упрощенно)
      HeightCell := Excel.Selection.RowHeight;//Высота следующей строки

      if (PageHeightCnt + HeightCell) > 565 then
      begin

        Excel.Selection.Delete(xlUp);//Удаляем строку - выведем ее же, но на следующем листе

        ExlWS.HPageBreaks.Add(ExlWS.Cells[iPosition+1,1]); //Разрыв страницы

        ........
         
        PageHeightCnt := 0;

      end;

      //Выводим строку и наращиваем счетчик
      ....
      PageHeightCnt := PageHeightCnt + Excel.Selection.RowHeight;
...
Рейтинг: 0 / 0
02.10.2012, 13:04:20
    #37980039
m77
m77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный разрыв страницы в POI
Это какой-то черновик, где я вместо фаст-репортовского перевода в эксель делал свой собственный (родной фаст-репортовский на тот момент был совсем уж кривой), но даже его я не совсем понял как перевести на джаву.

Как я понял, row.getHeight() не соответствует высоте строки Excel.Selection.RowHeight и вообще я немного запутался в соответствиях...
...
Рейтинг: 0 / 0
03.10.2012, 06:02:03
    #37981143
Alexey Kuznetsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный разрыв страницы в POI
m77,

судя по всему то что ты хочешь будет сделать затруднительно.
так как в делфи ты напрямую экселем рулишь, а через POI ты строишь граф объектов, которые после сериалзизации будет валидной книгой экселя, поэтому в POI и нету никаких Selection - так как это run-time свойство екселя.

Нашел поиском, что вроде у класса HSSFSheet есть метод setAutoBreaks() попробуй его проверить, что оно дает.
...
Рейтинг: 0 / 0
03.10.2012, 10:27:50
    #37981289
m77
m77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный разрыв страницы в POI
Alexey Kuznetsovm77,

судя по всему то что ты хочешь будет сделать затруднительно.
так как в делфи ты напрямую экселем рулишь, а через POI ты строишь граф объектов, которые после сериалзизации будет валидной книгой экселя, поэтому в POI и нету никаких Selection - так как это run-time свойство екселя.

Нашел поиском, что вроде у класса HSSFSheet есть метод setAutoBreaks() попробуй его проверить, что оно дает.
Спасибо. Я уже нашел как сделать разрыв страницы - это именно то, что Вы написали,- но не понял как найти место разрыва. В дельфях я выводил данные, смотрел высоту строки и наблюдал, чтобы общая высота страницы не превысила максимальное значение.

В POI есть, вроде бы похожие операции, но, например, вывести строку и посмотреть ее высоту нельзя, как я понял.

row.getHeight(), судя по отладчику, выдает какую-то не понятную постоянную величину не пойми в каких единицах измерения. Например, в либерофисе, где вообще криво выводится высота строки и она всегда почему-то разная, там совсем другие цифры, чем выдает оператор.

Или все же можно добиться, чтобы вывести строку и посмотреть ее высоту с учетом wrap? Это, вобщем-то все, чего мне не достает...
...
Рейтинг: 0 / 0
03.10.2012, 10:33:09
    #37981299
m77
m77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный разрыв страницы в POI
Не, погорячился - разрыв страницы делается с помощью
sheet.setRowBreak(row.getRowNum());

Но вот в каком месте?
...
Рейтинг: 0 / 0
03.10.2012, 10:45:45
    #37981323
Принудительный разрыв страницы в POI
m77, попробуй использовать классы, упомянутые тут:
http://apache-poi.1045710.n5.nabble.com/Autosize-row-for-HSSF-library-tt2308264.html#a2308271
...
Рейтинг: 0 / 0
03.10.2012, 11:17:08
    #37981392
m77
m77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный разрыв страницы в POI
календаревед, спасибо! Там, как я понял, высота определяется в зависимости от выбранного типа и размера шрифта, но не учитывается перенос строки внутри ячейки. А без такого учета работать схема будет только в очень ограниченном числе случаев, когда переноса не требуется.

Нужно сделать с учетом wrap-a, но как это сделать - чего-то не понятно...
...
Рейтинг: 0 / 0
03.10.2012, 11:27:01
    #37981427
Принудительный разрыв страницы в POI
m77, как раз количество автоматических переносов внутри ячейки там и вычисляется. А не будет работать, если внутри ячейки есть принудительные переносы (то, что в екселе можно сделать комбинацией клавиш Alt+Enter), да и это, на мой взгляд, только потому что автор дал пример, а не конечное решение (разбить строку по этому разделителю "\n" на подстроки и посчитать высоту для каждой отдаётся на откуп воспользовавшимся советом).
...
Рейтинг: 0 / 0
03.10.2012, 17:12:50
    #37982409
m77
m77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительный разрыв страницы в POI
Чего-то запутываюсь. Почему не делается переноса строки в ячейке?
Код: java
1.
2.
3.
4.
5.
6.
                 cell = row.createCell(iCol);
                 
                 HSSFCellStyle style = wb.createCellStyle();
                 style.setWrapText(true);
                 cell.setCellStyle(style);
                 cell.setCellValue(....);
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Принудительный разрыв страницы в POI / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]