POI 生成 Excel , 记录之
公司最近弄报表系统, 考虑到现在大部分都使用了2007及以上版本的office ,因此选定了poi .不过为了生成兼容2007以前版本, 还是做了一些处理. (根据后缀选择生成的office 版本)
以下是我写的工具类(已简化)
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import com.cr.mode.action.ut.FileUploadAction;
public class POIExportUtil {
public static enum ExcelType{XLS, XLSX};
/**
* 生成Excel
*
* @param data 数据行
* @return
*/
@SuppressWarnings("rawtypes")
public static Workbook generExcel(ExcelType type,final List<Map> data) {
Workbook workbook; // 创建新的Excel工作薄
if(type.compareTo(ExcelType.XLS)==0){//2003版
workbook=new HSSFWorkbook();
}else{
workbook=new XSSFWorkbook();//默认2007版
}
Sheet sheet = workbook.createSheet();
// 冻结窗格(从列A到行2)
sheet.createFreezePane(0, 2);
sheet.setDefaultColumnWidth(15); // 设置默认宽度
Row row = null;
row = sheet.createRow(0); //创建首行
row.setHeightInPoints(18); //设置行高
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0,3)); //合并单元格
Cell cell_top = row.createCell(0);
cell_top.setCellValue("title"); //设置标题
CellStyle topStyle = workbook.createCellStyle(); //样式
topStyle.setAlignment(CellStyle.ALIGN_CENTER);// 设置居中
Font font = workbook.createFont();// 设置字体
font.setColor(IndexedColors.AQUA.getIndex()); //字体颜色
font.setBoldweight(Font.BOLDWEIGHT_BOLD); //字重
font.setFontHeightInPoints((short) 11); //字体大小
topStyle.setFont(font);
// 应用样式
cell_top.setCellStyle(topStyle);
// 在索引1的位置建行
row = sheet.createRow(1);
//表头样式
CellStyle hstyle = workbook.createCellStyle();
hstyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());//设置背景色
hstyle.setFillPattern(CellStyle.SOLID_FOREGROUND); //颜色填充模式
hstyle.setBorderBottom(CellStyle.BORDER_THIN);//设置底线
row.setRowStyle(hstyle);
Cell c=row.createCell(0);
c.setCellStyle(hstyle); //应用样式
c.setCellValue("ABCK");
if (data != null) {
//map中的key
List<String> dataKeys=new ArrayList<String>(data.get(0).keySet());
for (int i = 0; i < data.size(); i++) {
// 创建行
row = sheet.createRow(i + 2);
// 得到行数据
Map row_data = data.get(i);
for (int n = 0; n < row_data.size(); n++) {
Cell cell = row.createCell(n);
Object cValue = row_data.get(dataKeys.get(n));
if (cValue != null && cValue instanceof java.lang.Number) {
cell.setCellValue(Double.valueOf(cValue.toString()));
} else if (cValue == null) {
// cell.setCellValue(0);
} else {
cell.setCellValue(String.valueOf(cValue));
}
}
}
}
return workbook;
}
public static void main(String[] args) {
try {
Map m=new HashMap<String, Object>();
m.put("c_createtime", "2014-5-9");
List<Map> data=new ArrayList<Map>();
data.add(m);
Workbook book=POIExportUtil.generExcel(ExcelType.XLS, data);
book.write(new FileOutputStream(new File("d:/test.xls")));
System.out.println("生成结束");
} catch (IOException e) {
e.printStackTrace();
}
}
}