在Java中封装导出Excel数据的总体思路为:
1.导出,根据查询得到的数据(一般我们页面上用的是查询条件带分页的),我们需要把查询条件带到后台重新查询,并且是查询全部数据,不带分页
2.不能用ajax异步提交。应该用location.href=""的方式,把处理的流交给浏览器来处理,JS无法处理流计算。
3.封装统一的Bean实体,主要输入导出的列名,excel名,数据集即可导出。
用到的Maven地址:
<!-- poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.13</version> </dependency> <dependency> <groupId>jexcelapi</groupId> <artifactId>jxl</artifactId> <version>2.6</version> </dependency>
ExcelBean:
public class ExcelBean { private String name; private String sheetName; private ExcelTitle[] titles; private List<String[]> dataList; private boolean headBold = true; /** * 列宽 (像素) */ private int columnWidth = 200; private int rowHeight; public ExcelBean(String name, String sheetName, ExcelTitle[] titles){ this.name = name; this.sheetName = sheetName; this.titles = titles; this.dataList = new ArrayList<String[]>(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSheetName() { return sheetName; } public void setSheetName(String sheetName) { this.sheetName = sheetName; } public ExcelTitle[] getTitles() { return titles; } public void setTitles(ExcelTitle[] titles) { this.titles = titles; } public List<String[]> getDataList() { return dataList; } public void setDataList(List<String[]> dataList) { this.dataList = dataList; } public boolean isHeadBold() { return headBold; } public void setHeadBold(boolean headBold) { this.headBold = headBold; } public int getColumnWidth() { return columnWidth; } public void setColumnWidth(int columnWidth) { this.columnWidth = columnWidth; } public int getRowHeight() { return rowHeight; } public void setRowHeight(int rowHeight) { this.rowHeight = rowHeight; } public void add(String[] data){ this.dataList.add(data); } }
ExcelBox:
/** * excel 块状区域 * @author * */public class ExcelBox { private int x1; private int y1; private int x2; private int y2; public ExcelBox(int width, int height, int colWidth, int rowHeight, int padding){ double ratio = 1; int innerWidth = colWidth - 2 * padding; int innerHeight = rowHeight - 2 * padding; if((double) width / height > (double) innerWidth/ innerHeight){ if(width > innerWidth){ ratio = (double) innerWidth / width; } } else{ if(height > innerHeight){ ratio = (double) innerHeight / height; } } int boxWidth = (int)(width * ratio); int boxHeight = (int)(height * ratio); x1 = (colWidth - boxWidth) / 2; y1 = (rowHeight - boxHeight) / 2; x2 = x1 + boxWidth; y2 = y1+ boxHeight; } public int getX1() { return x1; } public void setX1(int x1) { this.x1 = x1; } public int getY1() { return y1; } public void setY1(int y1) { this.y1 = y1; } public int getX2() { return x2; } public void setX2(int x2) { this.x2 = x2; } public int getY2() { return y2; } public void setY2(int y2) { this.y2 = y2; }}
ExcelImage:
/** * excel 图片 * @ * */ public class ExcelImage { private int width; private int height; private byte[] byteArray; public ExcelImage(String imageUrl) throws IOException{ BufferedImage bufferedImage = ImageIO.read(new URL(imageUrl)); ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream(); ImageIO.write(bufferedImage,"png", byteArrayOutputStream); width = bufferedImage.getWidth(); height = bufferedImage.getHeight(); byteArray = byteArrayOutputStream.toByteArray(); byteArrayOutputStream.close(); } public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } public byte[] getByteArray() { return byteArray; } public void setByteArray(byte[] byteArray) { this.byteArray = byteArray; } }
ExcelTitle:
/** * Excel Title * @author * */ public class ExcelTitle { private String value; /** * 列宽(像素) */ private int width; public static ExcelTitle generate(String value, int width){ ExcelTitle title = new ExcelTitle(); title.setValue(value); title.setWidth(width); return title; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } }
工具类 ExcelUtils:
package com.goldensky.common.excelutil; import java.io.ByteArrayOutputStream;import java.io.OutputStream;import java.util.regex.Pattern; 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.HSSFClientAnchor;import org.apache.poi.hssf.usermodel.HSSFFont;import org.apache.poi.hssf.usermodel.HSSFPatriarch;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.hssf.util.HSSFColor; public class excelExport { /*@SuppressWarnings("resource") public static void export( ExcelBean excelBean, HttpServletResponse response) throws Exception{ HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(excelBean.getSheetName()); HSSFRow row = sheet.createRow(0); //设置样式 HSSFCellStyle style = wb.createCellStyle(); if(excelBean.isHeadBold()){ HSSFFont headfont = wb.createFont(); headfont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); style.setFont(headfont); } HSSFCell cell; ExcelTitle[] titles = excelBean.getTitles(); for(int i=0; i < titles.length; i++){ ExcelTitle title = titles[i]; cell= row.createCell(i); cell.setCellValue(title.getValue()); cell.setCellStyle(style); int columnWidth = title.getWidth() > 0 ? title.getWidth() : excelBean.getColumnWidth(); sheet.setColumnWidth(i, getColWidth(columnWidth)); } int rowNumber = 1; int rowHeihgt = excelBean.getRowHeight(); HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); for(String[] data : excelBean.getDataList()){ row = sheet.createRow(rowNumber ++ ); if(rowHeihgt > 0){ row.setHeight((short) getRowHeight(rowHeihgt)); } else{ rowHeihgt = 18; } for(int j=0; j<data.length; j ++){ String value = data[j]; cell = row.createCell(j); if(isUrl(value)){ if(isImage(value)){ int columnWidth = titles[j].getWidth() > 0 ? titles[j].getWidth() : excelBean.getColumnWidth(); ExcelImage excelImage = new ExcelImage(value); ExcelBox excelBox = new ExcelBox(excelImage.getWidth(), excelImage.getHeight(), rowHeihgt, columnWidth, 10); HSSFClientAnchor anchor = new HSSFClientAnchor(); int cw = getColWidth(columnWidth); int rh = getRowHeight(rowHeihgt); short col = (short)(j); int rowNum = rowNumber-1; anchor.setDx1(getAnchorX(excelBox.getX1(), cw)); anchor.setDy1(getAnchorY(excelBox.getY1(), rh)); anchor.setDx2(getAnchorX(excelBox.getX2(), cw)); anchor.setDy2(getAnchorY(excelBox.getY2(), rh)); anchor.setCol1(col); anchor.setRow1(rowNum); anchor.setCol2(col); anchor.setRow2(rowNum); anchor.setAnchorType(0); patriarch.createPicture(anchor , wb.addPicture(excelImage.getByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG)); } else{ cell.setCellValue(value); cell.setCellFormula("HYPERLINK(\"" + value + "\",\"" + value + "\")"); HSSFCellStyle linkStyle = wb.createCellStyle(); HSSFFont cellFont= wb.createFont(); cellFont.setUnderline((byte) 1); cellFont.setColor(HSSFColor.BLUE.index); linkStyle.setFont(cellFont); linkStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); cell.setCellStyle(linkStyle); } } else{ cell.setCellValue(value); HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); cell.setCellStyle(cellStyle); } } } response.setContentType("application/octet-stream;charset=utf-8"); response.setCharacterEncoding("utf-8"); String filename = excelBean.getName(); filename = new String(filename.replaceAll("\\s|;", "").getBytes("gbk"), "ISO8859-1"); response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment;filename=" + filename); OutputStream ouputStream = response.getOutputStream(); wb.write(ouputStream); ouputStream.flush(); ouputStream.close(); }*/ @SuppressWarnings("resource") public static void export( ExcelBean excelBean, HttpServletResponse response) throws Exception{ HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(excelBean.getSheetName()); HSSFRow row = sheet.createRow(0); //设置样式 HSSFCellStyle style = wb.createCellStyle(); if(excelBean.isHeadBold()){ HSSFFont headfont = wb.createFont(); headfont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); style.setFont(headfont); } HSSFCell cell; ExcelTitle[] titles = excelBean.getTitles(); for(int i=0; i < titles.length; i++){ ExcelTitle title = titles[i]; cell= row.createCell(i); cell.setCellValue(title.getValue()); cell.setCellStyle(style); int columnWidth = title.getWidth() > 0 ? title.getWidth() : excelBean.getColumnWidth(); sheet.setColumnWidth(i, getColWidth(columnWidth)); } int rowNumber = 1; int rowHeihgt = excelBean.getRowHeight(); HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); for(String[] data : excelBean.getDataList()){ row = sheet.createRow(rowNumber ++ ); if(rowHeihgt > 0){ row.setHeight((short) getRowHeight(rowHeihgt)); } else{ rowHeihgt = 18; } for(int j=0; j<data.length; j ++){ String value = data[j]; cell = row.createCell(j); if(isUrl(value)){ if(isImage(value)){ int columnWidth = titles[j].getWidth() > 0 ? titles[j].getWidth() : excelBean.getColumnWidth(); ExcelImage excelImage = new ExcelImage(value); ExcelBox excelBox = new ExcelBox(excelImage.getWidth(), excelImage.getHeight(), rowHeihgt, columnWidth, 10); HSSFClientAnchor anchor = new HSSFClientAnchor(); int cw = getColWidth(columnWidth); int rh = getRowHeight(rowHeihgt); short col = (short)(j); int rowNum = rowNumber-1; anchor.setDx1(getAnchorX(excelBox.getX1(), cw)); anchor.setDy1(getAnchorY(excelBox.getY1(), rh)); anchor.setDx2(getAnchorX(excelBox.getX2(), cw)); anchor.setDy2(getAnchorY(excelBox.getY2(), rh)); anchor.setCol1(col); anchor.setRow1(rowNum); anchor.setCol2(col); anchor.setRow2(rowNum); anchor.setAnchorType(0); patriarch.createPicture(anchor , wb.addPicture(excelImage.getByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG)); } else{ cell.setCellValue(value); cell.setCellFormula("HYPERLINK(\"" + value + "\",\"" + value + "\")"); HSSFCellStyle linkStyle = wb.createCellStyle(); HSSFFont cellFont= wb.createFont(); cellFont.setUnderline((byte) 1); cellFont.setColor(HSSFColor.BLUE.index); linkStyle.setFont(cellFont); linkStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); cell.setCellStyle(linkStyle); } } else{ cell.setCellValue(value); HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); cell.setCellStyle(cellStyle); } } } response.setContentType("application/octet-stream;charset=utf-8"); response.setCharacterEncoding("utf-8"); String filename = excelBean.getName(); filename = new String(filename.replaceAll("\\s|;", "").getBytes("gbk"), "ISO8859-1"); response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment;filename=" + filename); ByteArrayOutputStream out = new ByteArrayOutputStream(); wb.write(out); byte[] ret = out.toByteArray(); out.flush(); out.close(); FileUpDown file = new FileUpDown(); file.download(filename, ret, response); } /** * 获取图片x方向长度坐标转换 * @param px * @param colWidth * @return */ public static int getAnchorX(int px, int colWidth){ return (int) Math.round(( (double) 701 * 16000.0 / 301)*((double)1/colWidth)*px); } /** * 获取图片y方向长度坐标转换 * @param px * @param rowHeight * @return */ public static int getAnchorY(int px, int rowHeight){ return (int) Math.round(( (double) 144 * 8000 / 301)*((double)1/rowHeight)*px); } /** * 行高转换 * @param px * @return */ public static int getRowHeight( int px ){ return (int) Math.round(((double) 4480 / 300 ) * px); } /** * 列宽转换 * @param px * @return */ public static int getColWidth( int px ){ return (int) Math.round(((double) 10971 / 300 ) * px); } /** * 判断是否为链接地址 */ public static boolean isUrl(String string){ Pattern pattern = Pattern.compile("^((http|https):\\/\\/([\\w\\-]+\\.)+[\\w\\-]+(\\/[\\w\\u4e00-\\u9fa5\\-\\.\\/?\\@\\%\\!\\&=\\+\\~\\:\\#\\;\\,]*)?)", Pattern.CASE_INSENSITIVE ); return pattern.matcher(string).matches(); } /** * 判断是否为图片 */ public static boolean isImage(String string){ Pattern pattern = Pattern.compile("\\S+\\.(jpg|jpeg|png|gif|bmp)(\\?\\S+)?$", Pattern.CASE_INSENSITIVE ); return isUrl(string) && pattern.matcher(string).matches(); } }
下载类,FileUpDown:
package com.goldensky.common.excelutil; import java.util.regex.Matcher;import java.util.regex.Pattern; import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.ss.usermodel.Workbook; public class FileUpDown { /** * 导出文件,注意:导出后缓存将被删除 * * @param fileName 文件名 * @param buffer 文件内容缓存 * @param response HttpServletResponse对象 * @return 如果出错返回错误信息 */ public static String download(String fileName, byte[] buffer, HttpServletResponse response) { String ret = ""; javax.servlet.ServletOutputStream outputStream = null; try { if (buffer != null && buffer.length > 0) { String strFileName = new String(fileName.getBytes("utf-8"), "utf-8"); response.reset(); response.setContentType("application/x-download"); response.setHeader("Content-Disposition", "attachment; filename=\"" + strFileName + "\""); int length = buffer.length; outputStream = response.getOutputStream(); outputStream.write(buffer, 0, length); outputStream.flush(); outputStream.close(); response.setStatus(HttpServletResponse.SC_OK); response.flushBuffer(); } } catch (Exception e) { } finally { buffer = null; } return ret; } /** * 下载数组内容到客户端一文件 */ public static void download(HttpServletResponse response, HttpServletRequest request, byte[] buffer, String strFileName) { try { // strFileName = new String( strFileName.getBytes("Big5"), // "ISO8859_1" )); strFileName = new String(strFileName.getBytes("gb2312"), "iso-8859-1"); response.reset(); response.setContentType("application/x-download"); // if (request.getHeader("User-Agent").indexOf("MSIE 5.5") != -1) { // ... IE5.5不能加上 attachment; response.setHeader("Content-Disposition", "attachment; filename=\"" + strFileName + "\""); int length = buffer.length; ServletOutputStream outputStream = response.getOutputStream(); outputStream.write(buffer, 0, length); outputStream.flush(); outputStream.close(); response.setStatus(HttpServletResponse.SC_OK); response.flushBuffer(); } catch (Exception e) { } }}
调用示例:
前台:
//导出Excel数据 function exportexcel() { var drvalue=$("#drstatus").combobox(‘getValue‘); location.href="${localCtx }/approvaloption/export.do?flowstatus="+drvalue+"&&roleid="+${sysUser.userrole.nRoleId}+""; }
后台调用:
@RequestMapping(value="export.do") public void exportExcel(String flowstatus,Long roleid,HttpServletResponse response) { Long status=(null!=flowstatus&&!"".equals(flowstatus))?Long.parseLong(flowstatus):null; List<Flow> list=flowService.getList(roleid,status); ExcelTitle[] titles = { ExcelTitle.generate("流程名称", 60), ExcelTitle.generate("流程描述", 100), ExcelTitle.generate("流程节点名称", 100), ExcelTitle.generate("审批人", 100), ExcelTitle.generate("通行证类型", 100), ExcelTitle.generate("号牌号码", 100), ExcelTitle.generate("车辆使用单位", 100), ExcelTitle.generate("业务类别", 100), ExcelTitle.generate("审批状态", 100), }; SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); String fileName = format.format(Calendar.getInstance().getTime())+"审核结果.xls"; ExcelBean excelBean = new ExcelBean(fileName, "统计", titles); for(Flow fl : list){ String flowname=fl.getFd().getFlowName(); String flowdesc=fl.getFd().getFlowDesc(); String nodeName=fl.getFn().getNodeNames(); String spr=fl.getT().getRoleName(); String txzlx=fl.getDic().getDmsm1(); String hphm=fl.getTp().getHphm(); String clsydw=fl.getTp().getClsydw(); String ywlb=(fl.getTp().getYwlb()==1)?"业务申请":"延期"; String splc=(fl.getApproveStatus()==1L)?"未审批":"已审批"; excelBean.add(new String[]{flowname,flowdesc,nodeName,spr,txzlx,hphm,clsydw,ywlb,splc}); } try { excelExport.export(excelBean, response); } catch (Exception e) { e.printStackTrace(); } }
时间: 2024-10-18 06:58:47