背景:一次性导出几十万条数据到excel,此时的导出效率会严重损失。
解决方法: 用ibatis中的RowHandler,一次只处理一条数据,内存中只保持一条数据,导出时每5万条创建一个sheet
具体实现方法:
MyRowHandler处理类:
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import com.ibatis.sqlmap.client.event.RowHandler;
public class MyRowHandler implements RowHandler {
HSSFWorkbook wb;
HSSFSheet sheet ;
HSSFRow row;
HSSFCell cell;
int dataNum=0;
int rowStart = 1;
@Override
public void handleRow(Object arg0){
dataNum++;
if(dataNum%50000==0){
//每5万条记录分页
setSheet();
}
Map map = (Map)arg0;
//在这里处理逻辑,插入数据到excel
System.out.println(map.get("key"));
System.out.println(map.get("value"));
}
public HSSFWorkbook getWb() {
return wb;
}
public void setWb(HSSFWorkbook wb) {
this.wb = wb;
setSheet();
}
public void setSheet(){
this.sheet= wb.createSheet();
rowStart = 1;
//写表头
writeHeader();
}
public void writeHeader(){
String[] header = {"ID","类型"};
row = sheet.createRow(0);
int n=0;
for (String head : header) {
cell = row.createCell((short) n);
HSSFRichTextString str = new HSSFRichTextString(head);
cell.setCellValue(str);
n++;
}
}
}
action中执行:
public String execute(){
String fileName="F:\\05-JAVA\\测试.xls";
HSSFWorkbook wb = new HSSFWorkbook();
MyRowHandler handler = new MyRowHandler();
handler.setWb(wb);
DaoFactory.getIbatisDao().getSqlMapClientTemplate().queryWithRowHandler("term.base", handler);
wb = handler.getWb();
OutputStream os = null;
try {
os = new FileOutputStream(fileName);
wb.write(os);
}catch(Exception e){
}finally{
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return "success";
}
分享到:
相关推荐
ibatis sql语句对条件中特殊字符% # 处理
jxl结合IBATIS,导出EXCEL。读取EXCEL模板,把数据写到新的EXCEL中。sql语句中要起别名,别名第一位为字母,第二位包括第二位要是整数数字,这个数字决定插入到excel表格中的位置,决定插入的是那一列。EXCEL模板中...
ibatis学习 ibatis总结 ibatis ibatis ibatis
ibatis 数据缓存,帮你了解ibatis的数据缓存机制。
ibatis官方中文文档.rar包含ibatis官方中文文档及使用说明
ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料
学会ibatis 中sqlMap配置
最近遇到需要批量update数据的问题,一开始用了一个for循环去update,数据量大的时候效率很低。原因是for循环每次update一条语句,都是一次连接过程。遇到大批数据更新的时候,效率就可想而知了。在google上找了一遍...
ibatis 拼接字符串
其中包含iBatis精讲PDF iBatis实例 iBatis开发指南 iBatis分页 spring+iBatis处理1对多数据表实例等等若干帮助文档。希望可以帮助大家学习iBatis...
ibatis2.0中文API ibatis2.0中文API ibatis2.0中文API 一对多 多对一详解,属性设置详解,解决方案详解,ibatis2.0核心API
实现ibatis对数据的连接,增查删改。.xml文件对sql语句的映射。基本知识基本全部覆盖
ibatis3.0中in的用法ibatis3.0中in的用法ibatis3.0中in的用法ibatis3.0中in的用法
ibatis批量处理操作实现,以及sping中需要注意点
使用的struts2_spring_ibatis框架,根据模板文件导出Excel
基于struts2 spring ibatis 使用poi组建对查询出数据库表中的数据导出Excel中的源码及案例
ibatis 乱码解决 ibatis乱码 gbk iso_8859_1 乱码
ibatis demo,ibatis例子,ibatis示例
iBATIS 级联iBATIS 级联iBATIS 级联
介绍Ibatis框架中需要同时连接多个资料库的方法,包括.net和Java两种