Jak radzić sobie z przerwami na stronie podczas drukowania dużej tabeli HTML
Mam projekt, który wymaga wydrukowania tabeli HTML z wieloma wierszami.
Moim problemem jest sposób drukowania tabeli na wielu stronach. Czasami wiersz tnie się na pół, co czyni go nieczytelnym, ponieważ jedna połowa znajduje się na krwawiącej krawędzi strony, a pozostała część jest drukowana na górze następnej strony.
Jedynym wiarygodnym rozwiązaniem, jakie mogę wymyślić, jest użycie ułożonych Div zamiast tabeli i wymuszenie łamania stron w razie potrzeby.. ale zanim przejdę przez całą zmianę ... pomyślałem, że mogę zapytać tutaj wcześniej.
11 answers
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test</title>
<style type="text/css">
table { page-break-inside:auto }
tr { page-break-inside:avoid; page-break-after:auto }
thead { display:table-header-group }
tfoot { display:table-footer-group }
</style>
</head>
<body>
<table>
<thead>
<tr><th>heading</th></tr>
</thead>
<tfoot>
<tr><td>notes</td></tr>
</tfoot>
<tbody>
<tr>
<td>x</td>
</tr>
<tr>
<td>x</td>
</tr>
<!-- 500 more rows -->
<tr>
<td>x</td>
</tr>
</tbody>
</table>
</body>
</html>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-27 14:25:49
Uwaga: Podczas używania znacznika page-break-after: always dla tagu tworzy on podział strony po ostatnim bitie tabeli, tworząc całkowicie pustą stronę na końcu za każdym razem! Aby to naprawić, po prostu zmień go na page-break-after: auto. Złamie się poprawnie i nie utworzy dodatkowej pustej strony.
<html>
<head>
<style>
@media print
{
table { page-break-after:auto }
tr { page-break-inside:avoid; page-break-after:auto }
td { page-break-inside:avoid; page-break-after:auto }
thead { display:table-header-group }
tfoot { display:table-footer-group }
}
</style>
</head>
<body>
....
</body>
</html>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-14 05:07:46
Rozszerzenie z rozwiązania Sinan Ür:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test</title>
<style type="text/css">
table { page-break-inside:auto }
div { page-break-inside:avoid; } /* This is the key */
thead { display:table-header-group }
tfoot { display:table-footer-group }
</style>
</head>
<body>
<table>
<thead>
<tr><th>heading</th></tr>
</thead>
<tfoot>
<tr><td>notes</td></tr>
</tfoot>
<tr>
<td><div>Long<br />cell<br />should'nt<br />be<br />cut</div></td>
</tr>
<tr>
<td><div>Long<br />cell<br />should'nt<br />be<br />cut</div></td>
</tr>
<!-- 500 more rows -->
<tr>
<td>x</td>
</tr>
</tbody>
</table>
</body>
</html>
Wygląda na to, że page-break-inside:avoid w niektórych przeglądarkach jest brany pod uwagę tylko dla elementów blokowych, a nie dla komórki, tabeli, wiersza ani wbudowanego bloku.
Jeśli spróbujesz wyświetlić: block tagu TR i użyć tam page-break-inside: avoid, to działa, ale bałagan z układem tabeli.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-11 14:03:43
Żadna z odpowiedzi tutaj nie zadziałała dla mnie w Chrome. AAverin na Githubie stworzył jakiś przydatny Javascript do tego celu i to mi się udało:
Po prostu dodaj js do kodu i Dodaj klasę "splitForPrint" do tabeli, a to starannie podzieli tabelę na wiele stron i doda nagłówek tabeli do każdej strony.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-31 07:52:22
Użyj tych właściwości CSS:
page-break-after
page-break-before
Na przykład:
<html>
<head>
<style>
@media print
{
table {page-break-after:always}
}
</style>
</head>
<body>
....
</body>
</html>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-13 20:32:39
Ostatnio rozwiązałem ten problem dobrym rozwiązaniem.
Css:
.avoidBreak {
border: 2px solid;
page-break-inside:avoid;
}
Js:
function Print(){
$(".tableToPrint td, .tableToPrint th").each(function(){ $(this).css("width", $(this).width() + "px") });
$(".tableToPrint tr").wrap("<div class='avoidBreak'></div>");
window.print();
}
Działa jak czar!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-30 15:25:53
Zakończyłem podążając za podejściem @ vicenteherrera, z pewnymi poprawkami(które są prawdopodobnie specyficzne dla bootstrap 3).
Zasadniczo; nie możemy złamać tr
s, ani td
S, ponieważ nie są to elementy blokowe. Więc osadzamy div
s w każdym i stosujemy nasze page-break-*
Zasady przeciwko div
. Po drugie, dodajemy wyściółkę na górze każdego z tych div - ów, aby zrekompensować wszelkie artefakty stylizacji.
<style>
@media print {
/* avoid cutting tr's in half */
th div, td div {
margin-top:-8px;
padding-top:8px;
page-break-inside:avoid;
}
}
</style>
<script>
$(document).ready(function(){
// Wrap each tr and td's content within a div
// (todo: add logic so we only do this when printing)
$("table tbody th, table tbody td").wrapInner("<div></div>");
})
</script>
Korekty marginesu i wypełnienia były konieczne, aby zrównoważyć pewien jitter, który został wprowadzony (moim zdaniem-z bootstrap). Nie jestem pewien, czy przedstawiam jakieś nowe rozwiązanie z innych odpowiedzi na to pytanie, ale myślę, że może to komuś pomoże.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-22 17:15:32
Sprawdziłem wiele rozwiązań i każdy nie działał dobrze.
Więc spróbowałem małej sztuczki i działa:
Tfoot with style: position: fixed; bottom: 0px;
jest umieszczony na dole ostatniej strony, ale jeśli stopka jest zbyt wysoka, jest nakładana przez zawartość tabeli.
Tfoot with only: display: table-footer-group;
nie jest nakładana, ale nie znajduje się na dole ostatniej strony...
Let ' s put two tfoot:
TFOOT.placer {
display: table-footer-group;
height: 130px;
}
TFOOT.contenter {
display: table-footer-group;
position: fixed;
bottom: 0px;
height: 130px;
}
<TFOOT class='placer'>
<TR>
<TD>
<!-- empty here
-->
</TD>
</TR>
</TFOOT>
<TFOOT class='contenter'>
<TR>
<TD>
your long text or high image here
</TD>
</TR>
</TFOOT>
Jeden rezerwuje miejsce na nie-ostatnich stronach, drugi umieszcza w Twoim accual stopka.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-09 08:01:03
Wypróbowałem wszystkie sugestie podane powyżej i znalazłem proste i działające rozwiązanie cross browser dla tego problemu. Nie ma stylów ani podziału strony potrzebne do tego rozwiązania. Dla rozwiązania format tabeli powinien wyglądać następująco:
<table>
<thead> <!-- there should be <thead> tag-->
<td>Heading</td> <!--//inside <thead> should be <td> it should not be <th>-->
</thead>
<tbody><!---<tbody>also must-->
<tr>
<td>data</td>
</tr>
<!--100 more rows-->
</tbody>
</table>
Powyższy format testowany i działający w przeglądarkach krzyżowych
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-13 07:33:41
No, Chłopaki... Większość rozwiązań tutaj nie zadziałała. Więc tak mi się układało..
HTML
<table>
<thead>
<tr>
<th style="border:none;height:26px;"></th>
<th style="border:none;height:26px;"></th>
.
.
</tr>
<tr>
<th style="border:1px solid black">ABC</th>
<th style="border:1px solid black">ABC</th>
.
.
<tr>
</thead>
<tbody>
//YOUR CODE
</tbody>
</table>
Pierwszy zestaw głowicy jest używany jako atrapa, aby nie było brakującej górnej granicy w 2. głowicy (tj. oryginalnej głowicy) podczas łamania strony.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-06 07:41:53
Zaakceptowana odpowiedź nie działała dla mnie we wszystkich przeglądarkach, ale po css zadziałał dla mnie:
tr
{
display: table-row-group;
page-break-inside:avoid;
page-break-after:auto;
}
Struktura html była:
<table>
<thead>
<tr></tr>
</thead>
<tbody>
<tr></tr>
<tr></tr>
...
</tbody>
</table>
W moim przypadku wystąpiły dodatkowe problemy z thead tr
, Ale To rozwiązało pierwotny problem utrzymywania wierszy tabeli przed łamaniem.
Z powodu problemów z nagłówkiem, ostatecznie skończyło się na:
#theTable td *
{
page-break-inside:avoid;
}
Nie zapobiegło to łamaniu wierszy; tylko zawartość każdej komórki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-01 19:20:14