导出CSV格式的文件

通用的类



public abstract class AbstractCSVItemProcessor<T> {
	
	protected ICSVWriter writer;
	
	public void setWriter(ICSVWriter writer){
		this.writer = writer;
	}
	
	/**
	 * Write csv header
	 */
	public abstract void writeCSVHeader();
	
	/**
	 * Write csv record
	 * @param item
	 */
	public abstract void writeCSVItem (T item);
	
	/**
	 * Write bad when error
	 */
	public void writeBadToCSV (){
		writer.beginRecord();
		writer.write("BAD BAD BAD");
		writer.endRecord();
	}
	
	/**
	 * Prepre something before execute export
	 */
	public void prepare (){
		
	}
	
	/**
	 * Finish something after execute export
	 */
	public  void dispose (){
		writer.flush();
		writer.close();
	}
}

public interface CSVCondition {
	
}

import java.io.OutputStream;

import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

public class DefaultCSVGenerator implements ICSVGenerator {
	
	/// config item
	private SqlSessionFactory sqlSessionFactory;
	private String mapper;
	private AbstractCSVItemProcessor<?> itemProcessor;
	private ICSVWriter writer;
	private String encoding;
	
	
	private long progress;
	private Thread thread;
	
	public void setItemProcessor (AbstractCSVItemProcessor<?> processor) {
		itemProcessor = processor;
	}
	
	public void setSqlSessionFactory (SqlSessionFactory sqlSessionFactory) {
		this.sqlSessionFactory = sqlSessionFactory;
	}
	
	public void setMapper (String mapper) {
		this.mapper = mapper;
	}
	
	public void setWriter(ICSVWriter writer) {
		this.writer = writer;
	}

	public void setEncoding(String encoding) {
		this.encoding = encoding;
	}




	public class RecordResultHandler implements ResultHandler {
		
		/**
		 * Handle each record of sql query 
		 */
		@SuppressWarnings("unchecked")
		public void handleResult (ResultContext context) {
			Object obj = context.getResultObject ();
			if (Thread.interrupted ()) {
				context.stop ();
			} else {
				try {
					((AbstractCSVItemProcessor<Object>)itemProcessor).writeCSVItem (obj);
				} catch (Exception e) {
					e.printStackTrace ();
					itemProcessor.writeBadToCSV ();
					context.stop ();
				}
			}
			++progress;
		}
	}
	
	public String getProgress () {
		return "" + progress;
	}
	
	public void stop () {
		if (thread != null) {
			thread.interrupt ();
			thread = null;
		}
	}
	
	public void exportAsCSV (OutputStream writer, CSVCondition cond) {
		SqlSession session = sqlSessionFactory.openSession (true);
		progress = 0;
		try {
			this.writer.setEncoding(encoding);
			this.writer.setOutputStream(writer);
			itemProcessor.setWriter(this.writer);
			itemProcessor.writeCSVHeader();
			itemProcessor.prepare ();
			thread = Thread.currentThread ();
			session.select (mapper, cond, new RecordResultHandler ());
			session.commit ();
		} catch (Exception e ) {
			e.printStackTrace();
		}finally {
			thread = null;
			itemProcessor.dispose ();
			if(session != null)
				session.close ();
		}
	}
	
}


