package com.feilo.service;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
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 org.apache.poi.hssf.util.Region;
import com.feilo.util.PoiStyleUtil;
/**
* 该类用于从Map里取出数据生成Excel文件
* @author 张如利
* @version 1.0
* @date 2010.4.20
*/
public class MapDataToExcel {
/**
* 导出tables的数据,生成EXCEL文件
* @param tables Map数据类型,里面可以装整个数据库表的数据
* @param filePath 生成EXCEL文件的路径
* @param fileName 生成EXCEL文件的文件名
*/
public static void exportExcel(Map<String,List<Map<String,String>>> tables,String filePath,String fileName) {
/** 创建EXCEL表格 */
HSSFWorkbook wb = new HSSFWorkbook();
/** 生成EXCEL表格样式*/
HSSFCellStyle style = PoiStyleUtil.getCellStyle(wb);
/** 根据tables创建各个表*/
createTableValues(wb,style,tables);
/** 创建目录*/
File dir = new File(filePath);
if(!dir.exists()){
dir.mkdir();
}
/** 把生成EXCEL表格保存到文件里 */
try {
FileOutputStream fileOut = new FileOutputStream(filePath+"\\"+fileName);
wb.write(fileOut);
fileOut.flush();
fileOut.close();
} catch (FileNotFoundException e) {
throw new RuntimeException("生成XLS文件流失败");
} catch (IOException e) {
throw new RuntimeException("生成XLS文件失败");
}
}
/**
* 填充单元格数据
* @param row HSSFRow对象,通过row来创建cell
* @param colums 往cell里填充的源数据,相当于一条记录
*/
public static void createCellsValue(HSSFRow row,HSSFCellStyle style,Map<String,String> colums){
Iterator<String> it = colums.keySet().iterator();
/** 循环一行数据的所有列,并把每列填充到单元格cell里面*/
for(short i = 0 ;it.hasNext();i++){
HSSFCell cell = row.createCell(i);
cell.setCellValue(new HSSFRichTextString(colums.get(it.next())));
cell.setCellStyle(style);
}
}
/**
* 填充各行数据,相当于完成一个表的数据导出
* @param sheet HSSFSheet对象,一张工作表
* @param rows 填充源数据,相当于一张数据表的内容
*/
public static void createRowsValue(HSSFSheet sheet,HSSFCellStyle style,List<Map<String,String>> rows){
//sheet.setColumnWidth((short)1,(short)50);
for(short i=0;i<rows.size();i++){
/** 从第二行开始填充数据,第一行已用于填充表名*/
HSSFRow row=sheet.createRow(i+1);
createCellsValue(row,style,rows.get(i));
}
}
/**
* 填充各表数据,相当于整个数据库的数据导出
* @param wb 整个excel文件
* @param tables 填充源数据,相当于整个库
*/
public static void createTableValues(HSSFWorkbook wb,HSSFCellStyle style,Map<String,List<Map<String,String>>> tables){
Iterator<String> it = tables.keySet().iterator();
while(it.hasNext()){
String table = it.next();
HSSFSheet sheet= wb.createSheet(table);
Region region = new Region((short)0,(short)0,(short)0,(short)5);
sheet.addMergedRegion(region);
/**在第一行第一列填充表名*/
HSSFRow row=sheet.createRow(0);
HSSFCell cell = row.createCell((short)0);
cell.setCellValue(new HSSFRichTextString("Table Name : "+table));
/**填充表格数据*/
createRowsValue(sheet,style,tables.get(table));
}
}
}