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

之前的一个项目需要对数据库中的数据进行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");
    } 
 
}

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

测试








  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值