Java POI Excel导入导出

  • 1.maven引入依赖
  • 2.导入Excel
  • 3.导出Excel

1.maven引入依赖

 <!-- POI  Excel 操作 -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.1</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.1</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.1</version>
</dependency>

2.导入Excel

package com.whiteink.pms.service;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.whiteink.pms.entity.Department;
import com.whiteink.pms.entity.DictItem;
import com.whiteink.pms.entity.ParkingSpace;
import com.whiteink.pms.entity.sys.User;
import com.whiteink.pms.exception.BusinessException;
import com.whiteink.pms.global.Constant;
import com.whiteink.pms.service.sys.UserService;
import com.whiteink.pms.util.MyUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;@Service
public class ImportService {private static String XLS = ".xls";private static String XLSX = ".xlsx";private static Long MAX_SIZE = 1024*1024L;private DepartmentService departmentService;private UserService userService;private DictItemService dictItemService;private ParkingSpaceService parkingSpaceService;public ImportService(DepartmentService departmentService, UserService userService,DictItemService dictItemService, ParkingSpaceService parkingSpaceService) {this.departmentService = departmentService;this.userService = userService;this.dictItemService = dictItemService;this.parkingSpaceService = parkingSpaceService;}/***验证文件*/private void verifyFile(MultipartFile file) throws BusinessException{if (null == file){throw new BusinessException("请上传文件!");}String fileSuffix = file.getOriginalFilename();Long size = file.getSize();if (fileSuffix.endsWith(XLS) || fileSuffix.endsWith(XLSX)){if (size < 0){throw new BusinessException("文件为空!");}else if (size > MAX_SIZE){throw new BusinessException("文件太大,无法导入!");}}else {throw new BusinessException("文件格式不正确!");}}/*** 导入停车位* 返回读取行数,成功插入行数*/public int[] importParking(MultipartFile file) throws Exception{int[] result = {0,0};verifyFile(file);Workbook workbook  = null;//1.读取Excel文档对象--兼容2003版本和2007版本if (Objects.requireNonNull(file.getOriginalFilename()).endsWith(XLS)){// 2003版本workbook = new HSSFWorkbook(file.getInputStream());}// 2007版本workbook = new XSSFWorkbook(file.getInputStream());//2.获取要解析的表格(第一个表格)Sheet sheet = workbook.getSheetAt(0);//获得最后一行的行号int lastRowNum = sheet.getLastRowNum();List<ParkingSpace> parkingSpaces = new ArrayList<>();//遍历每一行for (int i = 1; i <= lastRowNum; i++) {int k = 1;//3.获得要解析的行Row row = sheet.getRow(i);try {if (StringUtils.isEmpty(row.getCell(0).getStringCellValue())&& StringUtils.isEmpty(row.getCell(1).getStringCellValue())&& StringUtils.isEmpty(row.getCell(2).getStringCellValue())){result[0] = i-1;break;}}catch (Exception e){throw new BusinessException("请将表格里面所有列设置为【文本】格式");}//4.获得每个单元格中的内容(String)ParkingSpace parkingSpace = new ParkingSpace();if (StringUtils.isEmpty(row.getCell(k).getStringCellValue())){throw new BusinessException("第"+i+"行,车位编号不可为空!");}parkingSpace.setNumber(row.getCell(k).getStringCellValue());k++;if (StringUtils.isEmpty(row.getCell(k).getStringCellValue())){throw new BusinessException("第"+i+"行,所属停车场不可为空!");}parkingSpace.setParkingLot(row.getCell(k).getStringCellValue());k++;if (StringUtils.isEmpty(row.getCell(k).getStringCellValue())){throw new BusinessException("第"+i+"行,楼层不可为空!");}parkingSpace.setFloor(row.getCell(k).getStringCellValue());k++;if (StringUtils.isEmpty(row.getCell(k).getStringCellValue())){throw new BusinessException("第"+i+"行,区域不可为空!");}parkingSpace.setArea(row.getCell(k).getStringCellValue());parkingSpace.setUsageCount(0);parkingSpace.setStatus(0);parkingSpace.setGmtCreate(LocalDateTime.now());int n = parkingSpaceService.count(new QueryWrapper<ParkingSpace>().eq("number", parkingSpace.getNumber()).eq("floor", parkingSpace.getFloor()).eq("area", parkingSpace.getArea()).eq("parking_lot", parkingSpace.getParkingLot()));if (n <= 0){result[1]++;parkingSpaces.add(parkingSpace);}}parkingSpaceService.saveBatch(parkingSpaces);return result;}
}

3.导出Excel

package com.whiteink.pms.service;import com.whiteink.pms.entity.sys.User;
import com.whiteink.pms.service.sys.UserService;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.net.URLEncoder;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;@Service
public class ExportService {private HttpServletResponse response;private HSSFWorkbook workbook = null;private UserService userService;//添加自动筛选的列 如 A:Mprivate String address = "";//Float类型数据小数位private String floatDecimal = "0.00";//Double类型数据小数位private String doubleDecimal = "0.00";//设置列的公式private String colFormula[] = null;DecimalFormat floatDecimalFormat = new DecimalFormat(floatDecimal);DecimalFormat doubleDecimalFormat = new DecimalFormat(doubleDecimal);public ExportService(UserService userService) {this.userService = userService;}public void exportUsers(HttpServletResponse response) {List<User> users = userService.listStaff();this.response = response;this.workbook = new HSSFWorkbook();String[] titleColumn = {"name", "jobNumber", "companyName", "departmentName", "idCard", "phone", "carNumber", "carType"};String[] titleName = {"员工名", "工号", "单位", "部门", "身份证", "手机号", "车牌号", "车型"};int[] titleSize = {15,15,30,20,30,15,15,15};writeExcel(titleColumn, titleName, titleSize, users);}/*** 写excel.* xls方式* @param titleColumn 对应bean的属性名* @param titleName   excel要导出的列名* @param titleSize   列宽* @param dataList    数据*/public void writeExcel(String[] titleColumn, String[] titleName, int[] titleSize, List<?> dataList) {String sheetName = "基本信息";String fileName = "员工信息";//添加Worksheet(不添加sheet时生成的xls文件打开时会报错)Sheet sheet = workbook.createSheet(sheetName);//新建文件OutputStream out = null;try {//直接写到输出流中out = response.getOutputStream();fileName += ".xls";response.setContentType("application/force-download");response.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(fileName,"utf-8"));//写入excel的表头Row titleNameRow = workbook.getSheet(sheetName).createRow(0);//设置标题样式CellStyle titleStyle = workbook.createCellStyle();titleStyle = (HSSFCellStyle) setFontAndBorder(titleStyle, "Arial Unicode MS", (short) 12, true);titleStyle = (HSSFCellStyle) setColor(titleStyle, "C1FBEE", (short) 10);for (int i = 0; i < titleName.length; i++) {//设置宽度sheet.setColumnWidth(i, titleSize[i] * 256);Cell cell = titleNameRow.createCell(i);cell.setCellStyle(titleStyle);cell.setCellValue(titleName[i].toString());}//为表头添加自动筛选if (!"".equals(address)) {CellRangeAddress c = (CellRangeAddress) CellRangeAddress.valueOf(address);sheet.setAutoFilter(c);}//通过反射获取数据并写入到excel中if (dataList != null && dataList.size() > 0) {//设置内容样式HSSFCellStyle dataStyle = workbook.createCellStyle();CellStyle bodyStyle = workbook.createCellStyle();bodyStyle = (HSSFCellStyle) setFontAndBorder(bodyStyle, "宋体", (short) 10, false);if (titleColumn.length > 0) {for (int rowIndex = 1; rowIndex <= dataList.size(); rowIndex++) {//获得该对象Object obj = dataList.get(rowIndex - 1);//获得该对对象的class实例Class clsss = obj.getClass();Row dataRow = workbook.getSheet(sheetName).createRow(rowIndex);for (int columnIndex = 0; columnIndex < titleColumn.length; columnIndex++) {String title = titleColumn[columnIndex].toString().trim();//字段不为空if (!"".equals(title)) {//使首字母大写String UTitle = Character.toUpperCase(title.charAt(0)) + title.substring(1, title.length());String methodName = "get" + UTitle;// 设置要执行的方法Method method = clsss.getDeclaredMethod(methodName);//获取返回类型String returnType = method.getReturnType().getName();Object object = method.invoke(obj);String data = method.invoke(obj) == null ? "" : object.toString();Cell cell = dataRow.createCell(columnIndex);if (!StringUtils.isEmpty(data)) {if ("int".equals(returnType)) {cell.setCellValue(Integer.parseInt(data));} else if ("long".equals(returnType)) {cell.setCellValue(Long.parseLong(data));} else if ("float".equals(returnType)) {cell.setCellValue(floatDecimalFormat.format(Float.parseFloat(data)));} else if ("double".equals(returnType)) {cell.setCellValue(doubleDecimalFormat.format(Double.parseDouble(data)));} else if (Date.class.getName().equals(returnType)) {cell.setCellValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(object));} else {cell.setCellValue(data);}cell.setCellStyle(bodyStyle);}else {cell.setCellStyle(bodyStyle);}} else {   //字段为空 检查该列是否是公式if (colFormula != null) {String sixBuf = colFormula[columnIndex].replace("@", (rowIndex + 1) + "");Cell cell = dataRow.createCell(columnIndex);cell.setCellFormula(sixBuf);}}}}}}workbook.write(out);} catch (Exception e) {e.printStackTrace();} finally {if (out != null) {try {out.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 设置字体并加外边框** @param style 样式* @param style 字体名* @param style 大小* @return*/private CellStyle setFontAndBorder(CellStyle style, String fontName, short size, boolean bold) {HSSFFont font = workbook.createFont();font.setFontHeightInPoints(size);font.setFontName(fontName);font.setBold(bold);style.setFont(font);//下边框style.setBorderBottom(BorderStyle.THIN);//左边框style.setBorderLeft(BorderStyle.THIN);//上边框style.setBorderTop(BorderStyle.THIN);//右边框style.setBorderRight(BorderStyle.THIN);return style;}/*** 将16进制的颜色代码写入样式中来设置颜色** @param style 保证style统一* @param color 颜色:66FFDD* @param index 索引 8-64 使用时不可重复* @return*/private CellStyle setColor(CellStyle style, String color, short index) {if ("".equals(color)) {//转为RGB码int r = Integer.parseInt((color.substring(0, 2)), 16);int g = Integer.parseInt((color.substring(2, 4)), 16);int b = Integer.parseInt((color.substring(4, 6)), 16);//自定义cell颜色HSSFPalette palette = workbook.getCustomPalette();palette.setColorAtIndex((short) index, (byte) r, (byte) g, (byte) b);style.setFillPattern(FillPatternType.SOLID_FOREGROUND);style.setFillForegroundColor(index);}return style;}
}

参考文档:https://www.jianshu.com/p/9fd84f1ce725

Java POI Excel导入导出相关推荐

