基于struts实现源码地址:https://gitee.com/never_enough/javaPoiDemo
下面不是基于struts实现的:
1、首先页面发起请求:
window.open("${ctx}/qianbao/exportSelected?processId=${processId}&instanceState=${instanceState}&instanceIds="+instanceIds, "_blank");
2、控制层:
与之前struts里面的ServletActionContext不同,这里咱们使用正常的HttpServletResponse就行:
3、导出Excel 工具类
import cn.udrm.wsdw.process.model.ProcessInfo;
import cn.udrm.wsdw.process.util.DateUtil;
import jxl.write.WritableCellFormat;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
import java.io.InputStream;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @description 导出Excel 工具类
* @author
* @date 2020/8/4 10:28
*/
public class ExcelUtil {
//一行一行 一列一列的放入数据
public static void fillExcelData(List<ProcessInfo> processInfoList, Workbook wb, String[] headers)throws Exception{
int rowIndex=0;
Sheet sheet=wb.createSheet();
Row row=sheet.createRow(rowIndex++);
//把第一行标题 塞进去
for(int i=0;i<headers.length;i++){
Cell cell = row.createCell(i);
CellStyle cellStyle = wb.createCellStyle(); //设置样式
cellStyle.setAlignment(HorizontalAlignment.forInt(2)); //设置水平方向的对其方式
cellStyle.setVerticalAlignment(VerticalAlignment.forInt(1)); //设置垂直方法的对齐方式
cell.setCellValue(headers[i]);
cell.setCellStyle(cellStyle);
}
/* 从数据库中读取数据 然后存到文件里面 */
/*
while(rs.next()){ //遍历行
row=sheet.createRow(rowIndex++); //继续创建行
for(int i=0;i<headers.length;i++){
row.createCell(i).setCellValue(rs.getObject(i+1).toString());
}
}
*/
/* 数据源一般为一个list,遍历list,得到对象 然后存到文件里面 */
int size = processInfoList.size();
ProcessInfo processInfo = null;
CellStyle cellStyle = wb.createCellStyle(); //设置样式
cellStyle.setAlignment(HorizontalAlignment.forInt(2)); //设置水平方向的对其方式
cellStyle.setVerticalAlignment(VerticalAlignment.forInt(1)); //设置垂直方法的对齐方式
for(int i = 0; i < size; i ++) {
row=sheet.createRow(rowIndex++); //继续创建行
processInfo = processInfoList.get(i);
row.setRowStyle(cellStyle);
row.createCell((short) 0).setCellValue(i+1); //序号
row.getCell(0).setCellStyle(cellStyle);
row.createCell((short) 1).setCellValue(""); //状态 todo
row.createCell((short) 2).setCellValue(processInfo.getSerialNumber()); //流水号
row.createCell((short) 3).setCellValue(processInfo.getWenhao()); //签报号
row.createCell((short) 4).setCellValue(processInfo.getTitle()); //标题
row.getCell(4).setCellStyle(cellStyle);
Date date = processInfo.getCreated();
String dateStr = DateUtil.formatDate(date, "yyyy-MM-dd HH:mm:ss"); //yyyy-MM-dd hh:mm:ss 12小时制
row.createCell((short) 5).setCellValue(dateStr); //起草时间
row.createCell((short) 6).setCellValue(processInfo.getCbdeptname()); //呈报单位
row.createCell((short) 7).setCellValue(processInfo.getYpld()); //阅批领导 (呈送领导)
row.createCell((short) 8).setCellValue(processInfo.getStatus()); //当前流程
}
}
}
4、导出Excel 响应工具类
import org.apache.poi.ss.usermodel.Workbook;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.io.PrintWriter;
/**
* @description 导出Excel 响应工具类
* @date 2020/8/4 10:27
*/
public class ResponseUtil {
public static void write(HttpServletResponse response, Object o)throws Exception{
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
out.print(o.toString());
out.flush();
out.close();
}
public static void export(HttpServletResponse response, Workbook wb, String fileName)throws Exception{
response.setHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("utf-8"),"iso8859-1"));
response.setContentType("application/ynd.ms-excel;charset=UTF-8");
OutputStream out=response.getOutputStream();
wb.write(out);
out.flush();
out.close();
}
}
5、还有需要注意的一点:谷歌浏览器会有默认文件存储路径,所以导致无法指定文件输出路径,试一下其他浏览器是可以选择文件导出路径的。
6、参考 POI-设置单元格的对齐方式