导出CSV格式的文件
2016-01-12 17:18
453 查看
通用的类
对应的注入配置文件
对应的需要导出的实体类
对应的action中的类
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(HttpS 4000 ervletResponse 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(); }
相关文章推荐
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- 内核文档driver-model/platform.txt翻译
- 初探swift语言的学习笔记九(OC与Swift混编)
- 美团Android DEX自动拆包及动态加载简介
- 自定义UINavigationItem的两种方法以及相应的隐藏方法
- 资深HR 告诉你到底怎么写一份好的简历
- 读取assets目录下的资源文件写入到本地
- nested exception is java.lang.NoSuchFieldError: TRACE
- LeetCode:Largest Number
- SQL 之 group by
- jackson json开发过程遇到的一些问题小节
- Let's do our own full blown HTTP server with Netty--转载
- 手把手,教你怎样用命令行给apk签名
- git pull VS git fetch&merge
- Android 支付宝接入时常见的问题
- 【jQuery】JS中拼接URL发送GET请求的中文、特殊符号的问题
- 学习JavaScript设计模式之代理模式
- NSPointerArray NSHashTable NSMapTable 详解
- 基于Oozie实现MapReduce作业的自动提交功能
- Linux网络配置