zoukankan      html  css  js  c++  java
  • JAVA实现文件导出Excel

    java实现Excel数据导出:

         目前,比较常用的实现Java导入、导出Excel的技术有两种Jakarta POI和Java Excel

    Jakarta POI 是一套用于访问微软格式文档的Java API。Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,在各种组件中目前只有用于操作Excel的HSSF相对成熟。官方主页http://poi.apache.org/index.html,API文档http://poi.apache.org/apidocs/index.html

    Jakarta POI HSSF API组件

    HSSF(用于操作Excel的组件)提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,还有辅助操作。有以下几种对象:

    2.3 基本操作步骤

    首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。

    基本操作步骤:

    下面来看一个动态生成Excel文件的例子:

    //创建HSSFWorkbook对象
    HSSFWorkbook wb = new HSSFWorkbook();
    //创建HSSFSheet对象
    HSSFSheet sheet = wb.createSheet("sheet0");
    //创建HSSFRow对象
    HSSFRow row = sheet.createRow(0);
    //创建HSSFCell对象
    HSSFCell cell=row.createCell(0);
    //设置单元格的值
    cell.setCellValue("单元格中的中文");
    //输出Excel文件
    FileOutputStream output=new FileOutputStream("d:\workbook.xls");
    wkb.write(output);
    output.flush();
    

      

    HSSF读取文件同样还是使用这几个对象,只是把相应的createXXX方法变成了getXXX方法即可。可见只要理解了其中原理,不管是读还是写亦或是特定格式都可以轻松实现,正所谓知其然更要知其所以然。

     2:导出Excel应用实例:

    详细api请参考:https://blog.csdn.net/xunwei0303/article/details/53213130

    3:导出表格的工具类:

    excelUtil:  

      1 package com.zhl.push.Utils;
      2 
      3 import com.google.common.base.Strings;
      4 import org.apache.poi.hssf.usermodel.*;
      5 import org.apache.poi.hssf.util.HSSFColor;
      6 import org.apache.poi.ss.usermodel.VerticalAlignment;
      7 import org.apache.poi.ss.util.CellRangeAddress;
      8 
      9 import javax.servlet.http.HttpServletRequest;
     10 import javax.servlet.http.HttpServletResponse;
     11 import java.io.IOException;
     12 import java.io.OutputStream;
     13 import java.math.BigDecimal;
     14 import java.util.List;
     15 import java.util.Map;
     16 
     17 public class ExcelExportUtil {
     18     //表头
     19     private String title;
     20     //各个列的表头
     21     private String[] heardList;
     22     //各个列的元素key值
     23     private String[] heardKey;
     24     //需要填充的数据信息
     25     private List<Map> data;
     26     //字体大小
     27     private int fontSize = 14;
     28     //行高
     29     private int rowHeight = 30;
     30     //列宽
     31     private int columWidth = 200;
     32     //工作表
     33     private String sheetName = "sheet1";
     34 
     35     public String getTitle() {
     36         return title;
     37     }
     38 
     39     public void setTitle(String title) {
     40         this.title = title;
     41     }
     42 
     43     public String[] getHeardList() {
     44         return heardList;
     45     }
     46 
     47     public void setHeardList(String[] heardList) {
     48         this.heardList = heardList;
     49     }
     50 
     51     public String[] getHeardKey() {
     52         return heardKey;
     53     }
     54 
     55     public void setHeardKey(String[] heardKey) {
     56         this.heardKey = heardKey;
     57     }
     58 
     59     public List<Map> getData() {
     60         return data;
     61     }
     62 
     63     public void setData(List<Map> data) {
     64         this.data = data;
     65     }
     66 
     67     public int getFontSize() {
     68         return fontSize;
     69     }
     70 
     71     public void setFontSize(int fontSize) {
     72         this.fontSize = fontSize;
     73     }
     74 
     75     public int getRowHeight() {
     76         return rowHeight;
     77     }
     78 
     79     public void setRowHeight(int rowHeight) {
     80         this.rowHeight = rowHeight;
     81     }
     82 
     83     public int getColumWidth() {
     84         return columWidth;
     85     }
     86 
     87     public void setColumWidth(int columWidth) {
     88         this.columWidth = columWidth;
     89     }
     90 
     91     public String getSheetName() {
     92         return sheetName;
     93     }
     94 
     95     public void setSheetName(String sheetName) {
     96         this.sheetName = sheetName;
     97     }
     98 
     99     /**
    100      * 开始导出数据信息
    101      *
    102      */
    103     public byte[] exportExport(HttpServletRequest request, HttpServletResponse response) throws IOException {
    104         //检查参数配置信息
    105         checkConfig();
    106         //创建工作簿
    107         HSSFWorkbook wb = new HSSFWorkbook();
    108         //创建工作表
    109         HSSFSheet wbSheet = wb.createSheet(this.sheetName);
    110         //设置默认行宽
    111         wbSheet.setDefaultColumnWidth(20);
    112 
    113         // 标题样式(加粗,垂直居中)
    114         HSSFCellStyle cellStyle = wb.createCellStyle();
    115         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
    116         cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
    117         HSSFFont fontStyle = wb.createFont();
    118         fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    119         fontStyle.setBold(true);   //加粗
    120         fontStyle.setFontHeightInPoints((short)16);  //设置标题字体大小
    121         cellStyle.setFont(fontStyle);
    122 
    123         //在第0行创建rows  (表标题)
    124         HSSFRow title = wbSheet.createRow((int) 0);
    125         title.setHeightInPoints(30);//行高
    126         HSSFCell cellValue = title.createCell(0);
    127         cellValue.setCellValue(this.title);
    128         cellValue.setCellStyle(cellStyle);
    129         wbSheet.addMergedRegion(new CellRangeAddress(0,0,0,(this.heardList.length-1)));
    130         //设置表头样式,表头居中
    131         HSSFCellStyle style = wb.createCellStyle();
    132         //设置单元格样式
    133         style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    134         style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
    135         //设置字体
    136         HSSFFont font = wb.createFont();
    137         font.setFontHeightInPoints((short) this.fontSize);
    138         style.setFont(font);
    139         //在第1行创建rows
    140         HSSFRow row = wbSheet.createRow((int) 1);
    141         //设置列头元素
    142         HSSFCell cellHead = null;
    143         for (int i = 0; i < heardList.length; i++) {
    144             cellHead = row.createCell(i);
    145             cellHead.setCellValue(heardList[i]);
    146             cellHead.setCellStyle(style);
    147         }
    148 
    149         //设置每格数据的样式 (字体红色)
    150         HSSFCellStyle cellParamStyle = wb.createCellStyle();
    151         HSSFFont ParamFontStyle = wb.createFont();
    152         cellParamStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    153         cellParamStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
    154         ParamFontStyle.setColor(HSSFColor.DARK_RED.index);   //设置字体颜色 (红色)
    155         ParamFontStyle.setFontHeightInPoints((short) this.fontSize);
    156         cellParamStyle.setFont(ParamFontStyle);
    157         //设置每格数据的样式2(字体蓝色)
    158         HSSFCellStyle cellParamStyle2 = wb.createCellStyle();
    159         cellParamStyle2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    160         cellParamStyle2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
    161         HSSFFont ParamFontStyle2 = wb.createFont();
    162         ParamFontStyle2.setColor(HSSFColor.BLUE.index);   //设置字体颜色 (蓝色)
    163         ParamFontStyle2.setFontHeightInPoints((short) this.fontSize);
    164         cellParamStyle2.setFont(ParamFontStyle2);
    165         //开始写入实体数据信息
    166         int a = 2;
    167         for (int i = 0; i < data.size(); i++) {
    168             HSSFRow roww = wbSheet.createRow((int) a);
    169             Map map = data.get(i);
    170             HSSFCell cell = null;
    171             for (int j = 0; j < heardKey.length; j++) {
    172                 cell = roww.createCell(j);
    173                 cell.setCellStyle(style);
    174                 Object valueObject = map.get(heardKey[j]);
    175                 String value = null;
    176                 if (valueObject == null) {
    177                     valueObject = "";
    178                 }
    179                 if (valueObject instanceof String) {
    180                     //取出的数据是字符串直接赋值
    181                     value = (String) map.get(heardKey[j]);
    182                 } else if (valueObject instanceof Integer) {
    183                     //取出的数据是Integer
    184                     value = String.valueOf(((Integer) (valueObject)).floatValue());
    185                 } else if (valueObject instanceof BigDecimal) {
    186                     //取出的数据是BigDecimal
    187                     value = String.valueOf(((BigDecimal) (valueObject)).floatValue());
    188                 } else {
    189                     value = valueObject.toString();
    190                 }
    191                 //设置单个单元格的字体颜色
    192                 if(heardKey[j].equals("ddNum") || heardKey[j].equals("sjNum")){
    193                 if((Long)map.get("ddNum")!=null){
    194                     if((Long)map.get("sjNum")==null){
    195                         cell.setCellStyle(cellParamStyle);
    196                     } else if((Long) map.get("ddNum") != (Long) map.get("sjNum")){
    197                         if ((Long) map.get("ddNum") > (Long) map.get("sjNum")) {
    198                             cell.setCellStyle(cellParamStyle);
    199                         }
    200                         if ((Long) map.get("ddNum") < (Long) map.get("sjNum")) {
    201                             cell.setCellStyle(cellParamStyle2);
    202                         }
    203                     }else {
    204                         cell.setCellStyle(style);
    205                     }
    206                 }
    207                 }
    208                 cell.setCellValue(Strings.isNullOrEmpty(value) ? "" : value);
    209             }
    210             a++;
    211         }
    212 
    213         //导出数据
    214         try {
    215             //设置Http响应头告诉浏览器下载这个附件
    216             response.setHeader("Content-Disposition", "attachment;Filename=" + System.currentTimeMillis() + ".xls");
    217             OutputStream outputStream = response.getOutputStream();
    218             wb.write(outputStream);
    219             outputStream.close();
    220             return wb.getBytes();
    221         } catch (Exception ex) {
    222             ex.printStackTrace();
    223             throw new IOException("导出Excel出现严重异常,异常信息:" + ex.getMessage());
    224         }
    225 
    226     }
    227 
    228     /**
    229      * 检查数据配置问题
    230      *
    231      * @throws IOException 抛出数据异常类
    232      */
    233     protected void checkConfig() throws IOException {
    234         if (heardKey == null || heardList.length == 0) {
    235             throw new IOException("列名数组不能为空或者为NULL");
    236         }
    237 
    238         if (fontSize < 0 || rowHeight < 0 || columWidth < 0) {
    239             throw new IOException("字体、宽度或者高度不能为负值");
    240         }
    241 
    242         if (Strings.isNullOrEmpty(sheetName)) {
    243             throw new IOException("工作表表名不能为NULL");
    244         }
    245     }
    246 }

    service :

    @Override
        public void queryProjectInfoBySchemeId(HttpServletResponse response, HttpServletRequest request,
                                                       String schemeId, String pushDate) throws IOException {
            List<Map> maps = pushMonitorDao.queryProjectInfoBySchemeId(schemeId, pushDate);
            if(maps!=null && maps.size()>0){
                 String companyName = pushMonitorDao.queryCompanyNameBySchemeId(schemeId);
                 String sheetTitle = companyName;
                 String [] title = new String[]{"城市","项目名字","合同","实际"};        //设置表格表头字段
                String [] properties = new String[]{"city","projectName","ddNum","sjNum"};  // 查询对应的字段
                ExcelExportUtil excelExport2 = new ExcelExportUtil();
                excelExport2.setData(maps);
                excelExport2.setHeardKey(properties);
                excelExport2.setFontSize(14);
                excelExport2.setSheetName(sheetTitle);
                excelExport2.setTitle(sheetTitle);
                excelExport2.setHeardList(title);
                excelExport2.exportExport(request, response);
             }
        }

    通用Excel文件导出工具类

     

    1:Excel格式

    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.lang.reflect.Field;
    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.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.VerticalAlignment;
    import org.apache.poi.ss.util.CellRangeAddress;
    
    /**
     * @作者 yan
     * @创建日期
     * @版本 V1.0
     * @描述 Excel 导出通用工具类
     */
    public class ExcelUtil {
    
        public static byte[] export(String sheetTitle, String[] title, List<Object> list) {
    
            HSSFWorkbook wb = new HSSFWorkbook();//创建excel表
            HSSFSheet sheet = wb.createSheet(sheetTitle);
            sheet.setDefaultColumnWidth(20);//设置默认行宽
    
            //表头样式(加粗,水平居中,垂直居中)
            HSSFCellStyle cellStyle = wb.createCellStyle();
            cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
            //设置边框样式
            cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
            cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
            cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
            cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
    
            HSSFFont fontStyle = wb.createFont();
            fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    
            cellStyle.setFont(fontStyle);
    
            //标题样式(加粗,垂直居中)
            HSSFCellStyle cellStyle2 = wb.createCellStyle();
            cellStyle2.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
            cellStyle2.setFont(fontStyle);
    
            //设置边框样式
            cellStyle2.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
            cellStyle2.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
            cellStyle2.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
            cellStyle2.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
    
            //字段样式(垂直居中)
            HSSFCellStyle cellStyle3 = wb.createCellStyle();
            cellStyle3.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
    
            //设置边框样式
            cellStyle3.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
            cellStyle3.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
            cellStyle3.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
            cellStyle3.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
    
            //创建表头
            HSSFRow row = sheet.createRow(0);
            row.setHeightInPoints(20);//行高
            
            HSSFCell cell = row.createCell(0);
            cell.setCellValue(sheetTitle);
            cell.setCellStyle(cellStyle);
    
            sheet.addMergedRegion(new CellRangeAddress(0,0,0,(title.length-1)));
            
            //创建标题
            HSSFRow rowTitle = sheet.createRow(1);
            rowTitle.setHeightInPoints(20);
    
            HSSFCell hc;
            for (int i = 0; i < title.length; i++) {
                hc = rowTitle.createCell(i);
                hc.setCellValue(title[i]);
                hc.setCellStyle(cellStyle2);
            }
    
            byte result[] = null;
    
            ByteArrayOutputStream out = null;
            
            try {
                //创建表格数据
                Field[] fields;
                int i = 2;
    
                for (Object obj : list) {
                    fields = obj.getClass().getDeclaredFields();
    
                    HSSFRow rowBody = sheet.createRow(i);
                    rowBody.setHeightInPoints(20);
    
                    int j = 0;
                    for (Field f : fields) {
    
                        f.setAccessible(true);
    
                        Object va = f.get(obj);
                        if (null == va) {
                            va = "";
                        }
    
                        hc = rowBody.createCell(j);
                        hc.setCellValue(va.toString());
                        hc.setCellStyle(cellStyle3);
                        
                        j++;
                    }
    
                    i++;
                }
    
                out = new ByteArrayOutputStream();
                wb.write(out);
                result =  out.toByteArray();
            } catch (Exception ex) {
                Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex);
            } finally{
                try {
                    if(null != out){
                        out.close();
                    }
                } catch (IOException ex) {
                    Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex);
                } finally{
                    try {
                        wb.close();
                    } catch (IOException ex) {
                        Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
    
            return result;
        }
    }

    4:依赖包

    commons-io-2.4.jar

    poi-3.15.jar

     =======================================================

    如果需要使用模板来导出excel可以使用jxls:

    官网:http://jxls.sourceforge.net/

    可以参考博客:  https://www.cnblogs.com/foxlee1024/p/7616987.html

    https://blog.csdn.net/sinat_15769727/article/details/78898894

  • 相关阅读:
    Java自学-数组 创建数组
    Java自学-控制流程 结束外部循环
    Java自学-控制流程 break
    Java自学-控制流程 for
    Java自学-控制流程 continue
    Java自学-控制流程 switch
    Java自学-控制流程 If
    计算机组成原理之流水线处理器
    计算机组成原理之算术逻辑单元
    计算机组成原理之指令系统
  • 原文地址:https://www.cnblogs.com/minixiong/p/11149281.html
Copyright © 2011-2022 走看看