Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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 |
Поискал - не нашел Также поискал в 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 : <{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.. Вот такие дела, блин Надеюсь, отсюда можно хоть что-нибудь почерпнуть. SergeS, сенкс. |
Автор: Trustmaster 11.09.04, 10:53 |
[mod-offtopic]Суть Зла, зарегистрируйся наконец-таки по-нормальному. Эта твоя игра с никами начинает раздражать.[/mod-offtopic] |
Автор: Суть Зла 11.09.04, 12:08 |
Оказывается, я уже полгода, как зареган. Извиняюсь за неразбериху. А по теме: странно, что нет какого-нибудь стиля у ьаблицы, или свойтсва для этого... Есть что-то вроде 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, ок, если успею все.. |