1.环境:Spring+SpringMVC+Mybatis+Maven
2.导入POI对应的包

<!--excel解析poi包 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.0</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>4.1.0</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.0</version>
</dependency>

3.POI导出Excel日期格式的出来,如果不处理日期将会是一串数字
例如:正确显示2019-01-01,不处理显示:2365489652

1)第一种:在日期字段添加注解(推荐)
     <1>使用maven引入@JsonFormat,@DateTimeFormat所需要的jar包
     <!--JsonFormat-->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.8.8</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.8</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>
      <!-- DateTimeFormat:joda-time -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.3</version>
        </dependency>
       <2>@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
           1,pattern:是需要转换的时间日期的格式
           2.timezone:是时间设置为东八区,避免时间在转换中有误差
           3.@JsonFormat注解可以在属性的上方,同样可以在属性对应的get方法上,两种方式没有区别
       <3>@DateTimeFormat(pattern = "yyyy-MM-dd")
           1.@DateTimeFormat的使用和@JsonFormat差不多
       <4>注解@JsonFormat主要是后台到前台的时间格式的转换
       <5>注解@DataFormAT主要是前后到后台的时间格式的转换
       <6>一般需要取数据到前台,也需要前台数据传到后台,需要同时使用    
(2)第二种:在Excel设置日期字段时进行格式化处理
      // 日期格式化
	  HSSFCell cell = rowDate.createCell(0);
	  DateFormat from_date = new SimpleDateFormat("yyyy-MM-dd");
		if (null != user.getSensor_desc()) {
		   cell.setCellValue(from_date.format(user.getFrom_date()));
			}

3.实体类User

package com.itheima.entity
public class  User  implements Serializable {
	private static final long serialVersionUID = 1L;
	private int id;//主键
	private int age;//客户年龄
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
	private String userdate;//日期
	private String username;//客户名称
	private String usertype;//类型
	private String userage;	//状态
	省略Get/Set方法......
}
注意:当使用注解格式化日期时,必须是String类型的

4.持久层接口:DAO层

package com.itheima.mapper
@Repository
public interface UserDao {
	List<User> queryExcelInfo();
	List<User> findByAge(int age);
    User findById(long id);
    int insertUser(User user);
    int updateUser(User user);
    int deleteUser(long id);
}

5.DAO层的配置文件mapper.xml:实现持久层接口

<mapper namespace="com.itheima.mapper.UserDao ">
<select id="findById" parameterType="long" resultType="com.itheima.entity.User">
		select * from table_user WHERE id = #{id}
</select>
</mapper>1)namespace:填写映射当前的Mapper接口类路径
(2)id:填写在XxxMapper接口中的方法名, id 和接口方法名要一致
(3)parameterType:填写参数的类型
(4)resultType:填写方法中返回值的类型,表示输出结果的类型
(5)#{ } 表示传入的动态参数的占位符

6.输入参数 parameterType

(1)这个属性是可选的,MyBatis 可以通过TypeHandler推断出具体传入语句的参数,这个属性的默认值是unset
(2)往往在开发的时候还是主动进行了限定,因为很多时候传入的将会是一个封装了参数的类
(3)其值是将会传入这条语句的参数类的 “完全限定名” 或 “别名”(参见mybatis-config.xml全局配置文件说明中的typeAliases)

7.输出结果 resultType / resultMap

(1)要么使用 resultType,要么使用 resultMap,两者不能同时出现在相同的语句标签中
(2)resultType - 返回的期望类型的类的完全限定名或别名(参见mybatis-config.xml全局配置文件说明中的typeAliases)
(3)如果不管传入的参数还是返回类型,只要是对类操作,就和parameterType的使用性质是一样的,可以使用别名
(4)resultMap - 外部 resultMap 的命名引用
   1.在select标签之外,有一个同级的标签,也叫resultMap(刚提到的resultMap是作为select标签的属性出现)
   2.该标签主要针对一些复杂的结果映射,用来 “描述语句和对象之间的映射关系”

8.resultType / resultMap区别

(1)使用ResultType作为输出映射,只有查询出来的列名和对象属性名一致才可映射成功
    <1>如果对象属性名和数据库字段映射一致,使用ResultType
    <2>ResultType使用实例:
        1.语法:ResultType="对象的完整包路径"
        2.示例:ResultType="com.entity.User"
(2)根据实际情况,如果列名和对象属性名映射不一致,需要定义一个resultMap来描述两者之间的关系
<mapper namespace="com.itheima.mapper.UserDao">
    <!--定义resultMap-->
    <resultMap id="userResultMap" type="com.itheima.entity.User">
        <!--id表查询结果中的唯一标识-->
        <id property="id" column="id" />
        <!--result表示对普通列名的映射,property表示对象属性名,column表查询出的列名-->
        <result property="age" column="age" />
        <result property="cupSize" column="cup_size" />
    </resultMap>
    <!--引用外部resultMap,即girlResultMap-->
    <select id="findById" parameterType="long" resultMap="userResultMap">
        SELECT * FROM table_user WHERE id = #{id}
    </select>
