POI---JAVA导出Excel文件<三>SSH搭建&读取数据库&WEB环境导出Excel

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kyle0349/article/details/51802254

说明:前20点内容主要是SSH的搭建(复习)
(本文重点是25点 导出到Excel表格 ,熟悉SSH的话可以跳过直接看第25点)

1、创建web项目 ssh_POI ,在lib目录下引入jar包
因为之前打包了SSH相关的包,所以这次也是一次性全部引入(用maven管理jar包会好很多…)。
(项目的结构图)
这里写图片描述这里写图片描述

2、创建实体类 并创建映射文件

package cn.poi.entity;
/**
* 用户实体类
*/
public class User {
    private String id;
    private String userName;
    private String password;
    private int age;
    private String gender;
    private String phone;
    private String dept;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getDept() {
        return dept;
    }
    public void setDept(String dept) {
        this.dept = dept;
    }
    public User() {
        super();
        // TODO Auto-generated constructor stub
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public User(String id, String userName, String password, int age, String gender, String phone, String dept) {
        super();
        this.id = id;
        this.userName = userName;
        this.password = password;
        this.age = age;
        this.gender = gender;
        this.phone = phone;
        this.dept = dept;
    }
}

映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping  package="cn.poi.entity">
    <class name="User" table="user">
        <id name="id" column="id">
            <generator class="uuid.hex"></generator>
        </id>
        <property name="userName" ></property>
        <property name="password" ></property>
        <property name="age" ></property>
        <property name="gender" ></property>
        <property name="phone" ></property>
        <property name="dept" ></property>
    </class>
</hibernate-mapping>

3、在src目录下创建applicationContext.xml文件
applicationContext.xml常用的配置信息
+++++++++++++++
A、对象的创建
B、数据源dataSource
C、sessionFactory
D、事务管理
+++++++++++++++

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- UserDao 对象 -->
    <bean id="userDao" class="cn.poi.dao.impl.UserDaoImpl">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <!-- UserService 对象 -->
    <bean id="userService" class="cn.poi.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"></property>
    </bean>

    <!-- 导入数据库连接信息 -->
    <context:property-placeholder location="classpath:db.properties"/>

    <!-- datasource数据源 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="jdbcUrl" value="${jdbcUrl}"></property>
        <property name="driverClass" value="${driverClass}"></property>
        <property name="user" value="${user}"></property>
        <property name="password" value="${password}"></property>
        <!-- 初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
        <property name="initialPoolSize" value="${initialPoolSize}"></property>
        <!-- 连接池中保留的最小连接数。Default: 3 -->
        <property name="minPoolSize" value="3"></property>
        <!-- 连接池中保留的最大连接数。Default: 15 -->
        <property name="maxPoolSize" value="${maxPoolSize}"></property>
        <!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
        <property name="acquireIncrement" value="3"></property>
        <!-- 最大空闲时间,1800秒内未使用则连接被丢弃,若为0则永不丢弃。Default: 0 -->
        <property name="maxIdleTime" value="1800"></property>
    </bean>

    <!-- sessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>

        <!-- hibernate相关链接 -->
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="javax.persistence.validation.mode">none</prop>
            </props>
        </property>

        <!-- 映射文件路径 -->
        <property name="mappingLocations">
            <list>
                <value>classpath:cn/poi/entity/User.hbm.xml</value>
            </list>
        </property>


    </bean>

    <!-- 事务管理 -->
    <!-- 创建事务管理器 -->
    <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

    <!-- 事务通知 -->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <!-- 规定所有以find,list,get开头的方法,对数据库只有读取功能,不能修改数据库 -->
            <tx:method name="find*" read-only="true"/>
            <tx:method name="list*" read-only="true"/>
            <tx:method name="get*" read-only="true"/>
            <!-- 只要抛出异常,就回滚事务 -->
            <tx:method name="*" rollback-for="Throwable"/>
        </tx:attributes>
    </tx:advice>

