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";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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…
Reference in New Issue