excel processing using jexcel and poi (#1058)
* excel processing using jexcel and poi * update examples * small fix * fix poi version, fix imports
This commit is contained in:
		
							parent
							
								
									a1312e9ce0
								
							
						
					
					
						commit
						a44ea9588f
					
				| @ -160,6 +160,28 @@ | |||||||
|             <scope>test</scope> |             <scope>test</scope> | ||||||
|         </dependency> |         </dependency> | ||||||
| 
 | 
 | ||||||
|  |         <!-- excel --> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>org.apache.poi</groupId> | ||||||
|  |             <artifactId>poi</artifactId> | ||||||
|  |             <version>${poi.version}</version> | ||||||
|  |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>org.apache.poi</groupId> | ||||||
|  |             <artifactId>poi-ooxml</artifactId> | ||||||
|  |             <version>${poi.version}</version> | ||||||
|  |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>org.apache.poi</groupId> | ||||||
|  |             <artifactId>poi-ooxml-schemas</artifactId> | ||||||
|  |             <version>${poi.version}</version> | ||||||
|  |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>org.jxls</groupId> | ||||||
|  |             <artifactId>jxls-jexcel</artifactId> | ||||||
|  |             <version>${jexcel.version}</version> | ||||||
|  |         </dependency>	 | ||||||
|  | 		 | ||||||
|     </dependencies> |     </dependencies> | ||||||
| 
 | 
 | ||||||
|     <build> |     <build> | ||||||
| @ -370,6 +392,10 @@ | |||||||
| 
 | 
 | ||||||
|         <!-- AspectJ --> |         <!-- AspectJ --> | ||||||
|         <aspectj.version>1.8.9</aspectj.version> |         <aspectj.version>1.8.9</aspectj.version> | ||||||
|  | 		 | ||||||
|  |         <!-- excel --> | ||||||
|  |         <poi.version>3.16-beta1</poi.version> | ||||||
|  |         <jexcel.version>1.0.6</jexcel.version> | ||||||
|     </properties> |     </properties> | ||||||
| 
 | 
 | ||||||
| </project> | </project> | ||||||
|  | |||||||
| @ -0,0 +1,140 @@ | |||||||
|  | package com.baeldung.excel; | ||||||
|  | 
 | ||||||
|  | import org.apache.poi.ss.usermodel.Cell; | ||||||
|  | import org.apache.poi.ss.usermodel.CellType; | ||||||
|  | import org.apache.poi.ss.usermodel.CellStyle; | ||||||
|  | import org.apache.poi.ss.usermodel.IndexedColors; | ||||||
|  | import org.apache.poi.ss.usermodel.Row; | ||||||
|  | import org.apache.poi.ss.usermodel.Sheet; | ||||||
|  | import org.apache.poi.ss.usermodel.Workbook; | ||||||
|  | import org.apache.poi.xssf.usermodel.XSSFWorkbook; | ||||||
|  | import org.apache.poi.xssf.usermodel.XSSFFont; | ||||||
|  | import org.apache.poi.ss.usermodel.DateUtil; | ||||||
|  | import org.apache.poi.ss.usermodel.FillPatternType; | ||||||
|  | import java.io.File; | ||||||
|  | import java.io.FileOutputStream; | ||||||
|  | import java.io.FileInputStream; | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.io.InputStream; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import org.springframework.stereotype.Service; | ||||||
|  | 
 | ||||||
|  | @Service | ||||||
|  | public class ExcelPOIHelper { | ||||||
|  | 
 | ||||||
|  |     public Map<Integer, ArrayList<String>> readExcel(String fileLocation) throws IOException { | ||||||
|  | 
 | ||||||
|  |         Map<Integer, ArrayList<String>> data = new HashMap<Integer, ArrayList<String>>(); | ||||||
|  |         FileInputStream file = new FileInputStream(new File(fileLocation)); | ||||||
|  |         Workbook workbook = new XSSFWorkbook(file); | ||||||
|  |         Sheet sheet = workbook.getSheetAt(0); | ||||||
|  |         int i = 0; | ||||||
|  |         for (Row row : sheet) { | ||||||
|  |             data.put(i, new ArrayList<String>()); | ||||||
|  |             for (Cell cell : row) { | ||||||
|  |                 switch (cell.getCellTypeEnum()) { | ||||||
|  |                 case STRING: | ||||||
|  |                     data.get(i) | ||||||
|  |                         .add(cell.getRichStringCellValue() | ||||||
|  |                             .getString()); | ||||||
|  |                     break; | ||||||
|  |                 case NUMERIC: | ||||||
|  |                     if (DateUtil.isCellDateFormatted(cell)) { | ||||||
|  |                         data.get(i) | ||||||
|  |                             .add(cell.getDateCellValue() + ""); | ||||||
|  |                     } else { | ||||||
|  |                         data.get(i) | ||||||
|  |                             .add(cell.getNumericCellValue() + ""); | ||||||
|  |                     } | ||||||
|  |                     break; | ||||||
|  |                 case BOOLEAN: | ||||||
|  |                     data.get(i) | ||||||
|  |                         .add(cell.getBooleanCellValue() + ""); | ||||||
|  |                     break; | ||||||
|  |                 case FORMULA: | ||||||
|  |                     data.get(i) | ||||||
|  |                         .add(cell.getCellFormula() + ""); | ||||||
|  |                     break; | ||||||
|  |                 default: | ||||||
|  |                     data.get(i) | ||||||
|  |                         .add(" "); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             i++; | ||||||
|  |         } | ||||||
|  |         if (workbook != null){ | ||||||
|  |             workbook.close(); | ||||||
|  |         } | ||||||
|  |         return data; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void writeExcel() throws IOException { | ||||||
|  |         Workbook workbook = new XSSFWorkbook(); | ||||||
|  | 
 | ||||||
|  |         try { | ||||||
|  |             Sheet sheet = workbook.createSheet("Persons"); | ||||||
|  |             sheet.setColumnWidth(0, 6000); | ||||||
|  |             sheet.setColumnWidth(1, 4000); | ||||||
|  | 
 | ||||||
|  |             Row header = sheet.createRow(0); | ||||||
|  | 
 | ||||||
|  |             CellStyle headerStyle = workbook.createCellStyle(); | ||||||
|  | 
 | ||||||
|  |             headerStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex()); | ||||||
|  |             headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); | ||||||
|  | 
 | ||||||
|  |             XSSFFont font = ((XSSFWorkbook) workbook).createFont(); | ||||||
|  |             font.setFontName("Arial"); | ||||||
|  |             font.setFontHeightInPoints((short) 16); | ||||||
|  |             font.setBold(true); | ||||||
|  |             headerStyle.setFont(font); | ||||||
|  | 
 | ||||||
|  |             Cell headerCell = header.createCell(0); | ||||||
|  |             headerCell.setCellValue("Name"); | ||||||
|  |             headerCell.setCellStyle(headerStyle); | ||||||
|  | 
 | ||||||
|  |             headerCell = header.createCell(1); | ||||||
|  |             headerCell.setCellValue("Age"); | ||||||
|  |             headerCell.setCellStyle(headerStyle); | ||||||
|  | 
 | ||||||
|  |             CellStyle style = workbook.createCellStyle(); | ||||||
|  |             style.setWrapText(true); | ||||||
|  | 
 | ||||||
|  |             Row row = sheet.createRow(2); | ||||||
|  |             Cell cell = row.createCell(0); | ||||||
|  |             cell.setCellValue("John Smith"); | ||||||
|  |             cell.setCellStyle(style); | ||||||
|  | 
 | ||||||
|  |             cell = row.createCell(1); | ||||||
|  |             cell.setCellValue(20); | ||||||
|  |             cell.setCellStyle(style); | ||||||
|  | 
 | ||||||
|  |             row = sheet.createRow(3); | ||||||
|  |             cell = row.createCell(0); | ||||||
|  |             cell.setCellValue("Ana Johnson"); | ||||||
|  |             cell.setCellStyle(style); | ||||||
|  | 
 | ||||||
|  |             cell = row.createCell(1); | ||||||
|  |             cell.setCellValue(30); | ||||||
|  |             cell.setCellStyle(style); | ||||||
|  | 
 | ||||||
|  |             File currDir = new File("."); | ||||||
|  |             String path = currDir.getAbsolutePath(); | ||||||
|  |             String fileLocation = path.substring(0, path.length() - 1) + "temp.xlsx"; | ||||||
|  | 
 | ||||||
|  |             FileOutputStream outputStream = new FileOutputStream(fileLocation); | ||||||
|  |             workbook.write(outputStream); | ||||||
|  |         } finally { | ||||||
|  |             if (workbook != null) { | ||||||
|  |                 try { | ||||||
|  |                     workbook.close(); | ||||||
|  |                 } catch (IOException e) { | ||||||
|  |                     e.printStackTrace(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,80 @@ | |||||||
|  | package com.baeldung.excel; | ||||||
|  | 
 | ||||||
|  | import jxl.*; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import jxl.read.biff.BiffException; | ||||||
|  | import java.io.File; | ||||||
|  | import java.io.IOException; | ||||||
|  | import org.springframework.stereotype.Service; | ||||||
|  | import jxl.write.*; | ||||||
|  | import jxl.write.Number; | ||||||
|  | import jxl.format.Colour; | ||||||
|  | 
 | ||||||
|  | @Service | ||||||
|  | public class JExcelHelper { | ||||||
|  | 
 | ||||||
|  |     public Map<Integer, ArrayList<String>> readJExcel(String fileLocation) throws IOException, BiffException { | ||||||
|  |         Map<Integer, ArrayList<String>> data = new HashMap<Integer, ArrayList<String>>(); | ||||||
|  | 
 | ||||||
|  |         Workbook workbook = Workbook.getWorkbook(new File(fileLocation)); | ||||||
|  |         Sheet sheet = workbook.getSheet(0); | ||||||
|  |         int rows = sheet.getRows(); | ||||||
|  |         int columns = sheet.getColumns(); | ||||||
|  | 
 | ||||||
|  |         for (int i = 0; i < rows; i++) { | ||||||
|  |             data.put(i, new ArrayList<String>()); | ||||||
|  |             for (int j = 0; j < columns; j++) { | ||||||
|  |                 data.get(i).add(sheet.getCell(j, i).getContents()); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return data; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void writeJExcel() throws IOException, WriteException { | ||||||
|  |         WritableWorkbook workbook = null; | ||||||
|  |         try { | ||||||
|  |             File currDir = new File("."); | ||||||
|  |             String path = currDir.getAbsolutePath(); | ||||||
|  |             String fileLocation = path.substring(0, path.length() - 1) + "temp.xls"; | ||||||
|  | 
 | ||||||
|  |             workbook = Workbook.createWorkbook(new File(fileLocation)); | ||||||
|  | 
 | ||||||
|  |             WritableSheet sheet = workbook.createSheet("Sheet 1", 0); | ||||||
|  | 
 | ||||||
|  |             WritableCellFormat headerFormat = new WritableCellFormat(); | ||||||
|  |             WritableFont font = new WritableFont(WritableFont.ARIAL, 16, WritableFont.BOLD); | ||||||
|  |             headerFormat.setFont(font); | ||||||
|  |             headerFormat.setBackground(Colour.LIGHT_BLUE); | ||||||
|  |             headerFormat.setWrap(true); | ||||||
|  |             Label headerLabel = new Label(0, 0, "Name", headerFormat); | ||||||
|  |             sheet.setColumnView(0, 60); | ||||||
|  |             sheet.addCell(headerLabel); | ||||||
|  | 
 | ||||||
|  |             headerLabel = new Label(1, 0, "Age", headerFormat); | ||||||
|  |             sheet.setColumnView(0, 40); | ||||||
|  |             sheet.addCell(headerLabel); | ||||||
|  | 
 | ||||||
|  |             WritableCellFormat cellFormat = new WritableCellFormat(); | ||||||
|  |             cellFormat.setWrap(true); | ||||||
|  | 
 | ||||||
|  |             Label cellLabel = new Label(0, 2, "John Smith", cellFormat); | ||||||
|  |             sheet.addCell(cellLabel); | ||||||
|  |             Number cellNumber = new Number(1, 2, 20, cellFormat); | ||||||
|  |             sheet.addCell(cellNumber); | ||||||
|  | 
 | ||||||
|  |             cellLabel = new Label(0, 3, "Ana Johnson", cellFormat); | ||||||
|  |             sheet.addCell(cellLabel); | ||||||
|  |             cellNumber = new Number(1, 3, 30, cellFormat); | ||||||
|  |             sheet.addCell(cellNumber); | ||||||
|  | 
 | ||||||
|  |             workbook.write(); | ||||||
|  |         } finally { | ||||||
|  |             if (workbook != null) { | ||||||
|  |                 workbook.close(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -21,6 +21,7 @@ import org.springframework.web.servlet.view.JstlView; | |||||||
| import org.springframework.web.servlet.view.ResourceBundleViewResolver; | import org.springframework.web.servlet.view.ResourceBundleViewResolver; | ||||||
| import org.springframework.web.servlet.view.XmlViewResolver; | import org.springframework.web.servlet.view.XmlViewResolver; | ||||||
| import org.springframework.web.util.UrlPathHelper; | import org.springframework.web.util.UrlPathHelper; | ||||||
|  | import com.baeldung.excel.*; | ||||||
| 
 | 
 | ||||||
| @Configuration | @Configuration | ||||||
| @EnableWebMvc | @EnableWebMvc | ||||||
| @ -106,4 +107,15 @@ public class WebConfig extends WebMvcConfigurerAdapter { | |||||||
| 
 | 
 | ||||||
|         configurer.setUrlPathHelper(urlPathHelper); |         configurer.setUrlPathHelper(urlPathHelper); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     @Bean | ||||||
|  |     public JExcelHelper jExcelHelper() { | ||||||
|  |         return new JExcelHelper(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Bean | ||||||
|  |     public ExcelPOIHelper excelPOIHelper() { | ||||||
|  |         return new ExcelPOIHelper(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -0,0 +1,105 @@ | |||||||
|  | package com.baeldung.web.controller; | ||||||
|  | 
 | ||||||
|  | import org.springframework.stereotype.Controller; | ||||||
|  | import org.springframework.ui.Model; | ||||||
|  | import org.springframework.web.bind.annotation.RequestMapping; | ||||||
|  | import org.springframework.web.bind.annotation.RequestMethod; | ||||||
|  | import org.springframework.web.multipart.MultipartFile; | ||||||
|  | import java.io.File; | ||||||
|  | import java.io.FileOutputStream; | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.io.InputStream; | ||||||
|  | import com.baeldung.excel.*; | ||||||
|  | import jxl.read.biff.BiffException; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import javax.annotation.Resource; | ||||||
|  | import jxl.write.WriteException; | ||||||
|  | 
 | ||||||
|  | @Controller | ||||||
|  | public class ExcelController { | ||||||
|  | 
 | ||||||
|  |     private String fileLocation; | ||||||
|  | 
 | ||||||
|  |     @Resource(name = "jExcelHelper") | ||||||
|  |     private JExcelHelper jExcelHelper; | ||||||
|  | 
 | ||||||
|  |     @Resource(name = "excelPOIHelper") | ||||||
|  |     private ExcelPOIHelper excelPOIHelper; | ||||||
|  | 
 | ||||||
|  |     @RequestMapping(method = RequestMethod.GET, value = "/excelProcessing") | ||||||
|  |     public String getExcelProcessingPage() { | ||||||
|  |         return "excel"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @RequestMapping(method = RequestMethod.POST, value = "/uploadExcelFile") | ||||||
|  |     public String uploadFile(Model model, MultipartFile file) throws IOException { | ||||||
|  |         InputStream in = file.getInputStream(); | ||||||
|  |         File currDir = new File("."); | ||||||
|  |         String path = currDir.getAbsolutePath(); | ||||||
|  |         fileLocation = path.substring(0, path.length() - 1) + file.getOriginalFilename(); | ||||||
|  |         FileOutputStream f = new FileOutputStream(fileLocation); | ||||||
|  |         int ch = 0; | ||||||
|  |         while ((ch = in.read()) != -1) { | ||||||
|  |             f.write(ch); | ||||||
|  |         } | ||||||
|  |         f.flush(); | ||||||
|  |         f.close(); | ||||||
|  |         System.out.println(fileLocation); | ||||||
|  |         model.addAttribute("message", "File: " + file.getOriginalFilename() + " has been uploaded successfully!"); | ||||||
|  |         return "excel"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @RequestMapping(method = RequestMethod.GET, value = "/readJExcel") | ||||||
|  |     public String readJExcel(Model model) throws IOException, BiffException { | ||||||
|  | 
 | ||||||
|  |         if (fileLocation != null) { | ||||||
|  |             if (fileLocation.endsWith(".xls")) { | ||||||
|  |                 Map<Integer, ArrayList<String>> data = jExcelHelper.readJExcel(fileLocation); | ||||||
|  |                 model.addAttribute("data", data); | ||||||
|  |             } else { | ||||||
|  |                 model.addAttribute("message", "Not a valid .xls file!"); | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             model.addAttribute("message", "File missing! Please upload an excel file."); | ||||||
|  |         } | ||||||
|  |         return "excel"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @RequestMapping(method = RequestMethod.GET, value = "/readPOI") | ||||||
|  |     public String readPOI(Model model) throws IOException { | ||||||
|  | 
 | ||||||
|  |         if (fileLocation != null) { | ||||||
|  |             if (fileLocation.endsWith(".xlsx")) { | ||||||
|  |                 Map<Integer, ArrayList<String>> data = excelPOIHelper.readExcel(fileLocation); | ||||||
|  |                 model.addAttribute("data", data); | ||||||
|  |             } else { | ||||||
|  |                 model.addAttribute("message", "Not a valid .xlsx file!"); | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             model.addAttribute("message", "File missing! Please upload an excel file."); | ||||||
|  |         } | ||||||
|  |         return "excel"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @RequestMapping(method = RequestMethod.POST, value = "/writeJExcel") | ||||||
|  |     public String writeJExcel(Model model) throws IOException, BiffException, WriteException { | ||||||
|  | 
 | ||||||
|  |         jExcelHelper.writeJExcel(); | ||||||
|  | 
 | ||||||
|  |         model.addAttribute("message", "Write successful!"); | ||||||
|  | 
 | ||||||
|  |         return "excel"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @RequestMapping(method = RequestMethod.POST, value = "/writePOI") | ||||||
|  |     public String writePOI(Model model) throws IOException { | ||||||
|  | 
 | ||||||
|  |         excelPOIHelper.writeExcel(); | ||||||
|  | 
 | ||||||
|  |         model.addAttribute("message", "Write successful!"); | ||||||
|  | 
 | ||||||
|  |         return "excel"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
							
								
								
									
										56
									
								
								spring-mvc-java/src/main/webapp/WEB-INF/view/excel.jsp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								spring-mvc-java/src/main/webapp/WEB-INF/view/excel.jsp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | |||||||
|  | <%@ page language="java" contentType="text/html; charset=ISO-8859-1" | ||||||
|  |     pageEncoding="ISO-8859-1"%> | ||||||
|  | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> | ||||||
|  | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> | ||||||
|  | <html> | ||||||
|  | <head> | ||||||
|  | <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | ||||||
|  | <title>Excel Processing</title> | ||||||
|  | </head> | ||||||
|  | <body> | ||||||
|  | <c:url value="/uploadExcelFile" var="uploadFileUrl" /> | ||||||
|  | <c:url value="/excelProcessing" var="resetUrl" /> | ||||||
|  | <c:url value="/readJExcel" var="readJExcelUrl" /> | ||||||
|  | <c:url value="/writeJExcel" var="writeJExcelUrl" /> | ||||||
|  | <c:url value="/readPOI" var="readPOIUrl" /> | ||||||
|  | <c:url value="/writePOI" var="writePOIUrl" /> | ||||||
|  | 
 | ||||||
|  | <form method="post" enctype="multipart/form-data" action="${uploadFileUrl}" > | ||||||
|  | <input type="file" name="file" accept=".xls,.xlsx"/> | ||||||
|  | <input type="submit" value="Upload file"/> | ||||||
|  | </form> | ||||||
|  | <br /> | ||||||
|  | ${message } | ||||||
|  | <br /> <br /> | ||||||
|  | <form method="GET" action="${resetUrl}" > | ||||||
|  | <input type="submit" value="Reset" /> | ||||||
|  | </form> | ||||||
|  | <br /> <br /> | ||||||
|  | <a href="${readJExcelUrl}">Read file using JExcel</a>     | ||||||
|  | <a href="${readPOIUrl}">Read file using Apache POI</a> | ||||||
|  | <br /> <br />  | ||||||
|  | 
 | ||||||
|  | File content: | ||||||
|  | <c:if test="${not empty data}"> | ||||||
|  | <table style="border:1px solid black;border-collapse:collapse;"> | ||||||
|  | <c:forEach items="${data}" var="row"> | ||||||
|  | <tr> | ||||||
|  |     <c:forEach items="${row.value}" var="cell"> | ||||||
|  |         <td style="border:1px solid black">${cell}</td> | ||||||
|  |     </c:forEach> | ||||||
|  | </tr>    | ||||||
|  | </c:forEach> | ||||||
|  | </table> | ||||||
|  | </c:if> | ||||||
|  | <br /> <br /> | ||||||
|  | <form action="${writeJExcelUrl}" method="POST"> | ||||||
|  | <input type="submit" value="Write to file using JExcel" /> | ||||||
|  | </form> | ||||||
|  | <br /> | ||||||
|  | <form action="${writePOIUrl}" method="POST"> | ||||||
|  | <input type="submit" value="Write to file using Apache POI" /> | ||||||
|  | </form> | ||||||
|  | 
 | ||||||
|  |     | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user