package ebc.base.common; import java.io.IOException; import java.io.OutputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFFooter; 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 ExportExcelUtil { private static Connection conn ; private static String Driver = "org.gjt.mm.mysql.Driver"; private static String url = "jdbc:mysql://127.0.0.1:3306/cmdb"; private static String username = "root"; private static String password = "root"; //表头 public static final String[] tableHeader = {"品牌","所属公司","分公司","店铺编码","渠道","业务渠道", "店铺成本中心","店铺名称","POS店铺名称","上级","店铺间数", "开店时间","关店时间","状态","开/关店原因","备注","装修面积", "城市","城市等级"}; //创建工作本 public static HSSFWorkbook demoWorkBook = new HSSFWorkbook(); //创建表 public static HSSFSheet demoSheet = demoWorkBook.createSheet("Sheet1"); //表头的单元格个数目 public static final short cellNumber = (short)tableHeader.length; //数据库表的列数 public static final int columNumber = tableHeader.length; /** * 获得数据库连接 * @return conn */ public static Connection getConn(){ try { Class.forName(Driver); conn = DriverManager.getConnection(url,username,password); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } /** * 查找结果集 * @return * @throws SQLException */ public ResultSet selectAllDataFromDB() throws SQLException{ conn = getConn(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select J_BRAND,J_COM,J_DQ,J_DEPOTID,f_hzfs,B_CHANNEL,F_COSTCENTER," + "j_realname,J_NAME,J_FORM,P_JS,F_BEGINDATE,F_ENDDATE," + "J_FREEZE,f_kgdyy,f_bz,P_AREA,G_CS,G_CZ from storeinfo"); return rs; } /** * 创建表头 * @return */ public void createTableHeader(){ // HSSFHeader header = demoSheet.getHeader(); // header.setCenter("大区信息表"); HSSFRow headerRow = demoSheet.createRow((short) 0); for(int i = 0;i < cellNumber;i++){ HSSFCell headerCell = headerRow.createCell((short) i); headerCell.setEncoding(HSSFCell.ENCODING_UTF_16); headerCell.setCellValue(tableHeader[i]); headerCell.setCellStyle(getTitleStyle()); } } /** * 创建行 * @param cells * @param rowIndex */ public void createTableRow(List<String> cells,short rowIndex){ //创建第rowIndex行 HSSFRow row = demoSheet.createRow((short) rowIndex); row.setHeight((short) (15.625*20)); HSSFCellStyle style = getCellStyle(); for(short i = 0;i < cells.size();i++) { //创建第i个单元格 HSSFCell cell = row.createCell((short) i); cell.setCellStyle(style); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue(cells.get(i)); } } /** * 创建整个Excel表 * @throws SQLException * */ public void createExcelSheeet() throws SQLException{ createTableHeader(); ResultSet rs = selectAllDataFromDB(); int rowIndex = 1; while(rs.next()){ List<String> list = new ArrayList<String>(); for(int i = 1;i <= columNumber;i++) { list.add(rs.getString(i)); } createTableRow(list,(short)rowIndex); rowIndex++; } } /** * 导出表格 * @param sheet * @param os * @return * @throws IOException */ public void expord(OutputStream os) throws IOException{ demoSheet.setGridsPrinted(true); HSSFFooter footer = demoSheet.getFooter(); footer.setRight("Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages()); demoWorkBook.write(os); } /** * 设置头部样式 * @return HSSFCellStyle */ public HSSFCellStyle getTitleStyle(){ HSSFCellStyle style = demoWorkBook.createCellStyle(); HSSFFont font = demoWorkBook.createFont(); demoSheet.setColumnWidth((short)7, (short) 7000); demoSheet.setColumnWidth((short)8, (short) 7000); demoSheet.setColumnWidth((short)11, (short) 5000); demoSheet.setColumnWidth((short)12, (short) 5000); font.setFontName("Arial"); font.setFontHeightInPoints((short) 10);// 设置字体大小 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); style.setFillForegroundColor(HSSFColor.LAVENDER.index); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中 style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setWrapText(true); style.setFont(font); return style; } /** * 设置表格格样式 * @return HSSFCellStyle */ public HSSFCellStyle getCellStyle(){ HSSFCellStyle style = demoWorkBook.createCellStyle(); HSSFFont font = demoWorkBook.createFont(); font.setFontHeightInPoints((short) 10);// 设置字体大小 style.setFillForegroundColor(HSSFColor.LIGHT_GREEN.index); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中 style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setFont(font); return style; } }
在rest类中调用ExportExcelUtil
package ebc.baseserver.rest; import java.io.OutputStream; import java.net.URLEncoder; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.GET; import javax.ws.rs.HeaderParam; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.UriInfo; import ebc.base.common.ExportExcelUtil; import ebc.base.wrapper.ResponseWrapper; import ebc.base.wrapper.Wrapper; @Path("/base/exportexcel") public class ExportExcelResource { @Context ServletContext sc; @Context UriInfo uriInfo; @Context HttpServletRequest request; @Context HttpServletResponse response; @GET @Produces("application/json") public Wrapper Export(@HeaderParam("Range") String range){ long time = System.currentTimeMillis(); ExportExcelUtil export = new ExportExcelUtil(); OutputStream out = null; String filename = "店铺信息表.xsl"; ResultSet rs = null; try{ export.createTableHeader(); filename = URLEncoder.encode(filename,"utf-8");//解决在IE中文件名乱码 rs = export.selectAllDataFromDB(); int rowIndex = 1; while(rs.next()){ List<String> list = new ArrayList<String>(); for(int i = 1;i <= ExportExcelUtil.columNumber;i++) { list.add(rs.getString(i)); } export.createTableRow(list,(short)rowIndex); rowIndex++; } response.setContentType("application/ms-excel"); response.setHeader("Content-disposition", "attachment;filename="+new String(filename.getBytes("utf-8"),"ISO-8859-1")); out = response.getOutputStream(); export.expord(out); ResponseWrapper result = new ResponseWrapper(this); result.setCode("msg.001"); result.setType("success"); System.out.println("成功导出"+rowIndex+"条数据到"+filename+",共用时"+(System.currentTimeMillis()-time)/1000.0+"秒"); return result; }catch(Exception e){ e.printStackTrace(); return new ResponseWrapper(e); }finally{ try { if(rs!=null){ rs.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
最后备注下
excel导出后文件名乱码了。
解决办法:
response.setContentType("application/ms-excel");
String browser = request.getHeader("user-agent");
if(browser.indexOf("Firefox")!=-1){
response.setHeader("Content-disposition", "attachment;filename="+new String(filename.getBytes("utf-8"),"ISO-8859-1"));
}else{
filename = URLEncoder.encode(filename,"utf-8");
response.setHeader("Content-disposition", "attachment;filename="+filename);
}
out = response.getOutputStream();