zoukankan      html  css  js  c++  java
  • Servlet 中使用POI生成Excel

    使用的是poi3.13

    http://mvnrepository.com/artifact/org.apache.poi/poi/3.13

    import java.io.IOException;
    import java.io.OutputStream;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Iterator;
    import java.util.List;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    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.HSSFRichTextString;
    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;
    
    /**
     * @author yan
     * @param <T>
     * @date 2016-12-6 20:38:24
     * @version V1.0
     * @desc 
     */
    public class ExcelUtil<T> {
    
        public HSSFWorkbook exportExcel(String title, String[] headers, List<T> dataset) {
    
            // 声明一个工作薄  
            HSSFWorkbook workbook = new HSSFWorkbook();
            // 生成一个表格  
            HSSFSheet sheet = workbook.createSheet(title);
            // 设置表格默认列宽度为15个字节  
            sheet.setDefaultColumnWidth((short) 15);  
            
            // 生成一个样式  
            HSSFCellStyle style = workbook.createCellStyle();
            // 设置这些样式  
            style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
            style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            
            // 生成一个字体  
            HSSFFont font = workbook.createFont();
            font.setColor(HSSFColor.VIOLET.index);
            font.setFontHeightInPoints((short) 12);
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    
            // 把字体应用到当前的样式  
            style.setFont(font);
            // 生成并设置另一个样式  
            HSSFCellStyle style2 = workbook.createCellStyle();
            style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
            style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
            style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
            // 生成另一个字体  
            HSSFFont font2 = workbook.createFont();
            font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
            // 把字体应用到当前的样式  
            style2.setFont(font2);
    
            // 产生表格标题行  
            HSSFRow row = sheet.createRow(0);
            for (short i = 0; i < headers.length; i++) {
                HSSFCell cell = row.createCell(i);
                cell.setCellStyle(style);
                HSSFRichTextString text = new HSSFRichTextString(headers[i]);
                cell.setCellValue(text);
            }
    
            // 遍历集合数据,产生数据行  
            Iterator<T> it = dataset.iterator();
            int index = 0;
    
            try {
    
                while (it.hasNext()) {
                    index++;
                    row = sheet.createRow(index);
                    T t = (T) it.next();
    
                    // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值  
                    Field[] fields = t.getClass().getDeclaredFields();
                    for (short i = 0; i < fields.length; i++) {
                        HSSFCell cell = row.createCell(i);
                        cell.setCellStyle(style2);
                        Field field = fields[i];
                        String fieldName = field.getName();
                        String getMethodName = "get"
                                + fieldName.substring(0, 1).toUpperCase()
                                + fieldName.substring(1);
    
                        Class tCls = t.getClass();
    
                        Method getMethod = tCls.getMethod(getMethodName, new Class[]{});
    
                        Object value = getMethod.invoke(t, new Object[]{});
    
                        //全部当做字符串来处理
                        String textValue = value.toString();
               
                        if (textValue != null) {
                            HSSFRichTextString richString = new HSSFRichTextString(textValue);
                            HSSFFont font3 = workbook.createFont();
                            font3.setColor(HSSFColor.BLUE.index);
                            richString.applyFont(font3);
                            cell.setCellValue(richString);
                        }
                    }
                }
    
            } catch (NoSuchMethodException ex) {
                Logger.getLogger(NewServlet.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SecurityException ex) {
                Logger.getLogger(NewServlet.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(NewServlet.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalArgumentException ex) {
                Logger.getLogger(NewServlet.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InvocationTargetException ex) {
                Logger.getLogger(NewServlet.class.getName()).log(Level.SEVERE, null, ex);
            }
            
            return workbook;
        }
    }
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    import java.util.ArrayList;
    import java.util.List;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.commons.codec.binary.Base64;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    
    /**
     *
     * @author yan
     */
    public class NewServlet extends HttpServlet {
    
        protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            response.setHeader("Connection", "close");
            response.setHeader("Content-Type", "application/vnd.ms-excel;charset=UTF-8");
            String filename = System.currentTimeMillis() + "学生信息.xls";
            filename = encodeFileName(request, filename);
            response.setHeader("Content-Disposition", "attachment;filename=" + filename);
            
            OutputStream out = null;
            
            try {
                String[] headers = { "姓名", "年龄"};  
                List<Student> dataset = new ArrayList<Student>();  
                dataset.add(new Student("张三张三张三张三张三张三", "20"));  
                dataset.add(new Student("李四", "24"));  
                dataset.add(new Student("王五王五王五王五王五王五王五王五", "2211111111111123213")); 
            
                ExcelUtil<Student> eu = new ExcelUtil<Student>();
                HSSFWorkbook workbook = eu.exportExcel("发票领用",headers,dataset);
                
                out = response.getOutputStream();  
                workbook.write(out);  
            } finally {
                if(out!=null){
                    out.close();
                }
            }
        }
        
        public String encodeFileName(HttpServletRequest request, String fileName) throws UnsupportedEncodingException {
            String agent = request.getHeader("USER-AGENT");
    
            if (null != agent && -1 != agent.indexOf("MSIE")) {
                return URLEncoder.encode(fileName, "UTF-8");
            } else if (null != agent && -1 != agent.indexOf("Mozilla")) {
                return "=?UTF-8?B?"+ (new String(Base64.encodeBase64(fileName.getBytes("UTF-8")))) + "?=";
            } else {
                return fileName;
            }
        }
    
        
        
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            processRequest(request, response);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            processRequest(request, response);
        }
    }
  • 相关阅读:
    Vimdiff的用法 简单
    VIM插件使用 简单
    张子阳:大道至简,职场上做人做事做管理 简单
    VIM常用快捷键整理 简单
    从程序员到项目经理(四):外行可以领导内行吗 简单
    从程序员到项目经理(三):认识项目经理 简单
    余波:技术人员如何走出职业迷茫 简单
    技术路线的选择重要但不具有决定性 简单
    转:我在Facebook工作的十大经验分享 简单
    linux下vim的编译以及终端乱码的解决方案 简单
  • 原文地址:https://www.cnblogs.com/yshyee/p/6139885.html
Copyright © 2011-2022 走看看