11package de.andreasschmitt.export.exporter
22
33import de.andreasschmitt.export.builder.ExcelBuilder
4+ import groovy.util.logging.Log4j
45import jxl.format.Alignment
56import jxl.format.Colour
67import jxl.write.WritableCellFormat
7- import jxl.write.WritableFont
88
99/**
1010 * @author Andreas Schmitt
1111 *
1212 */
13+ @Log4j
1314class DefaultExcelExporter extends AbstractExporter {
1415
16+ private static final int MAX_PER_SHEET = 60 // 000 // See https://github.com/gpc/export/pull/23
17+
1518 protected void exportData (OutputStream outputStream , List data , List fields ) throws ExportingException {
1619 try {
1720 def builder = new ExcelBuilder ()
@@ -27,9 +30,10 @@ class DefaultExcelExporter extends AbstractExporter {
2730 useZebraStyle = getParameters(). get(" zebraStyle.enabled" )
2831 }
2932
30- int maxPerSheet = 60000
33+ int maxPerSheet = MAX_PER_SHEET
3134 if (getParameters(). containsKey(" max.rows.persheet" )) {
3235 maxPerSheet = getParameters(). get(" max.rows.persheet" )
36+ maxPerSheet = maxPerSheet < MAX_PER_SHEET ? maxPerSheet : MAX_PER_SHEET
3337 }
3438
3539 def (sheets, limitPerSheet) = computeSheetsAndLimit(data, maxPerSheet)
@@ -40,69 +44,12 @@ class DefaultExcelExporter extends AbstractExporter {
4044 workbook(outputStream : outputStream) {
4145 for (int j = 1 ; j <= sheets; j++ ) {
4246 def dataPerSheet = data. subList(startIndex, endIndex)
43- sheet(name : getParameters(). get(" title" ) + " -$j " ?: " Export-$j " , widths : getParameters(). get(" column.widths" ), numberOfFields : fields. size(), widthAutoSize : getParameters(). get(" column.width.autoSize" )!= false ) {
44-
45- format(name : " title" ) {
46- Alignment alignment = Alignment . GENERAL
47- if (getParameters(). containsKey(' titles.alignment' )) {
48- alignment = Alignment . " ${ getParameters().get('titles.alignment')} "
49- }
50- font(name : " arial" , bold : true , size : 14 , alignment : alignment)
51- }
52-
53- format(name : " header" ) {
54- if (useZebraStyle) {
55- font(name : " arial" , bold : true , backColor : Colour . GRAY_80 , foreColor : Colour . WHITE , useBorder : true )
56- } else {
57- // Use default header format
58- font(name : " arial" , bold : true )
59- }
60- }
61- format(name : " odd" ) {
62- font(backColor : Colour . GRAY_25 , useBorder : true )
63- }
64- format(name : " even" ) {
65- font(backColor : Colour . WHITE , useBorder : true )
66- }
67-
68- int rowIndex = 0
69-
70- // Option for titles on top of data table
71- def titles = getParameters(). get(" titles" )
72- titles. each {
73- cell(row : rowIndex, column : 0 , value : it, format : " title" )
74- rowIndex++
75- }
76-
77- // Create header
78- if (isHeaderEnabled) {
79- fields. eachWithIndex { field , index ->
80- String value = getLabel(field)
81- cell(row : rowIndex, column : index, value : value, format : " header" )
82- }
83-
84- rowIndex++
85- }
86-
87- final Map columnFormats= getParameters(). get(" column.formats" )
88- // Rows
89- dataPerSheet. eachWithIndex { object , k ->
90-
91- fields. eachWithIndex { field , i ->
92- def format = useZebraStyle ? ( (k % 2 ) == 0 ? " even" : " odd" ) : ' '
93- format = columnFormats?. containsKey(field)? columnFormats[field]: format
94- Object value = getValue(object, field)
95- cell(row : k + rowIndex, column : i, value : value, format : format)
96- }
97- }
98-
99- if (getParameters(). get(' titles.mergeCells' )) {
100- // Merge title cells
101- titles. eachWithIndex { title , index ->
102- mergeCells(startColumn : 0 , startRow : index, endColumn : fields. size(), endRow : index)
103- }
104- }
105- }
47+
48+ processSheet (getDelegate(), getParameters(). get(" title" ) + " -$j " ?: " Export-$j " ,
49+ dataPerSheet, fields,
50+ isHeaderEnabled, useZebraStyle,
51+ getParameters(). get(" column.width.autoSize" )!= false )
52+
10653 startIndex = endIndex
10754 endIndex = endIndex + limitPerSheet > data. size() ? data. size() : endIndex + limitPerSheet
10855 }
@@ -116,13 +63,92 @@ class DefaultExcelExporter extends AbstractExporter {
11663 }
11764 }
11865
119- private computeSheetsAndLimit (List data , maxPerSheet ) {
66+ private void processSheet (ExcelBuilder workbook , String sheetName , List data , List fields ,
67+ boolean isHeaderEnabled , boolean useZebraStyle , boolean widthAutoSize ){
68+ workbook. sheet (name : sheetName,
69+ widths : getParameters(). get(" column.widths" ),
70+ numberOfFields : fields. size(),
71+ widthAutoSize : widthAutoSize) {
72+
73+ format(name : " title" ) {
74+ Alignment alignment = Alignment . GENERAL
75+ if (getParameters(). containsKey(' titles.alignment' )) {
76+ alignment = Alignment . " ${ getParameters().get('titles.alignment')} "
77+ }
78+ font(name : " arial" , bold : true , size : 14 , alignment : alignment)
79+ }
80+
81+ format(name : " header" ) {
82+ if (useZebraStyle) {
83+ font(name : " arial" , bold : true , backColor : Colour . GRAY_80 , foreColor : Colour . WHITE , useBorder : true )
84+ } else {
85+ // Use default header format
86+ font(name : " arial" , bold : true )
87+ }
88+ }
89+ format(name : " odd" ) {
90+ font(backColor : Colour . GRAY_25 , useBorder : true )
91+ }
92+ format(name : " even" ) {
93+ font(backColor : Colour . WHITE , useBorder : true )
94+ }
95+
96+ int rowIndex = 0
97+
98+ // Option for titles on top of data table
99+ def titles = getParameters(). get(" titles" )
100+ titles. each {
101+ cell(row : rowIndex, column : 0 , value : it, format : " title" )
102+ rowIndex++
103+ }
104+
105+ // Create header
106+ if (isHeaderEnabled) {
107+ final def headerFormat= getParameters(). get(" header.format" )
108+ final Map headerFormats= getParameters(). get(" header.formats" )
109+ // WritableCellFormat format = headerFormats.containsKey() headerFormat
110+
111+ fields. eachWithIndex { field , index ->
112+ def format = headerFormats. get(index)?: headerFormat
113+ String value = getLabel(field)
114+ cell(row : rowIndex, column : index, value : value, format : format?: " header" )
115+ }
116+
117+ rowIndex++
118+ }
119+
120+ final Map columnFormats= getParameters(). get(" column.formats" )
121+ // Rows
122+ data. eachWithIndex { object , k ->
123+
124+ fields. eachWithIndex { field , i ->
125+ def format = useZebraStyle ? ( (k % 2 ) == 0 ? " even" : " odd" ) : ' '
126+ format = columnFormats?. containsKey(field)? columnFormats[field]: format
127+ if (format?. hasProperty(' formatter' ) && format. formatter && ! formatters. containsKey(field))
128+ formatters. put(field, format. formatter)
129+
130+ Object value = getValue(object, field)
131+ cell(row : k + rowIndex, column : i, value : value, format : format)
132+ }
133+ }
134+
135+ if (getParameters(). get(' titles.mergeCells' )) {
136+ // Merge title cells
137+ titles. eachWithIndex { title , index ->
138+ mergeCells(startColumn : 0 , startRow : index, endColumn : fields. size(), endRow : index)
139+ }
140+ }
141+ }
142+
143+ }
144+
145+ private static List computeSheetsAndLimit (List data , maxPerSheet ) {
120146 if (! data)
121147 throw new ExportingException (" Error during export: Empty data!" )
122148
123149 def limitPerSheet = data. size() > maxPerSheet ? maxPerSheet : data. size()
124150 def sheetsCount = Math . ceil(data. size() / limitPerSheet)
125- log. debug " limitPerSheet:$limitPerSheet ::: sheetsCount:$sheetsCount "
151+ log. debug( " limitPerSheet:$limitPerSheet ::: sheetsCount:$sheetsCount " )
126152 return [sheetsCount, limitPerSheet]
127153 }
128154
0 commit comments