文件导出:EasyPOI 导入导出
使用SpringBoot、Mybatis框架对SQL数据库表数据进行导入导出。
用的返回 AjaxResult 是 若依框架的。
代码:
pom依赖:
<!-- lombok 可自动添加javaBean结构 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- excel --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.15</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-web</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-annotation</artifactId> <version>3.2.0</version> </dependency>
工具类:
public class ExcelUtil { /** * 导出 (将给定的数据列表写入到指定路径的 Excel 文件中) * @param title 导出 Excel 表格的标题。 * @param sheetName Excel 表格中的工作表的名称。(也就是表格左下角的标签页) * @param pojoClass 是一个类对象,表示包含要导出数据的实体类的字节码。 * @param lists 是一个泛型列表,包含要写入 Excel 表格的数据。(数据集合) * @param pathName 将要写入的 Excel 文件的路径。(导出的本地路径) * @throws IOException */ public static void outPut(String title, String sheetName, Class<?> pojoClass, List<?> lists, String pathName) throws IOException { // Workbook (Excel工作簿的高级表示,可以理解为就是一个excel表) // exportExcel方法,第一个参数是表单信息,第二个参数实体类字节码,第三个参数是写到表格中的列表数据 // new ExportParams("标题","sheet") 导出参数 Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(title,sheetName), pojoClass, lists); // 字节输出流,带有输出的路径 FileOutputStream outputStream = new FileOutputStream(pathName); // 将数据写到excel中 workbook.write(outputStream); // 将工作簿中的数据写入到输出流中,即写入到文件中。 outputStream.close(); workbook.close(); // 关闭输出流和工作簿,以释放资源。 } /** * 导入 (从指定路径的 Excel 文件中读取数据,并将其映射到指定的实体类中,返回一个包含导入数据的列表。) * @param pathName 文件地址 (是要导入的 Excel 文件的本地路径。) * @param pojoClass 是一个类对象,表示将要导入的数据映射到的实体类的字节码。 * @return 要导入的数据集合 */ public static List inPut(String pathName, Class<?> pojoClass){ // 定义导入参数 ImportParams importParams = new ImportParams(); importParams.setStartSheetIndex(0); // 从第一个工作表开始导入数据,表头有两行,没有标题行。 importParams.setHeadRows(2); // 注意此处,若表内有表头,则2;无表头则1 importParams.setTitleRows(0); // 导出数据 参数1:当如excel文件 参数2:导入对象的类型 参数3:导入参数配置 List<XzDept> students = ExcelImportUtil.importExcel(new File(pathName), pojoClass, importParams); return students; } }
此处导入注意,若 有标题 如 用户表,将
importParams.setHeadRows(2); 改为2,没有则改为 1。因为数据库第一行是 字段。
pojo实体类:

/** * 用户管理 */ @Data @AllArgsConstructor @NoArgsConstructor @ExcelTarget("xz_user") public class XzUser { /** 用户ID */ @Excel(name = "userId", orderNum = "1") private Integer userId; /** 部门ID */ @Excel(name = "deptId", orderNum = "2") private Integer deptId; /** 用户账号 */ @Excel(name = "userName", orderNum = "3") private String userName; /** 用户昵称 */ @Excel(name = "nickName", orderNum = "4") private String nickName; /** 用户类型(00系统用户) */ @Excel(name = "userType", orderNum = "5") private String userType; /** 用户邮箱 */ @Excel(name = "email", orderNum = "6") private String email; /** 用户性别(0男 1女 2未知) */ @Excel(name = "sex", orderNum = "7") private String sex; /** 头像地址 */ @Excel(name = "avatar", orderNum = "8") private String avatar; /** 密码 */ @Excel(name = "password", orderNum = "9") private String password; /** 帐号状态(0正常 1停用 */ @Excel(name = "status", orderNum = "10") private String status; /** 删除标志(0代表存在 2代表删除) */ @Excel(name = "delFlag", orderNum = "11") private String delFlag; /** 最后登录IP */ @Excel(name = "loginIp", orderNum = "12") private String loginIp; /** 最后登录时间 */ @Excel(name = "loginDate", orderNum = "13") private Date loginDate; /** 用户手机号 */ @Excel(name = "phoneNumber", orderNum = "14") private String phoneNumber; /** 创建者 */ @Excel(name = "createBy", orderNum = "15") private String createBy; /** 创建时间 */ @Excel(name = "createTime", orderNum = "16") private Date createTime; /** 更新者 */ @Excel(name = "updateBy", orderNum = "17") private String updateBy; /** 更新时间 */ @Excel(name = "updateTime", orderNum = "18") private Date updateTime; /** 备注 */ @Excel(name = "remark", orderNum = "19") private String remark; }
导入:
mapper层:
/** 新增(导入用) */ int insertAll (XzUser xzUser);
resources/mapper:

<sql id="xzUser"> user_id, dept_id, user_name, nick_name, user_type, email, sex, avatar, password, status, del_flag, login_ip, login_date, phonenumber, create_by, create_time, update_by, update_time, remark </sql> <!-- 新增(导入用)--> <insert id="insertAll"> insert into xz_user (<include refid="xzUser"/>) values (#{userId}, #{deptId}, #{userName}, #{nickName}, #{userType}, #{email}, #{sex}, #{avatar}, #{password}, #{status}, #{delFlag}, #{loginIp}, #{loginDate}, #{phoneNumber}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime}, #{remark}) </insert>
service层:
/** 用户导入 */ AjaxResult input(String pathName);
impl:
/** * 用户表导入 * @param pathName 本地路径 * @return 成功 ? 失败 */ @Override public AjaxResult input(String pathName) { List<XzUser> ined = ExcelUtil.inPut(pathName, XzUser.class); if (ined.isEmpty()) { return AjaxResult.error("导入失败:未找到要找的数据"); } for (XzUser xzUser : ined) { xzUser.toString(); } for (XzUser xzUser : ined) { xzUser.setCreateTime(new Date()); xzUser.setUpdateTime(new Date()); xzUserMapper.insertAll(xzUser); } return ined != null ? AjaxResult.success("导入成功") : AjaxResult.error("导入失败"); }
controller层:
/** * 用户表导入 * @param pathName 本地路径 * @return 成功 ? 失败 */ @PostMapping("/input") public AjaxResult input(String pathName) { AjaxResult input = iXzUserService.input(pathName); // 调mapper接口 return AjaxResult.success(input); }
跑一下
导出:
实体类用上面的。
mapper层:(这里用的参数较多,可以写一个新的;此处有参,别处调用时可用 null, 代替)
/** 部门查询全部 条件:登录名称、手机号、状态、时间区间 */ List<XzUser> selectAll(@Param("userName") String userName, @Param("phoneNumber") String phoneNumber, @Param("status") String status, @Param("createTime") String createTime, @Param("endTime") String endTime);
resources/mapper:(用的较活,可写简单的替代)

<resultMap id="xzUser" type="com.ruoyi.xinzhi.model.pojo.XzUser"> <id property="userId" column="user_id"></id> <id property="deptId" column="dept_id"></id> <id property="userName" column="user_name"></id> <id property="nickName" column="nick_name"></id> <id property="userType" column="user_type"></id> <id property="email" column="email"></id> <id property="sex" column="sex"></id> <id property="avatar" column="avatar"></id> <id property="password" column="password"></id> <id property="status" column="status"></id> <id property="delFlag" column="del_flag"></id> <id property="loginIp" column="login_ip"></id> <id property="loginDate" column="login_date"></id> <id property="phoneNumber" column="phonenumber"></id> <id property="createBy" column="create_by"></id> <id property="createTime" column="create_time"></id> <id property="updateBy" column="update_by"></id> <id property="updateTime" column="update_time"></id> <id property="remark" column="remark"></id> </resultMap> <sql id="xzUser"> user_id, dept_id, user_name, nick_name, user_type, email, sex, avatar, password, status, del_flag, login_ip, login_date, phonenumber, create_by, create_time, update_by, update_time, remark </sql>
service层:
/** 用户导出 */ AjaxResult out(String title, String sheetName, String pathName);
impl:(调的mapper内的接口参用null代替)
/** * 用户表导出 * @param title 表头 * @param sheetName 标签页 * @param pathName 路径 */ @Override public AjaxResult out(String title, String sheetName, String pathName) { List<XzUser> selected = xzUserMapper.selectAll(null, null, null, null, null); try { ExcelUtil.outPut(title, sheetName, XzUser.class, selected, pathName); } catch (IOException e) { throw new RuntimeException(e); } return selected != null ? AjaxResult.success("导出成功") : AjaxResult.error("导出失败"); }
controller层:
/** * 用户表导出 * @param title 表头 * @param sheetName 标签页 * @param pathName 路径 */ @PostMapping("/out") public AjaxResult out(String title, String sheetName, String pathName) { AjaxResult outed = iXzUserService.out(title, sheetName, pathName); return AjaxResult.success(outed); }
跑一下:
注意:pathName为本地路径,在\后是 拟的文件名,切记加后缀.xlsx 或 xls
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)