一、Apache POI简介
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能。
二、POI结构
-
HSSF - 提供读写Microsoft Excel XLS格式档案的功能。
-
XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。
-
HWPF - 提供读写Microsoft Word DOC格式档案的功能。
-
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
-
HDGF - 提供读Microsoft Visio格式档案的功能。
-
HPBF - 提供读Microsoft Publisher格式档案的功能。
-
HSMF - 提供读Microsoft Outlook格式档案的功能。
三、参考案例
在web开发中,有一个经典的功能,就是数据的导入导出。特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作。而数据导出的格式一般是EXCEL或者PDF,我这里介绍下excel的导出。
1、excel表动态设置标题以及内容
package com.xxx.xxx;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.web.servlet.view.document.AbstractExcelView;
public class ObjectExcelView extends AbstractExcelView{
@SuppressWarnings("unchecked")
@Override
protected void buildExcelDocument(Map<String, Object> model,
HSSFWorkbook workbook, HttpServletRequest request,
HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
Date date = new Date();
String filename = Tools.date2Str(date, "yyyyMMddHHmmss");
HSSFSheet sheet;
HSSFCell cell;
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + model.get("preFilename") + filename+".xls");
sheet = workbook.createSheet("sheet1");
List<String> titles = (List<String>) model.get("titles");
int len = titles.size();
HSSFCellStyle headerStyle = workbook.createCellStyle(); //标题样式
headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
headerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
HSSFFont headerFont = workbook.createFont(); //标题字体
headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
headerFont.setFontHeightInPoints((short)11);
headerStyle.setFont(headerFont);
short width = 20,height=25*20;
sheet.setDefaultColumnWidth(width);
for(int i=0; i<len; i++){ //设置标题
String title = titles.get(i);
cell = getCell(sheet, 0, i);
cell.setCellStyle(headerStyle);
setText(cell,title);
}
sheet.getRow(0).setHeight(height);
HSSFCellStyle contentStyle = workbook.createCellStyle(); //内容样式
contentStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
List<HashMap> varList = (List<HashMap>) model.get("varList");
int varCount = varList.size();
for(int i=0; i<varCount; i++){
HashMap vpd = varList.get(i);
for(int j=0;j<len;j++){
String varstr = vpd.get("var"+(j+1)) != null ? vpd.get("var"+(j+1)).toString() : "";
cell = getCell(sheet, i+1, j);
cell.setCellStyle(contentStyle);
setText(cell,varstr);
}
}
}
}
2、导出excel接口
//导出excel
@RequestMapping("/excel/{beginDate}/{endDate}/{dwei_name}/{xming}")
@ResponseBody
public ModelAndView exportExcel(@PathVariable String beginDate, @PathVariable String endDate, @PathVariable String dwei_name,@PathVariable String xming){
ModelAndView mv = new ModelAndView();
PageData params=new PageData();
//当dwei_name或xming字段传值为*时,表示dwei_name或者xming是任意值
if(dwei_name.equals("*")){
dwei_name=null;
}
if(xming.equals("*")){
xming=null;
}
params.put("beginDate",beginDate);
params.put("endDate",endDate);
params.put("xming",xming);
params.put("dwei_name",dwei_name);
try{
Map<String,Object> dataMap = new HashMap<String,Object>();
List<String> titles = new ArrayList<String>();
titles.add("姓名"); //2
titles.add("性别"); //3
titles.add("单位名称"); //4
titles.add("职务"); //5
titles.add("出勤次数"); //7
titles.add("缺勤次数"); //8
dataMap.put("titles", titles);
List<AttendanceResult> varOList = query(params);
List<PageData> varList = new ArrayList<PageData>();
for(int i=0;i<varOList.size();i++){
PageData vpd = new PageData();
vpd.put("var2", varOList.get(i).getXming());
vpd.put("var3", varOList.get(i).getXbie());
vpd.put("var4", varOList.get(i).getDwei_name());
vpd.put("var5", varOList.get(i).getZwu());
vpd.put("var7", varOList.get(i).getSum_cqtimes());
vpd.put("var8", varOList.get(i).getSum_qqtimes());
varList.add(vpd);
}
dataMap.put("varList", varList);
dataMap.put("preFilename", "attendance"); //文档名称
ObjectExcelView erv = new ObjectExcelView();
mv = new ModelAndView(erv,dataMap);
} catch(Exception e){
logger.error(e.toString(), e);
}
return mv;
}
参考文档:
官方网站:
http://poi.apache.org/spreadsheet/quick-guide.html
参考博客:
http://langhua9527.iteye.com/blog/388005