文件导出: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;
    
}
user实体类
复制代码

 

导入:


 

  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>
sql语句
复制代码

 

  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>
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

 

 

posted @   学Java的`Bei  阅读(299)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示