说白了,就是查出数据然后塞到Excel中就OK了,感觉没什么理论要说,下面以我做的例子来说一下。我用的项目后台分为两块,一个前台controller,一个后台controller,我这里的处理是web端条件传给前台controller,这些条件传给后台controller,后台连接数据库进行查询,之后把数据封装进map返回给前台controller,前台负责把它塞到Excel中。如果各位只有一个controller,也是一样,就是少了一层而已。
web代码,没什么好说的,导出的按钮事件中直接写这两句就好:
var url = encodeURI(encodeURI(后台接口地址));
window.location.href = url;
数据的查询以及两个服务器之间的传递也是so easy,我就直接从取得数据后开始说了:
我是新建了一个工具类ViewExcel,数据都传进这个类里进行处理
controller中的接口
@RequestMapping(value = "/ledgerExport.do")
@ResponseBody
public ModelAndView ledgerExport(String conditionJson) {
String tablename=request.getParameter("tablename");
String projectId=request.getParameter("projectId");
String groupId=request.getParameter("groupId");
String startDate = request.getParameter("startDate")==null?"":request.getParameter("startDate");
String endDate = request.getParameter("endDate")==null?"":request.getParameter("endDate");
//后台查询出list之后封装到map里,再装到json里传过来
String result = HttpTookit.doGet(Constants.DOMAIN+"blog/ledgerExport.do?tablename="+tablename+"&projectId="+projectId+"&groupId="+groupId+"&startDate="+startDate+"&endDate="+endDate,"","");
//转化成map
Map<String, Object> map = (Map<String, Object>)JSON.parse(result);
return new ModelAndView(new ViewExcel(), map);
}
前面都是数据的获取和传递,倒数第二句是直接把数据装到map中,因为本来的返回值就是map所以直接用就好了。
下面是工具类的代码,删除了很多样式之后的样子:
package cn.rails.pms.core.controller.system;
import java.beans.PropertyDescriptor;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
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.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
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.ss.usermodel.CellStyle;
import org.springframework.web.servlet.view.document.AbstractExcelView;
import com.alibaba.fastjson.JSONArray;
public class ViewExcel extends AbstractExcelView{
@SuppressWarnings({ "unchecked", "deprecation" })
@Override
protected void buildExcelDocument(Map<String, Object> model,
HSSFWorkbook workbook, HttpServletRequest request,
HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String fileName = "台账信息导出" + df.format(new Date()) + ".xls";//文件名
response.setCharacterEncoding("UTF-8");//编码
response.setContentType("application/ms-excel");
response.setHeader("Content-Disposition", "inline; filename="
+ new String(fileName.getBytes(), "iso8859-1"));
OutputStream outputStream = response.getOutputStream();
//设置字体样式
HSSFFont font = workbook.createFont();
font.setFontName("黑体");
font.setFontHeightInPoints((short) 12);//设置字体大小
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示
//标题单元格样式,暂时只有居中这一个属性
HSSFCellStyle cellStyleTitle = workbook.createCellStyle();
cellStyleTitle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//横向居中
cellStyleTitle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//纵向居中
cellStyleTitle.setFont(font);//应用上面设置的字体样式
//设备报验台账
List sbby = (List) model.get("sbby");
if(sbby!=null){
// 产生Excel表头
String sheetName = "设备报验台账";
HSSFSheet sheet = workbook.createSheet(sheetName);
/*sheet.setColumnWidth(0, 6000);
sheet.setColumnWidth(1, 6000);
sheet.setColumnWidth(2, 6000);
sheet.setColumnWidth(3, 6000);
sheet.setColumnWidth(4, 6000);*/
HSSFRow header = sheet.createRow(0);
//设置标题列行高
header.setHeight((short) 500);
// 产生标题列
String[] headers = { "设备名称", "规格型号", "生产厂家", "验收结论", "使用场区"};
for (int i = 0; i < headers.length; i++) {
HSSFCell cell = header.createCell(i);
cell.setCellValue(headers[i]);
cell.setCellStyle(cellStyleTitle);
//设置列宽
sheet.setColumnWidth(i, 6000);//这里是借用这个i而已,作用等同于上面的注释部分
}
int rowNumber = 1;
if(sbby.size()>0){
for (int x=0; x<sbby.size(); x++) {
HSSFRow row = sheet.createRow(rowNumber++);
JSONArray cells = (JSONArray) sbby.get(x);
for (int y=0; y < cells.size(); y++) {
Object value = cells.get(y);
HSSFCell cell = row.createCell(y);
if (value == null) {
} else {
if(value instanceof Integer){
cell.setCellValue((Integer)value);
}else if(value instanceof Date){
cell.setCellValue((Double)value);
}else if(value instanceof Date){
SimpleDateFormat dateFm = new SimpleDateFormat("yyyy-MM-dd");
cell.setCellValue( dateFm.format(value));
}else if(value instanceof String){
cell.setCellValue((String)value);
}
}
//把Excel中的单元格都设置为文本格式
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
}
}
}
}
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
}
}
因为实在是太简单了,都不知道怎么展开说,实在是个简单的不能再简单的例子,
1.先建一个工作簿,也就是excel文件 HSSFWorkbook workbook
2.在这个工作簿中建一个sheet页 HSSFSheet sheet = workbook.createSheet("sheet页名称");
3.建一个标题行 HSSFRow header = sheet.createRow(0);
4.在这一行建立单元格 HSSFCell cell = header.createCell(i);
5.单元格赋值和设置样式 cell.setCellValue(headers[i]); cell.setCellStyle(cellStyleTitle);
6.注意这里的样式不是直接设置的,而是在之前设置好一个样式,然后把它赋给单元格
HSSFCellStyle cellStyleTitle = workbook.createCellStyle();
7.循环建立行,往里面插入查询到的列表的数据 HSSFRow row = sheet.createRow(rowNumber++);
8.循环行的数据赋值也是一样的
9.然后就是固定的导出文件操作
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
10.一个最最简单的导出就完成了!
其实java中的很多东西都可以通过点点出来,也就是Alt+/,之后看看这些属性的名字也能知道个大概功能,设置样式什么的,比如文字水平居中,垂直居中,边框,还有字体的颜色,大小,下划线,加粗,倾斜什么的,都不是什么麻烦事,真正麻烦的只有刚开始接触,无处下口的感觉,希望这篇文章能帮助到大家。