您的位置:首页 > 数据库

Jfinal 整合easypoi 对数据库数据通过excel 上传下载

2017-12-26 17:41 519 查看
之前的一个项目需要对数据库中的数据进行excel 上传下载。意思是 将数据库中的数据下载到本地excel 文件。然后上传是将本地的excel 文件 中的和数据库有关的数据进行上传到数据库中。在做项目的时候没有接触到easypoi 就是Jfinal 也是刚接触到。所以项目组让我实现这个功能我也是查了很多资料,不过不是很尽人意。下面我将详细的将之前写的一个demo 分享。喜欢就赞,不喜勿喷。

链接:easypoi 官方教程:easypoi

其实我是感觉在做项目的时候看的很乱,不是那么的明晰,或许是因为我的理解能力有限。

就我理解,不管是上传或者是下载原理是一样,easypoi 为啥叫easypoi,其实easy 在于它已经给我封装了两个工具类ExcelExportUtil和ExcelImportUtil 其中的方法就是下载和上传的固定方法。只要你按照它定义的方式就可以了。定义的方式包括(一个 模块,就是你数据的定义格式,或许不理解看下面),按照你的格式,会下载 对应的excel 文件。当然在你上传的时候excel 也需要定义成你自己定义的格式。

废话不说了。

(1)创建一个maven项目,将依赖加入。(这里我直接把我的pom.xml 文件全部粘上来)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>com.nyist.down</groupId>
<artifactId>downExcel</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>downExcel Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/com.jfinal/jfinal -->
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>2.1</version>
</dependency>

<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jetty-server</artifactId>
<version>8.1.8</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>

<!--FreeMarker-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.20</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.mchange/mchange-commons-java -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>mchange-commons-java</artifactId>
<version>0.2.11</version>
</dependency>

<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi</artifactId>
<version>3.0.3</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>3.0.3</version>
</dependency>
</dependencies>

<build>
<finalName>downExcel</finalName>

<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.2.0.v20160908</version>
<configuration>
<stopKey>stop</stopKey>
<stopPort>5599</stopPort>
<webAppConfig>
<contextPath>/</contextPath>
</webAppConfig>
<scanIntervalSeconds>5</scanIntervalSeconds>
<connectors>
<connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
<port>80</port>
<maxIdleTime>60000</maxIdleTime>
</connector>
</connectors>
</configuration>
</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF8</encoding>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>

</plugins>
</build>
</project>
创建Jfinal 项目,需要在web.xml 中定义Jfinal的拦截器

<filter>
<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>
<init-param>
<param-name>configClass</param-name>
<param-value>com.nyist.DemoConfig</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在 上面拦截器中描述的DemoConfig定义启动和一些设置

/**
* 常量配置
*/
@Override
public void configConstant(Constants constants) {
loadPropertyFile("config.properties");
constants.setViewType(ViewType.FREE_MARKER);
constants.setDevMode(true);//设置开发模式 可以进行将输出框 是否输出日志
constants.setBaseDownloadPath("down");

/* constants.setBaseDownloadPath("");//设置文件下载的默认文件路径
constants.setBaseUploadPath("");//设置文化上传的默认文件路径
constants.setBaseViewPath("");//设置路由视图的默认路径
constants.setEncoding("utf-8");//设置默认 编码格式
constants.setError404View("");//设置 404 错误的默认路径
constants.setError401View("");//设置401 错误的默认路径
constants.setFreeMarkerTemplateUpdateDelay(0);//设置freemarker 的默认更新时间
constants.setFreeMarkerViewExtension("");//设置freemark 的·默认后缀,默认为.html
constants.setMaxPostSize(1024*1024*10);//设置最大的post 请求,一般限制文件的上传
constants.setTokenCache(null);//可用于防止二次提交*/
}
/**
*
*/
@Override
public void configHandler(Handlers arg0) {
// TODO Auto-generated method stub

}

@Override
public void configInterceptor(Interceptors arg0) {
// TODO Auto-generated method stub

}
/**
* 路由配置
*/
@Override
public void configRoute(Routes routes) {
routes.add(new FrontRout());
//然后就可以通过 /hello/ helloController中的方法名进行访问,但是helloController中
//必须有index 方法,如果访问不存在的方法名的时候 会默认访问index
routes.add("test",TestController.class,"/");// 第三个参数 进行指明了 view 模板渲染的路径,如果controller 中函数 访问
//视图的话,没有加路径就只是加了个文件的名称那么 可能·就无法进行访问

}
@Override
public void configPlugin(Plugins arg0) {
C3p0Plugin c3p0=new C3p0Plugin(getProperty("jdbcUrl"),
getProperty("user"),
getProperty("password"));
arg0.add(c3p0);
ActiveRecordPlugin activeRecord=new ActiveRecordPlugin(c3p0);
activeRecord.addMapping("users",Users.class).setShowSql(Boolean.parseBoolean(getProperty("showSql")));
// activeRecord.addMapping("student",Student.class).setShowSql(Boolean.parseBoolean(getProperty("showSql")));

arg0.add(activeRecord);
}

public static void main(String[] args) {
JFinal.start("src/main/webapp", 8080, "/", 5);
}定义路由:
public class FrontRout extends Routes{

@Override
public void config() {

add("/hello",HelloController.class);
}

}

定义数据映射
package com.nyist;

import java.io.Serializable;

import com.jfinal.plugin.activerecord.Model;
public class Users extends Model<Users> implements Serializable{
public static final Users dao = new Users();
}


至此环境搭好了

然后定义模板
public class User {
@Excel(name = "userName", needMerge = true)
private String userName;
@Excel(name = "password", needMerge = true)
private String password;

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;
}
}这里的userName 和password 是你定义的样式,这样在下载的时候标题就是userName 和password ,当然为了方便 userName 可以是数据库中的字段这样在上传的时候方便
然后就是路由中的HelloController

package com.nyist;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.ss.usermodel.Workbook;

import com.jfinal.core.Controller;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;

public class HelloController extends Controller{

public void index(){
//renderText("hello world");
render("/index.html");

}

public void getData(){
List<Users> users=Users.dao.find("select * from users");
setAttr("users", users);
renderJson();
}
//下载
public void downExcel() throws IOException{

System.out.println("----------------");
List<Users> users = Users.dao.find("select * from users");
List<User> lists = new ArrayList<User>();
User u ;
for (Users user : users) {
u = new User();
u.setUserName((String) user.get("userName"));
u.setPassword((String) user.get("password"));
//System.out.println(u);
lists.add(u);
}
ExportParams params = new ExportParams("信息表","2017-10-1");
params.setFreezeCol(2);

Workbook workbook = ExcelExportUtil.exportExcel(params, User.class, lists);
//下载为 什么文件,文件名和位置
FileOutputStream fos = new FileOutputStream("F:/2.xls");
workbook.write(fos);
fos.close();
redirect("/index.html");
}
//上传
public void upload() throws Exception{
ImportParams params = new ImportParams();
params.setTitleRows(1);
params.setHeadRows(1);
//上传的文件路径
InputStream inputStream = new FileInputStream("F:/2.xls");

List<User> lists = ExcelImportUtil.importExcel(inputStream, User.class, params);
Users users;
for (User user : lists) {
System.out.println(user.getUserName()+"========"+user.getPassword());
new Users().set("userName", user.getUserName()).set("password", user.getPassword()).save();
}

render("/index.html");
}

}


上面就是完整的下载和上传。
测试









内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: