通用的类
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();
}