    <!-- aop配置事务管理的类 -->
    <aop:config>
        <aop:pointcut expression="execution(* cn.poi.service.impl.*.*(..))" id="serviceOper"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOper" />
    </aop:config>   

</beans>

4、创建UserDao接口

package cn.poi.dao;

import java.io.Serializable;
import java.util.List;
import cn.poi.entity.User;

public interface UserDao {

public void save(User user);//保存

public void delete(User user);//删除

public void update(User user);//更新

public List<User> getAll();//查询所有用户

public User findById(Serializable id);//根据主键查找用户

}

5、创建UserDao实现类UserDaoImpl

package cn.poi.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import cn.poi.dao.UserDao;
import cn.poi.entity.User;

public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

    public void save(cn.poi.entity.User user) {
        getSession().save(user);
    }

    public void delete(cn.poi.entity.User user) {
        getSession().delete(user);
    }

    public void update(cn.poi.entity.User user) {
        getSession().update(user);
    }

    public List<User> getAll() {
        return getSession().createQuery("FROM User").list();
    }

    public User findById(Serializable id) {
        return (User) getSession().createQuery("FROM User WHERE id = ? ")//
                                  .setParameter(0, id).list().get(0);
    }
}

6、创建UserService接口

package cn.poi.service;

import java.io.Serializable;
import java.util.List;

import cn.poi.entity.User;

public interface UserService {

public void save(User user);// 保存

public void delete(User user);// 删除

public void update(User user);// 更新

public List<User> getAll();// 查询所有用户

public User findById(Serializable id);// 根据主键查找用户
}

7、创建UserService接口实现类UserServiceImpl

package cn.poi.service.impl;

import java.io.Serializable;
import java.util.List;
import cn.poi.dao.UserDao;
import cn.poi.entity.User;
import cn.poi.service.UserService;

public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public void save(User user) {
        userDao.save(user);
    }

    public void delete(User user) {
        userDao.delete(user);
    }

    public void update(User user) {
        userDao.update(user);
    }

    public List<User> getAll() {
        return userDao.getAll();
    }

    public User findById(Serializable id) {
        return userDao.findById(id);
    }

    public UserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

8、写测试类

package cn.poi.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.poi.entity.User;
import cn.poi.service.UserService;

public class Test {

    //获取spring容器
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

    @org.junit.Test
    public void testDBConection(){
        User user = new User();
        user.setUserName("Truly");
        user.setAge(20);
        user.setDept("行政");
        user.setGender("female");
        user.setPassword("123456");
        user.setPhone("13866666666");
        UserService userService = (UserService) applicationContext.getBean("userService");
        userService.save(user);
    }
}

9、根据db.properties配置信息,在创建一个数据库,不需要创建表,由hibernate自动创建

jdbcUrl=jdbc:mysql://localhost:3306/sshpoi?useUnicode=true&amp;characterEncoding=utf8
driverClass=com.mysql.jdbc.Driver
user=root
password=root
initialPoolSize=10
maxPoolSize=30

10、测试结果
这里写图片描述
在对应数据库,hibernate自行创建了一张User表,并将User信息写进表中,
说明数据库连接没问题,spring和hibernate的整合没问题,可以继续整合Struts2.
11、引入Struts2相关的jar包(前面已经统一引入)
12、在WebRoot/WEB-INF目录下的web.xml配置Struts2的核心过滤器,spring监听器

<!-- spring监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>


  <!-- struts2核心过滤器 -->
    <filter>
        <filter-name>ssh</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ssh</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

技巧:这么长,其实不用记,要么找已经有的web.xml复制过来,实在没有可以按ctrl+shift+T,只要在里面输入StrutsP,系统会自动补全并找到。
这里写图片描述

13、在src目录下创建struts.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
          "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="sshPOI" extends="struts-default">
        <action name="user_*" class="cn.poi.action.UserAction" method="{1}">
            <result name="{1}">WEB-INF/jsp/{1}.jsp</result>
        </action>
    </package>   
</struts>

14、创建UserAction类

package cn.poi.action;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {

    public String test(){
        return "test";
    }
}

15、在WEB-INF目录下创建jsp文件夹,并在jsp目录下创建test.jsp文件

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'test.jsp' starting page</title>
  </head>
  <body>
    hello
  </body>
</html>

16、把项目挂到Tomcat服务器,启动服务器。
17、访问路径 :http://localhost:8080/ssh_POI/user_test
这里写图片描述
说明struts2是没问题的。
18、把actoin的创建交给spring创建管理

    <!-- UserAction 对象 -->
    <bean id="userAction" class="cn.poi.action.UserAction" scope="prototype">
        <property name="userService" ref="userService"></property>
