您的位置:首页 > 其它

导出CSV格式的文件

2016-01-12 17:18 453 查看
通用的类

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();
}



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