  1. Java POI——Excel导入导出的列英文字母与数字的互转方法记录

    因项目需要,写了递归实现POI--excel英文字母列转列编号,记录. 规则1:excel英文字母列转数字编号:A→0,B→1,Z→25,AA→26,ZZ→701,AAA→702 - public i ...

  2. java实现excel导入导出,对象图片读取,上传七牛云

    java实现excel导入导出以及解决方案 因为公司业务需求,要完成针对表格的导入导出,excel这里使用MultipartFile类接收 ,下面是部分关键代码,希望有所帮助 //获取excel文件的 ...

  3. Java实现Excel导入导出操作详解

    前言 本次封装是基于 POI 的二次开发,最终使用只需要调用一个工具类中的方法,就能满足业务中绝大部门的导入和导出需求. 1. 功能测试 1.1 测试准备 在做测试前,我们需要將[2. 环境准备]中的 ...

  4. Java操作Excel导入导出(EasyExcel)

    在管理一个系统时,总会有许多的数据,为了方便浏览查看数据,系统总会提供「导出Excel」的功能:有导出就有导入,在要向数据库中插入大量的数据时,我们向程序提供准备好的 Excel,然后程序读取表格内容 ...

  5. Java实现Excel导入导出操作

    java 对excel的导入及导出 最近在做对excel的导入导出,在平常的工作中,导入导出excel数据是常见的需求,今天就简单的记录一下Java是如何来实现这个功能的,感兴趣或者正好大家在工作中遇 ...