</bean>

scope=”prototype” 是保证每个请求都有一个独立的userAction

19、在userAction中添加成员变量userService

package cn.poi.action;

import cn.poi.service.UserService;
import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
    //
    private UserService userService;

    public String test(){

        return "test";
    }

    public UserService getUserService() {
        return userService;
    }
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}

20、以上步骤把SSH环境搭建好了,接下来实现JAVA读取数据库数据,显示在页面,并通过点击导出按钮导出为Excel文件

21、创建一个listUI.jsp页面,用于展示数据库中的用户信息

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'listUI.jsp' starting page</title>
  </head>
  <body>
    <s:form action="http://localhost:8080/ssh_POI/user_export2Excel" method="">
        <table border="1" cellpadding="0" cellspacing="1" width="800" align="center">
            <tr align="center">
                <td>选择用户</td>
                <td>用户名</td>
                <td>密码</td>
                <td>年龄</td>
                <td>性别</td>
                <td>电话</td>
                <td>部门</td>
            </tr >
            <s:iterator var="user" value="userList" status="st">
                <tr align="center">
                    <td><input type="checkbox" id="selectedRow" name="selectedRow" value="<s:property value='id'/>"></td>
                    <td><s:property value="userName"/></td>
                    <td><s:property value="password"/></td>
                    <td><s:property value="age"/></td>
                    <td><s:property value="gender"/></td>
                    <td><s:property value="phone"/></td>
                    <td><s:property value="dept"/></td>
                </tr>
            </s:iterator>
            <tr>
                <td colspan="7" align="center">
                    <input type="submit" value="导出Excel" >
                </td>
            </tr>
        </table>
    </s:form>
  </body>
</html>

说明:这里用到struts标签,所以在jsp页面需要引进struts的标签。
<%@ taglib uri=”/struts-tags” prefix=”s” %>
22、在UserAction类添加方法*(给出UserAction的完整代码,请对应看)*

package cn.poi.action;

