source: trunk/grails-app/services/nl/tno/metagenomics/files/ExcelService.groovy @ 2

Last change on this file since 2 was 2, checked in by robert@…, 9 years ago

Initial import of basic functionality

File size: 5.7 KB
Line 
1package nl.tno.metagenomics.files
2
3import org.apache.poi.hssf.usermodel.*
4import org.apache.poi.ss.usermodel.*
5
6/**
7 * Convenience methods for reading and writing excel files
8 * @author      Robert Horlings robert@isdat.nl
9 * @see         apache poi api
10 *
11 */
12class ExcelService {
13    static transactional = true
14       
15        /**
16         * Create a new excel workbook, containing 1 sheet
17         * @return
18         */
19        public Workbook create() {
20                Workbook book = new HSSFWorkbook()
21                book.createSheet()
22               
23                return book
24        }
25       
26        public Workbook open( String filename ) {
27                return open( new File( filename ) );
28        }
29       
30        public Workbook open( File file ) {
31                return open( new FileInputStream( file ) );     
32        }
33       
34        public Workbook open( InputStream file ) {
35                return WorkbookFactory.create(file);
36        }
37       
38        /**
39         * Reads specific rows from a given sheet of a file
40         *
41         */
42        public ArrayList readData( Workbook book, int sheetIndex = 0, int startRow = -1, int endRow = -1, int maxRows = 0, int startColumn = 0, int endColumn = 0 ) {
43                if( book == null )
44                        throw new Exception( "No workbook given." );
45                       
46                if( sheetIndex >= book.getNumberOfSheets() )
47                        throw new Exception( "Sheet with index " + sheetIndex + " doesn't exist. Workbook has " + book.getNumberOfSheets() + " sheets." )
48
49
50                Sheet sheet = book.getSheetAt(sheetIndex)
51               
52                // Determine the start and end row if none is given
53                if( startRow == null || startRow == -1 )
54                        startRow = sheet.getFirstRowNum();
55
56                if( endRow == null || endRow == -1 ) {
57                        endRow = sheet.getLastRowNum();
58                }
59
60                // Check whether a max # rows is given
61                if( maxRows > 0 ) {
62                        endRow = Math.min( endRow, startRow + maxRows - 1 );
63                }
64               
65                if( startRow < sheet.getFirstRowNum() || startRow > sheet.getLastRowNum() )
66                        throw new Exception( "Can't return start row " + startRow + " since the row doesn't exist." )
67                       
68                if( endRow < sheet.getFirstRowNum() || endRow > sheet.getLastRowNum() )
69                        throw new Exception( "Can't return end row " + endRow + " since the row doesn't exist.")
70
71                // Now loop through all rows, retrieving data from the excel file
72                def df = new DataFormatter()
73                ArrayList data = []
74               
75                for( def rowNum = startRow; rowNum <= endRow; rowNum++ ) {
76                        ArrayList row = []
77                        Row excelRow = sheet.getRow( rowNum );
78                       
79                        for( def colNum = 0; colNum < excelRow.getLastCellNum(); colNum++ ) {
80                                row << df.formatCellValue( excelRow.getCell( colNum ) );
81                        }
82                       
83                        data << row;
84                }
85               
86                return data
87        }
88       
89        /**
90         * Read all data from a row
91         * @param book
92         * @return
93         */
94        public ArrayList readRow( Workbook book, int sheetIndex = 0, int rowNum = 0 ) {
95                return readData( book, sheetIndex, rowNum, rowNum )[0];
96        }
97       
98        /**
99         * Write all given data to an excel sheet.
100         * @param data
101         */
102        public Workbook writeData( Workbook book, ArrayList data, int sheetIndex = 0, int startRow = 0, int startColumn = 0, CellStyle cellStyle = null ) {
103                if( book == null )
104                        throw new Exception( "No workbook given." );
105                       
106                if( sheetIndex >= book.getNumberOfSheets() )
107                        throw new Exception( "Sheet with index " + sheetIndex + " doesn't exist. Workbook has " + book.getNumberOfSheets() + " sheets." )
108       
109                Sheet sheet = book.getSheetAt(sheetIndex)
110               
111                // Loop through all rows
112                short rowNum = (short) startRow
113                data.each { ArrayList row -> 
114                        // Check whether the row already exists
115                        Row excelRow = sheet.getRow(rowNum)
116                       
117                        // If not, create a new one
118                        if( excelRow == null )
119                                excelRow = sheet.createRow(rowNum)
120                               
121                        short colNum = (short) startColumn
122                        for ( short i = 0; i < row.size(); i++ ) {
123                                Cell c = excelRow.createCell(colNum + i)
124                                c.setCellValue( row[i] )
125                               
126                                if( cellStyle != null )
127                                        c.setCellStyle(cellStyle)
128                        }
129                       
130                        rowNum++;
131                }
132               
133                return book
134        }
135       
136        public Workbook writeRow( Workbook book, ArrayList row, int sheetIndex = 0, int rowNum = 0, CellStyle cellStyle = null ) {
137                return writeData( book, [row], sheetIndex, rowNum, 0, cellStyle )
138        }
139       
140        /**
141         * Writes a header to the excel file (being bold and with a border-bottom)
142         * @param book
143         * @param header
144         * @return
145         */
146        public Workbook writeHeader(Workbook book, ArrayList headers, int sheetIndex = 0, int rowNum = 0) {
147                // Create a bold font and assign it to the row
148                CellStyle cs = book.createCellStyle();
149                cs.setBorderBottom(CellStyle.BORDER_THIN);
150                cs.setBottomBorderColor(IndexedColors.BLACK.getIndex());
151
152                Font boldFont = book.createFont()
153                boldFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
154                cs.setFont(boldFont)
155               
156                return writeRow( book, headers, sheetIndex, rowNum, cs);
157        }
158       
159        public Workbook writeDataWithHeader( Workbook book, ArrayList data, int sheetIndex = 0, int rowNum = 0, CellStyle cellStyle = null ) {
160                writeHeader( book, data.head(), sheetIndex, rowNum );
161                return writeData( book, data.tail(), sheetIndex, rowNum + 1, cellStyle );
162        }
163       
164        /**
165         * Resizes specified columns to match it contents
166         * @param book
167         * @return
168         */
169        public Workbook autoSizeColumns( Workbook book, int sheetIndex = 0,def columns = 0 ) {
170                if( book == null )
171                        throw new Exception( "No workbook given." );
172                       
173                if( sheetIndex >= book.getNumberOfSheets() )
174                        throw new Exception( "Sheet with index " + sheetIndex + " doesn't exist. Workbook has " + book.getNumberOfSheets() + " sheets." )
175       
176                Sheet sheet = book.getSheetAt(sheetIndex)
177
178                if( !( columns instanceof Collection ) ) 
179                        columns = [columns]
180               
181                columns.each { sheet.autoSizeColumn( (short) it ); }
182               
183                return book
184
185        }
186       
187        /**
188         * Return the given workbook for download
189         */
190        public void downloadFile( Workbook book, String filename, def response ) {
191                if( book == null )
192                        throw new Exception( "No workbook given." );
193
194                response.setHeader("Content-disposition", "attachment;filename=\"${filename}\"")
195                response.setContentType("application/octet-stream")
196                book.write(response.outputStream)
197                response.outputStream.close()
198
199        }
200}
Note: See TracBrowser for help on using the repository browser.