</mapper>

9.insert, update 和 delete

<!--使用了useGeneratedKeys和keyProperty来将生成的主键设置到对象属性中-->
<insert id="insertUser" parameterType="com.itheima.mapper.UserDao" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO table_user(age)
    VALUES (#{age})
</insert>
<update id="updateUser" parameterType="com.itheima.mapper.UserDao">
    UPDATE table_user
    SET age = #{age}
    WHERE id = #{id}
</update>
<delete id="deleteUser" parameterType="long">
    DELETE FROM table_user
    WHERE id = #{id}
</delete>
(1)insert / update / delete 都没有 resultType 或 resultMap,他们的返回值是受影响的行数
(2)若数据库支持自动生成主键,可设置 useGeneratedKeys 为 true,并使用 keyProperty 将生成的主键值设置到目标属性上

10.sql标签

(1)sql元素用来定义可重用的SQL代码片段,其他语句可以用过 <include> 标签来将之包含其中
<mapper namespace="com.itheima.mapper.UserDao">
    <resultMap id="userResultMap" type="com.itheima.entity.User">
        <id property="id" column="id" />
        <result property="age" column="age" />
        <result property="cupSize" column="cup_size" />
    </resultMap>
    <!--定义可重用的sql片段-->
    <sql id="userColumn">
      id, age
    </sql>
    <select id="findById" parameterType="long" resultMap="userResultMap">
        <!--通过include引用外部sql片段-->
        SELECT <include refid="userColumn" />
        FROM girl WHERE id = #{id}
    </select>
</mapper>

11.业务层接口:Service层

package com.itheima.service
public interface UserService {
	List<User> queryExcelInfo();
	List<User> findByAge(int age);
    User findById(long id);
    int insertUser(User user);
    int updateUser(User user);
    int deleteUser(long id);
}

11.业务层接口实现类:ServiceImpl

package com.itheima.service.impl
@Service
public class UserService Impl implements UserService {
 @Resource
 private UserDao userDao;
public List<User> queryExcelInfo(){
		return UserDao.queryExcelInfo();
	}
}

12.控制层:Contorller层

package com.itheima.controller
@Controller
@RequestMapping("/user")
public class UserContorller {
private static final Logger logger = LoggerFactory.getLogger(UserContorller .class);
    @Resource
	private UserService userService;
	 @RequestMapping("/excel")
	public void excel(HttpServletResponse response )throws IOException {
		 response.setCharacterEncoding("UTF-8");  
		 // 从数据库读取数据
		 List<User> list = uaerService.queryExcelInfo();
	     System.out.println(list);
	      //创建excel文件
	      HSSFWorkbook wb = new HSSFWorkbook();
	      //创建sheet页
	      HSSFSheet sheet = wb.createSheet("客户信息表");
	      //创建标题行
	      HSSFRow titleRow = sheet.createRow(0);
	      //创建单元格
		 HSSFCell cell = null;
        // excel标题表头
		String[] titles = { "日期", "客户年龄", "客户名称", "类型", "状态" };
        // 设置值表头 设置表头居中
		HSSFCellStyle style = wb.createCellStyle();
		// 创建一个居中格式
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
		//方式一:使用for循环在创建的标题行中,设置标题
		for(int i = 0;i<titles.length;i++){
		//创建标题行的单元格
		cell = titleRow.createCell(i);
		//单元格赋值
		cell.setCellValue(titles[i]);
		//设置单元格居中
		cell.setCellStyle(style);
         }
         //方式二:直接创建单元格并赋值
	     titleRow.createCell(0).setCellValue("日期");
	     titleRow.createCell(2).setCellValue("客户年龄");
	     titleRow.createCell(3).setCellValue("客户名称");
	     titleRow.createCell(4).setCellValue("类型");
	     titleRow.createCell(5).setCellValue("状态");
	      //遍历将数据放到excel列中
            for (User user : list) {
                HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum()+1);
                dataRow.createCell(0).setCellValue(user.getCustomdate());
                dataRow.createCell(1).setCellValue(user.getAge());
                dataRow.createCell(2).setCellValue(user.getCustomname());
                dataRow.createCell(3).setCellValue(user.getCustomtype());
                dataRow.createCell(4).setCellValue(user.getCustomstatus());
            }
               // 设置下载时客户端Excel的名称 
                response.setContentType("application/octet-stream;charset=utf-8");
                response.setHeader("Content-Disposition", "attachment;filename="
                           + new String("客户名单".getBytes(),"iso-8859-1") + ".xls");
               OutputStream ouputStream = response.getOutputStream();  
               wb.write(ouputStream);  
               ouputStream.flush();  
               ouputStream.close();
}
	}

13.前端

<div>
            <button onclick="d()">导出</button>
</div> 
<script type="text/javascript">
          function d(){window.location.href="<%=basePath%>sensor/exportExcel";}     
</script>
<!--调用即可-->
<a href="${pageContext.request.contextPath}/sensor/exportExcel">导出Excel表格</a>

注:参考网址https://www.cnblogs.com/deng-cc/p/9329192.html

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