import java.util.List;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.struts2.ServletActionContext;
import cn.poi.entity.User;
import cn.poi.service.UserService;
import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {

    private UserService userService;
    private List<User> userList;
    private String[] selectedRow;

    public String test(){
        return "test";
    }

    /**
     * 获取用户信息,跳转到listUI页面。     
     */
    public String listUI(){
        //获取到数据库中所有user的数据,保存到userList中,然后再jsp页面遍历出来
        userList = userService.getAll();
        return "listUI";
    }

    public void export2Excel(){
        try {
            HSSFWorkbook workbook = new HSSFWorkbook();
            HSSFSheet sheet = workbook.createSheet();
            HSSFRow row_title = sheet.createRow(0);
            HSSFCell cell_title1 = row_title.createCell(0);
            HSSFCell cell_title2 = row_title.createCell(1);
            HSSFCell cell_title3 = row_title.createCell(2);
            HSSFCell cell_title4 = row_title.createCell(3);
            HSSFCell cell_title5 = row_title.createCell(4);
            HSSFCell cell_title6 = row_title.createCell(5);
            cell_title1.setCellValue("姓名");//姓名
            cell_title2.setCellValue("密码");//密码
            cell_title3.setCellValue("年龄");//年龄
            cell_title4.setCellValue("性别");//性别
            cell_title5.setCellValue("电话");//电话
            cell_title6.setCellValue("部门");//部门

            for(int i = 0; i < selectedRow.length;i++){
                User user = userService.findById(selectedRow[i]);
                HSSFRow row = sheet.createRow(i+1);
                HSSFCell cell1 = row.createCell(0);
                HSSFCell cell2 = row.createCell(1);
                HSSFCell cell3 = row.createCell(2);
                HSSFCell cell4 = row.createCell(3);
                HSSFCell cell5 = row.createCell(4);
                HSSFCell cell6 = row.createCell(5);
                cell1.setCellValue(user.getUserName());//姓名
                cell2.setCellValue(user.getPassword());//密码
                cell3.setCellValue(user.getAge());//年龄
                cell4.setCellValue(user.getGender());//性别
                cell5.setCellValue(user.getPhone());//电话
                cell6.setCellValue(user.getDept());//部门
            }
            HttpServletResponse response = ServletActionContext.getResponse();
            //把响应头数据类型设置为任意二进制流,用于上传下载
           response.setContentType("application/octet-stream");
           //告诉浏览器通过下载方式打开,并设置下载文件名
            response.setHeader("Content-Disposition", "attachment;fileName="//
                    + new String("用户信息.xls".getBytes(),"ISO8859-1"));
            ServletOutputStream sos = response.getOutputStream();
            workbook.write(sos);
            workbook.close();
            if(sos != null){
                sos.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /********成员变量的get/set方法*********/

    public UserService getUserService() {
        return userService;
    }
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    public List<User> getUserList() {
        return userList;
    }
    public void setUserList(List<User> userList) {
        this.userList = userList;
    }
    public String[] getSelectedRow() {
        return selectedRow;
    }
    public void setSelectedRow(String[] selectedRow) {
        this.selectedRow = selectedRow;
    }

}

如果对jsp和action之间传值不太了解的话,可以看向struts2中的传值方法,非常方便,只需要设置成员变量并给出get/set方法即可。

23、访问地址http://localhost:8080/ssh_POI/user_listUI.action 就可以在页面上得到我们数据库中User的信息
这里写图片描述
这里写图片描述
24、回顾一下我们struts.xml的配置 ,看数据是怎么访问出来的 (本文第13点也贴有struts.xml的配置,可以对比看下)

<struts>
    <!-- 把主题配置成simple -->
    <constant name="struts.ui.theme" value="simple" />

    <package name="sshPOI" extends="struts-default" namespace="/">
        <action name="user_*" class="cn.poi.action.UserAction" method="{1}">
            <result name="{1}">WEB-INF/jsp/{1}.jsp</result>
            <result name="listUI">WEB-INF/jsp/listUI.jsp</result> 
            <result name="list" type="redirectAction">user_listUI</result>
        </action>
    </package>   
</struts>

访问地址是http://localhost:8080/ssh_POI/user_listUI.action
所以会进到UserAction类中执行listUI方法,获取到userList后,返回字符串listUI,页面跳转到listUI.jsp 并把userList遍历出来,得到上面页面展示的数据。

**

25、重点 把选中的用户导出到Excel文件

–》 需要引入jar包 2003版本的
这里写图片描述
**
25.1、先解决如何把选择的用户传到后台Action中,往回看第21点中JSP页面代码

 <td><input type="checkbox" id="selectedRow" name="selectedRow" value="<s:property value='id'/>"></td>

在每一个用户前面增加一个checkbox类型的表单,值是用户对应的id
因为有多个这样的表单,最终返回的是一个字符数组
所以在UserAction类中定义一个selectedRow数组,并给出get/set方法,就可以拿到选择了的id。

private String[] selectedRow;

(见第22点中的UserAction代码)

25.2、添加方法public void export2Excel(){} (见第22点中的UserAction代码)
在后台UserAction中拿到类id数组selectedRow,
先创建工作簿workbook,工作表sheet,(这两个对象只需要一个,不需要循环创建)
并将第一行的标题信息打印出来。
然后通过for循环,根据id数组中的每个id获取数据库中对应的user信息,然后写进每行对应的单元格中。
注意:创建行的时候行数要+1;因为第一行已经用来创建标题了,不+1会覆盖掉标题。

25.3、设置响应头,提供下载 (见第22点中的UserAction代码)

HttpServletResponse response = ServletActionContext.getResponse();
//把响应头数据类型设置为任意二进制流,用于上传下载
response.setContentType("application/octet-stream");
//告诉浏览器通过下载方式打开,并设置下载文件名
response.setHeader("Content-Disposition", "attachment;fileName="//
                    + new String("用户信息.xls".getBytes(),"ISO8859-1"));
ServletOutputStream sos = response.getOutputStream();
workbook.write(sos);
workbook.close();
if(sos != null){
    sos.close();
}

25.4、把listUI.jsp页面代码中form的action提交地址设置为:http://localhost:8080/ssh_POI/user_export2Excel (见第21点jsp代码)
通过提交按钮,请求访问到UserAction类中export2Excel这个方法。就会弹出下载窗口,
这里写图片描述

当然。Excel表格格式是可以按照需要进行设置的。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/kyle0349/article/details/51802254