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> | ||||
|         </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> | ||||
| 
 | ||||
|     <build> | ||||
| @ -370,6 +392,10 @@ | ||||
| 
 | ||||
|         <!-- AspectJ --> | ||||
|         <aspectj.version>1.8.9</aspectj.version> | ||||
| 		 | ||||
|         <!-- excel --> | ||||
|         <poi.version>3.16-beta1</poi.version> | ||||
|         <jexcel.version>1.0.6</jexcel.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </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.XmlViewResolver; | ||||
| import org.springframework.web.util.UrlPathHelper; | ||||
| import com.baeldung.excel.*; | ||||
| 
 | ||||
| @Configuration | ||||
| @EnableWebMvc | ||||
| @ -106,4 +107,15 @@ public class WebConfig extends WebMvcConfigurerAdapter { | ||||
| 
 | ||||
|         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