创建通用的导出方法(代码里的注释很全了)
效果如下(黑色涂抹的很丑,不要介意)
/**
* 导出Excel
* @param sheetName sheet名称
* @param title0 标题(大标题)
* @param wb HSSFWorkbook对象
* @param title1 标题(一级标题)
* @param title2 标题(二级标题)(没用,没写这个功能)
* @param content 要导入的数据
* @return
*/
public HSSFWorkbook export(String sheetName,String []title1,String[][] content, HSSFWorkbook wb,String title0,String []titile2) {
// 创建一个HSSFWorkbook,对应一个Excel文件
if(wb==null){
wb = new HSSFWorkbook();
}
//创建一个SHEET
HSSFSheet sheet = wb.createSheet();
wb.setSheetName(0, title0);
//创建单元格对象
HSSFCell cell0 = null;
HSSFCell cell1 = null;
HSSFCell cell2 = null;
HSSFCell cell3 = null;
//创建大标题
HSSFRow row0 = sheet.createRow(0);
//创建大标题单元格的格式
HSSFCellStyle style0 = wb.createCellStyle();
HSSFFont font0 = wb.createFont(); //设置标题的字体
font0.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 设置粗体
font0.setFontHeightInPoints((short) 15);// 设置字体大小
style0.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);// 水平居中
style0.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中
style0.setFont(font0);
//要先设值,在设值样式,如果先设了样式再设值,样式会丢失,具体原因未知
style0.setBorderTop(HSSFCellStyle.BORDER_THIN);
style0.setBorderRight(HSSFCellStyle.BORDER_THIN);
style0.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style0.setBorderLeft(HSSFCellStyle.BORDER_THIN);
cell0 = row0.createCell(0);
cell0.setCellValue(title0);
cell0.setCellStyle(style0);
//大标题合并单元格
int a = title1.length;
CellRangeAddress cra0=new CellRangeAddress(0,0, 0, a-1);
sheet.addMergedRegion(cra0);
//创建一级标题
HSSFRow row1 = sheet.createRow(1);
//创建一级标题的格式
HSSFCellStyle style1 = wb.createCellStyle();
style1.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);// 水平居中
style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中
style1.setBorderTop(HSSFCellStyle.BORDER_THIN);
style1.setBorderRight(HSSFCellStyle.BORDER_THIN);
style1.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style1.setBorderLeft(HSSFCellStyle.BORDER_THIN);
//设值前景色(cell其实是使用前景来填充的)这里用的是白色
style1.setFillForegroundColor(HSSFColor.WHITE.index);
/* setFillPattern是设置单元格填充样式,SOLID_FOREGROUND纯色
使用前景颜色填充,接着设置前景颜色(setFillForegroundColor)就
可以给单元格着色了。*/
style1.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
//首先创建一级标题的单元格并赋值标题
for(int i=0;i<a;i++){
cell1 = row1.createCell(i);
sheet.setColumnWidth(i, 18*256);
}
for(int i =0;i<a;i++){
cell1=row1.getCell(i);
cell1.setCellValue(title1[i]);
cell1.setCellStyle(style1);
}
//赋值
for(int i=0;i<content.length;i++){
HSSFRow row = sheet.createRow(i + 2);
for(int j=0;j<content[i].length;j++){
//将内容按顺序赋给对应的列对象
HSSFCell cellNo =row.createCell(0); //第一列是NO.用来计数
cellNo.setCellStyle(style1);
cellNo.setCellValue(i+1);
HSSFCell createCell = row.createCell(j+1);
createCell.setCellStyle(style1);
createCell.setCellValue(content[i][j]);
}
}
return wb;
}
响应
/**
* 响应
* @param response
* @param fileName
*/
private void setResponseHeader(HttpServletResponse response,
String fileName) {
// TODO Auto-generated method stub
try {
try {
fileName = new String(fileName.getBytes(),"ISO8859-1");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
response.setContentType("application/octet-stream;charset=ISO8859-1");
response.setHeader("Content-Disposition", "attachment;filename="+ fileName);
response.addHeader("Pargam", "no-cache");
response.addHeader("Cache-Control", "no-cache");
} catch (Exception ex) {
ex.printStackTrace();
}
}
具体的例子
/**
* 导出exportLongParts
* @return
*/
@RequestMapping(value = "/exportLongParts")
@ResponseBody
public void exportLongParts(HttpServletRequest request,HttpServletResponse response) throws Exception {
//获取查询参数
String suppid = request.getParameter("suppid");
String suppname = request.getParameter("suppname");
String arrid = request.getParameter("arrid");
String arrname = request.getParameter("arrname");
String cartypename = request.getParameter("cartypename");
String power = request.getParameter("power");
String office = request.getParameter("office");
String startTime = request.getParameter("startTime");
String endTime = request.getParameter("endTime");
Map<String,String> newMap = new HashMap<String,String>();
newMap.put("suppid", suppid);
newMap.put("suppname", suppname);
newMap.put("arrid", arrid);
newMap.put("arrname", arrname);
newMap.put("cartypename", cartypename);
newMap.put("power", power);
newMap.put("office", office);
newMap.put("startTime", startTime);
newMap.put("endTime", endTime);
//设值一级标题
String[] title1={"NO.","零件号","零件名称","车型","配置","原材料(包含子零件名称)","订购周期(天)","原材料(包含子零件)供应商","国家",};
//设值导出的EXCEL的大标题
String title0="长周期订购表";
//设值导出EXCEL的文件名称
String fileName = "长周期订购表.xls";
List<newFactoryVO> list = icn.getNewFactory(newMap);
List<String> listall = new ArrayList<String>();
String content [][] = new String[list.size()][title1.length-1];
String title2[]={""};//二级标题(没用)
newFactoryVO vo= null;
//设值日期格式
SimpleDateFormat time = new SimpleDateFormat("yyyy-mm-HH");
//循环取值赋值给conten,conten传到导出EXCEL的方法中
for (int i = 0; i < list.size(); i++) {
vo= list.get(i);
content[i][0] = String.valueOf(vo.getPartscode());
content[i][1] = String.valueOf(vo.getPartsname());
content[i][2] =String.valueOf(vo.getCartypename());
content[i][3] =String.valueOf(vo.getPower());
content[i][4] =String.valueOf(vo.getMaterialname());
content[i][5] = String.valueOf(vo.getOrdercycle());
content[i][6] =String.valueOf(vo.getSuppliername());
content[i][7] =String.valueOf(vo.getSuppliercountry());
};
//调用导出方法
HSSFWorkbook wb = export(title0, title1, content, null, title0, null);
OutputStream os = response.getOutputStream();
try {
this.setResponseHeader(response, fileName);
wb.write(os);
} catch (Exception e) {
throw e;
}finally{
os.flush();
os.close();
}
}
最终效果如下图 上面是大标题,太长 没截