Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > JavaScript, DOM/DHTML > таблица на печать!


Автор: Суть_Зла 10.09.04, 14:50
Здравствуйте!

Такая проблема:

имеется большАя таблица на HTML (генерится JSP. это, впрочем, неважно),
при выводе на печать эта таблиуа бьется на страницы и каждая строка в самом низу каждого листа не переносится целиком на следующую страницу, а разделяется на две части. зачастую это выглядит, как будто у одной из строк нет нижнего border'a.
Как при выводе на печать переносить строки?


Заранее спасибо

Автор: SergeS 10.09.04, 15:01
Обсуждалась ета тема - поищи по разделу WWW Masters

Автор: Все таже Суть 10.09.04, 15:58
Поискал - не нашел :blink:
Также поискал в HTML...

Автор: SergeS 10.09.04, 16:41
гм было - и помоему пришли к выводу что никак

Автор: Еще раз Суть 11.09.04, 10:33
Есть два варианта, в принципе. Оба были реализованы, так что 100% гарантия...

Если кому интересно, выкладываю...

1. Через парсер XML в EXCEL. Написал на JSP, но, думаю, всем будет более-менее понятно, а главная часть на JavaScript, так что разберетесь.

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
    ### jsp_ved.jsp ----> Главная страница на JSP, всего лишь интерпретатор,
    ### так что перемисать под тот же PHP не составит труда.
    ### Не обращайте внимание на JavaBeans'ы, не имеет значение
    ### откуда брать инфу, все самое важное в JS'ке. Итак:
     
    <%@ page contentType="text/html; charset=windows-1251" %>
    <html>
    <head>
        <link href="toolbar.css" rel="styleSheet" type="text/css">
        <script src="check.js"></SCRIPT>
        [B]<script src="ved2excel.js"></SCRIPT>[/B]
    </head>
    <jsp:useBean id="jsp_vedbeanId" scope="session" class="authorize_users1.jsp_vedbean" />
    <jsp:setProperty name="jsp_vedbeanId" property="*" />
     
    <body>
      <script>menu_draw(2,'<jsp:getProperty name="jsp_vedbeanId" property="predname" />');</script>
      <script>
        var prt = document.location.port; if (prt=="") {prt = "80";}
        var hostname = "http://"+document.location.hostname+":"+prt;
        document.writeln("<a style='cursor: Hand;' onClick='Export(\""+hostname+"<jsp:getProperty name="jsp_vedbeanId" property="path" />/xls/ved.xls\")'>
             <img src='images/excel.gif' width=20 height=20 alt='Экспортировать в MS Excel'></a>");
      </script>
      <table id="TableMain">
        <thead>
          <th>Колонка 1</th>
          <th>Колонка 2</th>
        </thead>
      <jsp:getProperty name="jsp_vedbeanId" property="table" />  
      </table>
      
      <jsp:getProperty name="jsp_vedbeanId" property="error_msg" />  
      
    </body>
    </html>


Теперь JavaScript :wacko: :
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     
     // Получить ссылку в формате A1 из номера строки и колонки
    function GetRef(_row, _col) {
       var xCol = String.fromCharCode( (new String("A")).charCodeAt(0) + _col - 1 );
       var rng = xCol + _row;
       return rng;
      }
     
     // Запись данных в ячейки
    function ExportTable(sheet, t, from_row,length_col){
       var R0 = GetRef(from_row, 1);
       var R1;
       var R;
       var xlEdgeBottom = 9;
       var xlEdgeLeft = 7;
       var xlEdgeRight = 10;
       var xlEdgeTop = 8;
      
       if ( length_col > 26 ) {
          R1 = GetRef(t.rows.length + from_row - 1, length_col-26);
          R  = R0 + ":A" + R1;
       } else {
          R1 = GetRef(t.rows.length + from_row - 1, length_col);
          R  = R0 + ":" + R1;
       }
     
       for( var ir = 0, NR = t.rows.length ; ir < NR ; ++ir )
       {
          var r = t.rows[ir];
          for( var ic = 0, NC = r.cells.length ; ic < NC ; ++ic )
          {
             var c = r.cells[ic];
             var xc = sheet.Cells( ir + from_row, ic + 1 );
             xc.WrapText = true;
             xc.Value = c.innerText;
             if (ic==0) {xc.Borders(xlEdgeLeft).Weight = 3;}
             else {xc.Borders(xlEdgeLeft).Weight = 2;}
             if (ic==NC-1) {xc.Borders(xlEdgeRight).Weight = 3;}
             else {xc.Borders(xlEdgeRight).Weight = 3;}
             if ((ir==NR-1)||(ir==0)) {xc.Borders(xlEdgeBottom).Weight = 3;}
             else {xc.Borders(xlEdgeBottom).Weight = 2;}
          }
       }
      
       return ir + from_row;
    }
    /* Экспортировать в Excel */
    //xlsname - имя документа с путем!
    function Export(xlsname) {
       var excel;
       error = 0;
       error_msg = "";
       try {
       excel = new ActiveXObject("Excel.Application");
       excel.Visible = true;
       var book=excel.Application.Workbooks.Open(xlsname);
       excel.Application.Visible = true;
       var sheet = book.Worksheets.Item(1); //  Имя листа или его номер
       sheet.Select;
       //Убирание символов <br>
       var re = new RegExp("<br>","gi");
       var s = document.all.title.innerText+"\n\r"+document.all.title1.innerText;
       s = s.replace(re,"\n\r");
       sheet.Range("A2").Value = s; //Заголовок
    /*   s = document.all.title1.innerText;
       sheet.Range("А5").Value = s; */
       var last_row=4; // с какой строки
       var length_col=20; // количество колонок
       //Таблица
       var max_row = ExportTable(sheet, document.all.TableMain, last_row,length_col);
       s = document.all.desc.innerText;
       var c = GetRef(max_row+1,1);
       sheet.Range(c).Font.Bold = true;
       sheet.Range(c).HorizontalAlignment = -4131;
       sheet.Range(c).Value = s;
       sheet.Range("A1").Select;
    //   excel.ActiveWorkbook.RunAutoMacros(1);
       excel = "";
       } catch(e) { error = 1; error_msg = e.description; }
       if (error==0) {   alert("Экспорт в Excel завершен!"); }
       else {alert("Ошибка при экспорте таблицы в MS Excel. Эта ошибка могла возникнуть
    по двум причинам: \n\r  1. Не установлен MS Excel \n\r  2. Неправильно
    настроена безопасность браузера.\n\r"+error_msg);}
    }


Как видите, вариант более-менее универсален, но требует
установки MS Office (насколько понимаю, не ниже 2000??).


2ой способ.
писать все через ActiveX, но требует тогда установки у
пользователя клиента ActiveX.. Вот такие дела, блин :wall:
Надеюсь, отсюда можно хоть что-нибудь почерпнуть.
SergeS, сенкс.

Автор: Trustmaster 11.09.04, 10:53
[mod-offtopic]Суть Зла, зарегистрируйся наконец-таки по-нормальному. Эта твоя игра с никами начинает раздражать.[/mod-offtopic]

Автор: Суть Зла 11.09.04, 12:08
Оказывается, я уже полгода, как зареган. :o
Извиняюсь за неразбериху.

А по теме: странно, что нет какого-нибудь стиля у ьаблицы, или свойтсва для этого... Есть что-то вроде pageBreakAfter (??).. но не то.

Автор: SergeS 11.09.04, 19:23
Суть Зла,
про первый способ лучше забудь - не у всех есть ексцель
хотя - если вставишь туды проверку на наличее - и в зависимости от етого будетшь включать фишку - то после подготовления для FAQ - дгм могёшь получить

Автор: Суть Зла 11.09.04, 21:18
SergeS, насчет EXCEL прав, безусловно.
просто этот способ мы применяем на ЖДорогах, поэтому он вполне приемлем (правда, у них бывает по два офиса установлено!!!)

Автор: SergeS 12.09.04, 06:51
Суть Зла,
кстати лучше всётаки доделай сей способ чтоб он проверял есть ли Ексцель и если есть - то делал так чтоб было деление - и отправь ето в FAQ

Автор: Суть Зла 12.09.04, 08:17
SergeS, ок, если успею все..

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)