import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DefaultCSVWriter implements ICSVWriter {

	public static final String CSV_REGEX = ".*([\"|\\,|\\n|\\r]|(\\r\\n)|(\\n\\r)).*";
	public static final String lINE_SEPARATOR=System.getProperty("line.separator");
	public static final String DEFAULT_FORMAT_CONTINUOUS="yyyyMMddHHmmss";
	public static final String DEFAULT_ENCODING="UTF-8";
	public String encoding = DEFAULT_ENCODING;
	private Writer writer;
	private String format = DEFAULT_FORMAT_CONTINUOUS;

	public DefaultCSVWriter(){
		
	}
	public DefaultCSVWriter(OutputStream out) {
		this(out, DEFAULT_ENCODING);
	}
	
	public DefaultCSVWriter(OutputStream out, String encoding) {
		this(out, encoding, DEFAULT_FORMAT_CONTINUOUS);
	}
	
	public DefaultCSVWriter(OutputStream out, String encoding, String format) {
		try{
			this.writer = new OutputStreamWriter(out, encoding);
			if(format != null)
				this.format = format;
		}catch(Exception e){
			throw new RuntimeException(e.getMessage(), e);
		}
	}
	
	@Override
	public void write(Number num){
		String v="";
		if(num!=null){
			v=num.toString();
		}
		write(v);
	}
	
	@Override
	public void write(Timestamp date,String format){
		String content="";
		if(date!=null){
			content=new SimpleDateFormat(format).format(date);
		}
		this.write(content);
	}
	
	@Override
	public void write(Date date){
		String content="";
		if(date!=null){
			content=new SimpleDateFormat(format).format(date);
		}
		this.write(content);
	}

	@Override
	public void write(String str) {
		if(str == null)
			str="";
		str = str.replace("\"", "\"\"");
		Pattern p = Pattern.compile(CSV_REGEX, Pattern.DOTALL);
		Matcher m = p.matcher(str);

		if (m.matches()) {
			str = "\"" + str + "\"";
		}
		_write(str + ",");
	}
	
	@Override
	public void beginRecord() {
		// do nothing
		
	}

	@Override
	public void endRecord() {
		_write(lINE_SEPARATOR);
	}
	
	@Override
	public void flush(){
		try{
			if(this.writer != null){
				this.writer.flush();
			}
		}catch(Exception e){
			//ignore;
		}
	}
	
	@Override
	public void close(){
		try{
			if(this.writer != null){
				this.writer.close();
			}
		}catch(Exception e){
			//ignore;
		}
	}
	
	

	@Override
	public void setEncoding(String encoding) {
		this.encoding = encoding;
		
	}
	
	

	@Override
	public void setOutputStream(OutputStream out) {
		try{
			this.writer = new OutputStreamWriter(out, this.encoding);
		}catch(Exception e){
			throw new RuntimeException(e.getMessage(), e);
		}
		
	}

	private void _write(String str) {
		try {
			writer.write(str);
		} catch (Exception e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}


}


import java.io.OutputStream;


public interface ICSVGenerator {
	
	public void exportAsCSV (OutputStream writer, CSVCondition cond);
	
	/**
	 * Check proress
	 * @return
	 */
	public String getProgress ();
	
	/**
	 * Stop export
	 */
	public void stop ();
}


import java.io.OutputStream;
import java.sql.Timestamp;
import java.util.Date;

public interface ICSVWriter {

	public abstract void write(Number num);

	public abstract void write(Timestamp date, String format);

	public abstract void write(Date date);

	public abstract void write(String str);

	public abstract void beginRecord();
	
	public abstract void endRecord();

	public abstract void flush();

	public abstract void close();
	
	public abstract void setEncoding(String encoding);
	
	public abstract void setOutputStream(OutputStream out);

}

对应的注入配置文件

<!-- 导出应用列表 -->    
    <object id="default-writer" class="com.snowfish.omsdk.channelsdk.common.csv.DefaultCSVWriter"></object>
    <object id="appInfo-processor" class="com.snowfish.omsdk.channelsdk.csv.AppInfoCSVItemProcessor"/>
	<object id="appInfo-export" class="com.snowfish.omsdk.channelsdk.common.csv.DefaultCSVGenerator"> 
		<property name="sqlSessionFactory" ref="mybatis-session-factory"/> 
		<property name="mapper" value="com.snowfish.omsdk.channelsdk.mapper.IAppInfoMapper.getAppInfoByCondition"/> 
		<property name="itemProcessor" ref="appInfo-processor"/> 
		<property name="writer" ref="default-writer" />
		<property name="encoding" value="GBK"/> 
	</object>

对应的需要导出的实体类

package com.snowfish.omsdk.channelsdk.csv;

import com.snowfish.omsdk.channelsdk.common.csv.AbstractCSVItemProcessor;
import com.snowfish.omsdk.channelsdk.pojo.AppInfo;

public class AppInfoCSVItemProcessor extends AbstractCSVItemProcessor<AppInfo>{

	@Override
	public void writeCSVHeader() {
		writer.beginRecord();
		writer.write("APPID");
		writer.write("应用名");
		writer.write("CPID");
		writer.write("CP名称");
		writer.write("创建日期");
		writer.write("类型");
		writer.write("状态");
		writer.write("备注");
		writer.endRecord();
	}

	@Override
	public void writeCSVItem(AppInfo appInfo) {
		writer.beginRecord();
		writer.write(appInfo.getId());
		writer.write(appInfo.getAppName());
		writer.write(appInfo.getCpId());
		writer.write(appInfo.getCpName());
		writer.write(appInfo.getCreateTime());
		writer.write(appInfo.getAppTypeName());
		writer.write(appInfo.getStatus()==0?"有效":"无效");
		writer.write(appInfo.getAppDesc());
		writer.endRecord();
	}


}

对应的action中的类

//导出应用列表
	public void csvGeneratorAppInfo(HttpServletResponse response,
			HttpServletRequest request, HttpSession session) throws Exception {
		
		ZipOutputStream zos = null;
		BufferedOutputStream bos = null;
		response.setContentType("application/zip");
<span style="white-space:pre">		</span>AppInfoParam appInfoParam = new AppInfoParam();		
		String fileName = "file";
		
		response.setHeader("Content-Disposition", "attachment; filename=\""
				+ fileName + "\"");
		OutputStream stream;
		stream = response.getOutputStream();
		bos = new BufferedOutputStream(stream, 64 * 1024);
		zos = new ZipOutputStream(bos);
		zos.setLevel(1);
		zos.putNextEntry(new ZipEntry("AppInfoReport.csv"));
		
		csvGenerator.exportAsCSV(zos, appInfoParam);
		
		zos.close();
		bos.close();
	}




                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值