  6. Java实现Excel导入导出

    1.Excel导入 总结一下目标,就是要将excel中的数据行.逐一提取,最后得到一个list,这个list的每个元素就是excel的每个数据行的实例,之后的操作就是常规的java逻辑处理了. 可以把 ...

  7. java实现excel导入导出(jxl),Java面试题及解析

    */ public interface ExcelService { void export(HttpServletResponse response, HttpServletRequest requ ...

  8. java实现excel导入导出(jxl),Java入门你值得拥有

    private ExcelService excelService = new ExcelJxlServiceImpl(); @Autowired private ObjectMapper objec ...

  9. java开发excel导入导出工具类基于EasyExcel

    一.工具类 import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.style.column.LongestMatchCo ...

最新文章

  1. boxfilter 实现
  2. android wifi定位服务,如何在Android中使用Wifi获取位置?
  3. C#中类的继承问题04
  4. 两数之和Python解法
  5. js实现炫酷数字效果
  6. 鸿蒙有没有手机管家,鸿蒙2.0手机快了,华为EMUI 11透露关键信息
  7. 《了凡四训》,仅仅12句,改变你的命运
  8. 光模块自动测试系统软件,可插拔收发光模块自动化检测系统
  9. 音视频技术开发周刊 | 243
  10. 自动量化炒股软件是什么?
  11. MEGA-X 3D打印机教程:01_我的第一台3D打印机参数
  12. z反变换计算机控制,计算机控制4.Z变换.ppt
  13. 1041: 数列求和1
  14. Linux加密文件系统eCryptfs介绍
  15. 旅游类网站的服务器配置,旅游各类 网站界面
  16. python求反余弦_python数学.acos反余弦问题
  17. mac如何查看IP地址,mac怎么查看IP地址
  18. MySQL实战——表、索引创建与优化
  19. mp4分离h265_音视频封装:MP4结构概述和分析工具
  20. 用Python驱动Headless Chrome

热门文章

  1. 计算机专业职业规划英语小作文,关于职业规划的英语作文带翻译
  2. 产品几何技术规范(GPS) 线性尺寸公差ISO代号体系
  3. 数学建模常用算法—因子分析
  4. 如何简单适用制作木纹背景
  5. centos 修改host
  6. 学习笔记_记一次植物大战僵尸的破解
  7. Windows性能监视器使用说明
  8. python列表如何求增长率_python求平均值
  9. Pyecharts Geo在地图上添加坐标点
  10. 解除合同通知对方拒收还有法律效力吗