此处以SpringMVC框架,maven项目为例:
首先pom.xml中导入支持:
<!-- 处理excel表格需要的jar包 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15-beta2</version>
</dependency>
工具类包含读取Excel里的数据,以及将读取到的数据生成自己所需的Excel表
工具类如下:
package com.mvc.example.ToolUtil;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
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 com.mvc.example.entity.User;
public class ExcelTool {
//【读取Excel表中的数据并返回】
public List<User> getDataFromExcel(InputStream input , String fileName)throws Exception{
List<User> userData = new ArrayList<>();//【从Excel表拿到的数据】
Workbook workbook = null;//【创建Excel工作薄】
String fileType = fileName.substring(fileName.lastIndexOf("."));//【获取文件尾缀】
if(fileType.equals(".xls")) { //【Excel 2003版本】
workbook = new HSSFWorkbook(input);
}else if(fileType.equals(".xlsx")) {//【Excel 2007版本】
workbook = new XSSFWorkbook(input);
}
if(workbook!=null) {
Sheet sheet = workbook.getSheetAt(0);
int excelRows = sheet.getPhysicalNumberOfRows();//【Excel表的行数】
int excelCells = 0;//【Excel表的列数】
if(excelRows >= 1 && sheet.getRow(0) != null) {
excelCells = sheet.getRow(0).getPhysicalNumberOfCells();//【Excel表的列数】
}
for(int i=1;i<excelRows;i++) {//【遍历Excel表的行数,从第二行开始,标题行不用获取】
Row row = sheet.getRow(i);//【第i行】
if(row == null) {
continue;
}
User user = new User();
for(int j=0;j<excelCells;j++) {
Cell cell = row.getCell(j);//【第i行的第j列数据】
if(cell != null) {
cell.setCellType(Cell.CELL_TYPE_STRING);//【设置Cell获取数据类型为String】
switch(j) {
case 0://【用户名】
user.setUsername(cell.getStringCellValue());
System.out.println("从Excel表中读到得用户名:"+cell.getStringCellValue());
break;
case 1://【真实姓名】
user.setRealName(cell.getStringCellValue());
break;
case 2://【电话号码】
String regPhone = "^((17[0-9])|(14[0-9])|(13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
Pattern patPhone = Pattern.compile(regPhone);
Matcher matPhone = patPhone.matcher(cell.getStringCellValue());
if(matPhone.matches()) {// 【电话号码是否与正则表达式相匹配】
user.setPhone(cell.getStringCellValue());
user.setPassword(cell.getStringCellValue());//【初始密码】
}else {
user.setPhone("");//【电话号码】
user.setPassword("123456789");//【初始密码】
}
break;
case 3://【电子邮箱】
String regEmail = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
Pattern patEmail = Pattern.compile(regEmail);
Matcher matEmail = patEmail.matcher(cell.getStringCellValue());
if(matEmail.matches()) {// 【电子邮箱是否与正则表达式相匹配】
user.setEmail(cell.getStringCellValue());
}else {
user.setEmail("");
}
break;
case 4://【用户类型】
if(cell.getStringCellValue().equals("管理员")) {
user.setUserType("1");
}else {
user.setUserType("0");
}
break;
case 5://【备注信息】
user.setRemark(cell.getStringCellValue());
user.setUserStatus("1");
user.setGrants("0");
user.setFingerMark("0");
break;
}
}
}
userData.add(user);
}
}else {
throw new Exception("创建Excel工作薄失败!请选择Excel文件!");
}
workbook.close();
return userData;
}
//【将获取到的数据生成Excel文件】
@SuppressWarnings("resource")
public String writeDataToExcel(List<User> userData)throws Exception {
Workbook workbook = new XSSFWorkbook();//【创建Excel工作薄】
//【标题行抽出字段】
String[] title = {"序号","登陆名", "真实姓名", "电话号码", "电子邮箱", "用户类型", "账号状态", "备注信息"};
Sheet sheet = workbook.createSheet();
//【获取表头行,并将标题赋值】
Row titleRow = sheet.createRow(0);
CellStyle style = workbook.createCellStyle();//【创建单元格,设置style居中,字体,单元格大小等】
Cell cell = null;
for(int i=0;i<title.length;i++) {//【把已经写好的标题行写入excel文件中】
cell = titleRow.createCell(i);
cell.setCellValue(title[i]);
cell.setCellStyle(style);
}
//【把从数据库中取得的数据一一写入excel文件中】
Row row = null;
for(int n=0;n<userData.size();n++) {//【创建userData.size()行数据】
row = sheet.createRow(n + 1); //【数据写入从第二行开始】
row.createCell(0).setCellValue(n + 1);//【把值一一写进单元格里】【设置第一列为自动递增的序号】
row.createCell(1).setCellValue(userData.get(n).getUsername());
row.createCell(2).setCellValue(userData.get(n).getRealName());
row.createCell(3).setCellValue(userData.get(n).getPhone());
row.createCell(4).setCellValue(userData.get(n).getEmail());
if(userData.get(n).getUserType().equals("1")) {
row.createCell(5).setCellValue("管理员");
}else {
row.createCell(5).setCellValue("普通用户");
}
if(userData.get(n).getUserStatus().equals("1")) {
row.createCell(6).setCellValue("在用");
}else {
row.createCell(6).setCellValue("冻结");
}
row.createCell(7).setCellValue(userData.get(n).getRemark());
}
//【设置单元格宽度自适应,在此基础上把宽度调至1.5倍】
for(int j=0;j<title.length;j++) {
sheet.autoSizeColumn(j,true);
sheet.setColumnWidth(j, sheet.getColumnWidth(j)*3/2);
}
//【获取配置文件中保存对应excel文件的路径,本地也可以直接写成F:excel/stuInfoExcel路径】
String filePath = "C:\\CodeSoftware\\Repository\\";
//【设置文件名】
String fileName = "TestExcel.xlsx";
OutputStream fileOut = new FileOutputStream(filePath + fileName);
workbook.write(fileOut);
fileOut.close();
return filePath + fileName;
}
}
直接调用方法即可进行对应操作。