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

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