另外一种excel导出
一、excelUtil工具类
package com.velcro.kms.report.utils; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.CellRangeAddress; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.FormulaEvaluator; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; /** * 导出Excel公共方法 * @version 1.0 * * @author wangcp * */ public class ExportExcel { //显示的导出表的标题 private String title; //导出表的列名 private String[] rowName ; private List<Object[]> dataList = new ArrayList<Object[]>(); private static DecimalFormat integerFormat=new DecimalFormat("0");//格式化number,String private static SimpleDateFormat timeFormat=new SimpleDateFormat("yyyy-MM-dd");//格式化日期 private static DecimalFormat decimalFormat=new DecimalFormat("0.00");//格式化数字 HttpServletResponse response; //构造方法,传入要导出的数据 public ExportExcel(HttpServletResponse response, String title, String[] rowName, List<Object[]> dataList){ this.response= response; this.dataList = dataList; this.rowName = rowName; this.title = title; } /* * 导出数据 * */ public void export() throws Exception{ HSSFWorkbook workbook = new HSSFWorkbook(); // 创建工作簿对象 try{ HSSFSheet sheet = workbook.createSheet(title); // 创建工作表 // 产生表格标题行 HSSFRow rowm = sheet.createRow(0); HSSFCell cellTiltle = rowm.createCell(0); //sheet样式定义【getColumnTopStyle()/getStyle()均为自定义方法 - 在下面 - 可扩展】 HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook);//获取列头样式对象 HSSFCellStyle style = this.getStyle(workbook); //单元格样式对象 sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (rowName.length-1))); cellTiltle.setCellStyle(columnTopStyle); cellTiltle.setCellValue(title); // 定义所需列数 int columnNum = rowName.length; HSSFRow rowRowName = sheet.createRow(2); // 在索引2的位置创建行(最顶端的行开始的第二行) // 将列头设置到sheet的单元格中 for(int n=0;n<columnNum;n++){ HSSFCell cellRowName = rowRowName.createCell(n); //创建列头对应个数的单元格 cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); //设置列头单元格的数据类型 HSSFRichTextString text = new HSSFRichTextString(rowName[n]); cellRowName.setCellValue(text); //设置列头单元格的值 cellRowName.setCellStyle(columnTopStyle); //设置列头单元格样式 } //将查询出的数据设置到sheet对应的单元格中 for(int i=0;i<dataList.size();i++){ Object[] obj = dataList.get(i);//遍历每个对象 HSSFRow row = sheet.createRow(i+3);//创建所需的行数 for(int j=0; j<obj.length; j++){ HSSFCell cell = null; //设置单元格的数据类型 /* if(j == 0){ cell = row.createCell(j, HSSFCell.CELL_TYPE_NUMERIC); cell.setCellValue(i+1); }else if(j == 5){ cell = row.createCell(j, HSSFCell.CELL_TYPE_NUMERIC); if(!"".equals(obj[j]) && obj[j] != null){ cell.setCellValue(Double.parseDouble(obj[j].toString())); //设置单元格的值 } }else if(j == 10){ cell = row.createCell(j, HSSFCell.CELL_TYPE_NUMERIC); if(!"".equals(obj[j]) && obj[j] != null){ cell.setCellValue(Double.parseDouble(obj[j].toString())); //设置单元格的值 } }else{ cell = row.createCell(j, HSSFCell.CELL_TYPE_STRING); if(!"".equals(obj[j]) && obj[j] != null){ cell.setCellValue(obj[j].toString()); //设置单元格的值 } }*/ cell = row.createCell(j, HSSFCell.CELL_TYPE_STRING); if(!"".equals(obj[j]) && obj[j] != null){ cell.setCellValue(obj[j].toString()); //设置单元格的值 } cell.setCellStyle(style); //设置单元格样式 } } //让列宽随着导出的列长自动适应 for (int colNum = 0; colNum < columnNum; colNum++) { int columnWidth = sheet.getColumnWidth(colNum) / 200; for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) { HSSFRow currentRow; //当前行未被使用过 if (sheet.getRow(rowNum) == null) { currentRow = sheet.createRow(rowNum); } else { currentRow = sheet.getRow(rowNum); } if (currentRow.getCell(colNum) != null) { HSSFCell currentCell = currentRow.getCell(colNum); if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) { int length = currentCell.getStringCellValue().getBytes().length; if (columnWidth < length) { columnWidth = length; } } } } if(colNum == 0){ sheet.setColumnWidth(colNum, (columnWidth-2) * 300); }else{ /*if(columnWidth<255*256){ sheet.setColumnWidth(colNum, columnWidth < 3000 ? 3000 : columnWidth); }else{ sheet.setColumnWidth(colNum,6000 ); }*/ sheet.setColumnWidth(colNum, (columnWidth+4) * 300); } } if(workbook !=null){ OutputStream out=null; try { String fileName = "Excel-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls"; String headStr = "attachment; filename=\"" + fileName + "\""; response.setContentType("APPLICATION/OCTET-STREAM"); response.setHeader("Content-Disposition", headStr); out = response.getOutputStream(); workbook.write(out); } catch (IOException e) { e.printStackTrace(); }finally { try{ out.close(); }catch (IOException e){ e.printStackTrace(); } } } }catch(Exception e){ e.printStackTrace(); }finally { //清理资源 try { workbook.close(); }catch (Exception e){ e.printStackTrace(); } } } /* * 列头单元格样式 */ public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) { // 设置字体 HSSFFont font = workbook.createFont(); //设置字体大小 font.setFontHeightInPoints((short)11); //字体加粗 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //设置字体名字 font.setFontName("Courier New"); //设置样式; HSSFCellStyle style = workbook.createCellStyle(); //设置底边框; style.setBorderBottom(HSSFCellStyle.BORDER_THIN); //设置底边框颜色; style.setBottomBorderColor(HSSFColor.BLACK.index); //设置左边框; style.setBorderLeft(HSSFCellStyle.BORDER_THIN); //设置左边框颜色; style.setLeftBorderColor(HSSFColor.BLACK.index); //设置右边框; style.setBorderRight(HSSFCellStyle.BORDER_THIN); //设置右边框颜色; style.setRightBorderColor(HSSFColor.BLACK.index); //设置顶边框; style.setBorderTop(HSSFCellStyle.BORDER_THIN); //设置顶边框颜色; style.setTopBorderColor(HSSFColor.BLACK.index); //在样式用应用设置的字体; style.setFont(font); //设置自动换行; style.setWrapText(false); //设置水平对齐的样式为居中对齐; style.setAlignment(HSSFCellStyle.ALIGN_CENTER); //设置垂直对齐的样式为居中对齐; style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); return style; } /* * 列数据信息单元格样式 */ public HSSFCellStyle getStyle(HSSFWorkbook workbook) { // 设置字体 HSSFFont font = workbook.createFont(); //设置字体大小 //font.setFontHeightInPoints((short)10); //字体加粗 //font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //设置字体名字 font.setFontName("Courier New"); //设置样式; HSSFCellStyle style = workbook.createCellStyle(); //设置底边框; style.setBorderBottom(HSSFCellStyle.BORDER_THIN); //设置底边框颜色; style.setBottomBorderColor(HSSFColor.BLACK.index); //设置左边框; style.setBorderLeft(HSSFCellStyle.BORDER_THIN); //设置左边框颜色; style.setLeftBorderColor(HSSFColor.BLACK.index); //设置右边框; style.setBorderRight(HSSFCellStyle.BORDER_THIN); //设置右边框颜色; style.setRightBorderColor(HSSFColor.BLACK.index); //设置顶边框; style.setBorderTop(HSSFCellStyle.BORDER_THIN); //设置顶边框颜色; style.setTopBorderColor(HSSFColor.BLACK.index); //在样式用应用设置的字体; style.setFont(font); //设置自动换行; style.setWrapText(false); //设置水平对齐的样式为居中对齐; style.setAlignment(HSSFCellStyle.ALIGN_CENTER); //设置垂直对齐的样式为居中对齐; style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); return style; } /** * 得到Excel表中的值 * @param cell * @return String * @author ZamXie */ public static String getCellString(HSSFCell cell){ String value=null; if(cell==null){ return value; } //System.out.println(cell.getCellStyle()+"*******"+cell.getCellStyle().getDataFormatString()); switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING: value=cell.getStringCellValue(); System.out.println(value); break; case HSSFCell.CELL_TYPE_NUMERIC: if("@".equals(cell.getCellStyle().getDataFormatString())){ value=integerFormat.format(cell.getNumericCellValue()); }else if("General".equals(cell.getCellStyle().getDataFormatString())){ //System.out.println("-------------cnum= "+cell.getColumnIndex()); if(cell.getColumnIndex()==13){ BigDecimal bd = new BigDecimal(cell.getNumericCellValue()); value= bd.toPlainString(); // System.out.println(value); // value = String.valueOf(setScale.toPlainString()); }else{ value=decimalFormat.format(cell.getNumericCellValue()); } }else if("0_);[Red]\\(0\\)".equals(cell.getCellStyle().getDataFormatString())){ value=integerFormat.format(cell.getNumericCellValue()); }else if("0.00".equals(cell.getCellStyle().getDataFormatString())|| "0".equals(cell.getCellStyle().getDataFormatString())|| "0.00_);[Red]\\(0.00\\)".equals(cell.getCellStyle().getDataFormatString())){ value=decimalFormat.format(cell.getNumericCellValue());//自定义 }else{ value=timeFormat.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())); } break; case HSSFCell.CELL_TYPE_BOOLEAN: value=cell.getBooleanCellValue()+""; break; case HSSFCell.CELL_TYPE_BLANK: value=""; break; case HSSFCell.CELL_TYPE_FORMULA://解析excel中函数 FormulaEvaluator evaluator = cell.getSheet().getWorkbook().getCreationHelper().createFormulaEvaluator(); evaluator.evaluateFormulaCell(cell); Cell cell1 = evaluator.evaluateInCell(cell); try { value = String.valueOf(cell1.getStringCellValue()); } catch (IllegalStateException e) { BigDecimal bd = new BigDecimal(cell1.getNumericCellValue()); value = String.valueOf(bd.toPlainString()); } break; default: value=cell.toString(); } return value; } public static void main(String[] args) { /* String title = "鱼蛋"; String[] rowsName = new String[]{"序号","货物运输批次号","提运单号","状态","录入人","录入时间"}; List<Object[]> dataList = new ArrayList<Object[]>(); Object[] objs = null; for (int i = 0; i < manifestIMainList.size(); i++) { ManifestIMain man = manifestIMainList.get(i); objs = new Object[rowsName.length]; objs[0] = i; objs[1] = man.getTranNo(); objs[2] = man.getBillNo(); objs[3] = man.getStatusFlagCnName(); objs[4] = man.getLoginName(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date = df.format(man.getModiDate()); objs[5] = date; dataList.add(objs); } ExportExcel ex = new ExportExcel(title, rowsName, dataList); ex.export();*/ } }
二、jsp界面
<button onclick="export1()" value="导出">导出</button>
三、js文件
function export1() { // $.ajax({ // url: "/kms/knowledgeView/export.do", // type: "POST", // dataType: "json", // success: function (data) { // // } // }); // var form=$('<form method="post" action="/kms/knowledgeView/export.do" >/kms/knowledgeView/export.do</form>'); // console.log(form) // form.appendTo('body').submit().remove(); // return ;
//ajax方式请求路径,要想出现下载Excel的弹窗,应该是重新打开一个窗口,而ajax默认不动页面直接将值返回,所以没有提升下载。
window.location.href="/kms/knowledgeView/export.do"; }
四、comtroller
@RequestMapping(value = "/kms/knowledgeView/export") public void export( HttpServletRequest request,HttpServletResponse response) throws Exception { KnowledgeViewModel r = WebUtils.requestToBean(request, KnowledgeViewModel.class); //获取表头 String[] rowsName={"部门","跨部门浏览量","本部门浏览量"}; List<KnowledgeViewModel> orgList=knowledgeViewService.getOrgList(); String title = "本年浏览量"; List<Object[]> dataList = new ArrayList<Object[]>(); Object[] objs = null; for (int i = 0; i < orgList.size(); i++) { KnowledgeViewModel orgs = orgList.get(i); objs = new Object[rowsName.length]; objs[0] = orgs.getOrgName()!=null&& StringUtils.isNotEmpty(orgs.getOrgName()) ? orgs.getOrgName() : "-"; objs[1] = orgs.getNum(); objs[2] = orgs.getSumNum(); dataList.add(objs); } ExportExcel ex = new ExportExcel(response,title, rowsName, dataList); ex.export(); }
结果界面: