zoukankan      html  css  js  c++  java
  • POIexcel导出案例

    Service导出方法代码为:

      1 /**
      2      * 导出excel表头和数据处理并下载
      3      * @param path
      4      * @param paramMap
      5      */
      6     public void downloadExcelReport(String path, Map<String,String> paramMap,HttpServletResponse response) {
      7         //获取paramMap的value,根据这些参数查询出对应的报表数据集合reportList
      8         String  pDateTime =  paramMap.get("pDateTime");
      9         String  channelCode=  paramMap.get("channelCode");
     10         String  operater=  paramMap.get("operater");
     11         //获取数据集合这里不做具体阐述
     12         List<ReportQueryEntity> reportList = this.execute(pDateTime, channelCode,operater);
     13         //中国银联来款汇总表大表头(标题)
     14         String bigHeaderTilte="中国XX来款汇总表";
     15         //工作薄对象
     16         SXSSFWorkbook wb= new SXSSFWorkbook(500);//内存中保留 500 条数据,以免内存溢出,其余写入 硬盘
     17         //工作表对象
     18         Sheet sheet = wb.createSheet("Export"); //在webbook中添加一个sheet,对应Excel文件中的sheet
     19         
     20         //样式列表
     21         ExportExcelNewUtils utils= new ExportExcelNewUtils();
     22         Map<String, CellStyle> styles = utils.createStyles(wb);
     23         //当前行号
     24          int rownum = 0;
     25         // Create title
     26         if (StringUtils.isNotBlank(bigHeaderTilte)) {
     27             Row titleRow = sheet.createRow(0);//标题行
     28             titleRow.setHeightInPoints(30);// 设置标题的高度
     29             Cell titleCell = titleRow.createCell(0);//创建标题的单元格
     30             titleCell.setCellStyle(styles.get("title"));//设置单元格样式
     31             titleCell.setCellValue(bigHeaderTilte);//塞值
     32             //单元格合并:下标从0开始sheet.addMergedRegion(new CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) 
     33             sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(),
     34                     titleRow.getRowNum(), titleRow.getRowNum(), 8));
     35             
     36         }
     37         /**新增行:显示清算机构,清算币种*/
     38         sheet.addMergedRegion(new CellRangeAddress(1,1, 1, 5));//清算机构值:合并单元格
     39         Row settHeadRow = sheet.createRow(1);
     40         settHeadRow.setHeightInPoints(16);
     41         Cell settCellFirst = settHeadRow.createCell(0);
     42         settCellFirst.setCellStyle(styles.get("data"));
     43         settCellFirst.setCellValue("清算机构:");
     44         //清算机构值
     45         Cell settCellSec = settHeadRow.createCell(1);
     46         settCellSec.setCellStyle(styles.get("data"));
     47         if(CollectionUtils.isNotEmpty(reportList)){
     48             settCellSec.setCellValue(reportList.get((reportList.size()-1)).getData9());
     49         }
     50         //创建空单元格:为防止单元格合并后边框消失,每个单元格都必须创建,否则只有创建的那个单元格有边框,不创建的单元格没边框
     51         for (int j = 2; j <= 5; j++) {
     52             Cell emptyCel = settHeadRow.createCell(j);
     53             emptyCel.setCellStyle(styles.get("data")); //style为带边框的样式 上面有定义
     54             emptyCel.setCellValue("");
     55         }
     56         Cell settCellThird = settHeadRow.createCell(6);
     57         settCellThird.setCellStyle(styles.get("data"));
     58         settCellThird.setCellValue("清算币种:");
     59         Cell settCellFourth = settHeadRow.createCell(7);
     60         settCellFourth.setCellStyle(styles.get("data"));
     61         settCellFourth.setCellValue("人民币");
     62         /**新增行:显示清算日期,生成日期*/
     63         sheet.addMergedRegion(new CellRangeAddress(2,2, 1, 5));//清算日期值:合并单元格
     64         Row dateHeadRow = sheet.createRow(2);
     65         dateHeadRow.setHeightInPoints(16);
     66         Cell dateCellFirst = dateHeadRow.createCell(0);
     67         dateCellFirst.setCellStyle(styles.get("data"));
     68         dateCellFirst.setCellValue("清算日期::");
     69         Cell cellSec = dateHeadRow.createCell(1);
     70         cellSec.setCellStyle(styles.get("data"));
     71         if(CollectionUtils.isNotEmpty(reportList)){
     72             cellSec.setCellValue(reportList.get((reportList.size()-1)).getData10());
     73         }
     74         //创建空单元格:为防止单元格合并后边框消失,每个单元格都必须创建,否则只有创建的那个单元格有边框,不创建的单元格没边框
     75         for (int j = 2; j <= 5; j++) {
     76             Cell emptyCel = dateHeadRow.createCell(j);
     77             emptyCel.setCellStyle(styles.get("data")); //style为带边框的样式 上面有定义
     78             emptyCel.setCellValue("");
     79         }
     80         Cell cellThird = dateHeadRow.createCell(6);
     81         cellThird.setCellStyle(styles.get("data"));
     82         cellThird.setCellValue("生成日期:");
     83         Cell cellFourth = dateHeadRow.createCell(7);
     84         cellFourth.setCellStyle(styles.get("data"));
     85         if(CollectionUtils.isNotEmpty(reportList)){
     86             cellFourth.setCellValue(reportList.get((reportList.size()-1)).getData11());
     87         }
     88         //交易范围 单独一行
     89         sheet.addMergedRegion(new CellRangeAddress(3,3, 0, 7));
     90         Row otherHeadRow = sheet.createRow(3);
     91         otherHeadRow.setHeightInPoints(16);
     92         Cell otherCellFirst = otherHeadRow.createCell(0);
     93         otherCellFirst.setCellStyle(styles.get("data"));
     94         otherCellFirst.setCellValue("交易范围:");
     95         //创建空单元格:为防止单元格合并后边框消失,每个单元格都必须创建,否则只有创建的那个单元格有边框,不创建的单元格没边框
     96         for (int j = 1; j <= 7; j++) {
     97             Cell emptyCel = otherHeadRow.createCell(j);
     98             emptyCel.setCellStyle(styles.get("data")); //style为带边框的样式 上面有定义
     99             emptyCel.setCellValue("");
    100         }
    101         //跨两行标题
    102         String[] header_2={"交易类型","交易笔数"};
    103         //跨列标题,跨列标题对应列数
    104         String[] header_cate = {"交易金额","费用","资金清算差额"};
    105         int[] cate_num ={2,2,2};
    106         //小标题(不跨行不跨列)
    107         String[] header_1 = {"借","贷","借","贷","借","贷"};
    108 
    109         for(int i=0; i<header_2.length; i++){
    110             sheet.addMergedRegion(new CellRangeAddress(4, 5, i, i));//合并4-5行
    111         }
    112         //合并列
    113         int sum1 = 0;
    114         int sum2 = 0;
    115         for(int i=0; i<header_cate.length; i++){
    116             sum1 += cate_num[i];
    117             sheet.addMergedRegion(new CellRangeAddress(4, 4, 2+sum2, 2+sum1-1));
    118             sum2 += cate_num[i];
    119         }
    120         //创建第5行并塞值
    121         Row row = sheet.createRow(4);
    122         for(int i=0; i<header_2.length; i++){
    123             final Cell cell = row.createCell(i);//第1,2列(index下标:0,1)
    124             cell.setCellStyle(styles.get("data"));    
    125             cell.setCellValue(header_2[i]);
    126             int colWidth = sheet.getColumnWidth(i) * 2;
    127             sheet.setColumnWidth(i, colWidth < 3000 ? 3000 : colWidth);
    128         }
    129         int sum = 0;
    130         for(int i=0; i<header_cate.length; i++){
    131             final Cell cell = row.createCell(2+sum);//第3,5,7列(下标:2,4,6)
    132             cell.setCellStyle(styles.get("data"));
    133             cell.setCellValue(header_cate[i]);
    134             sum += cate_num[i];
    135         }
    136         //创建空单元格(第4,6,8列(下标:3,5,7)):为防止单元格合并后边框消失,每个单元格都必须创建,否则只有创建的那个单元格有边框,不创建的单元格没边框
    137         for (int j = 3; j <= 7; j=j+2) {
    138             Cell emptyCel = row.createCell(j);
    139             emptyCel.setCellStyle(styles.get("data")); //style为带边框的样式 上面有定义
    140             emptyCel.setCellValue("");
    141         }
    142         //创建第6行并塞值
    143         row = sheet.createRow(5);
    144         //创建空单元格(第1,2列(下标:0,1)):为防止单元格合并后边框消失,每个单元格都必须创建,否则只有创建的那个单元格有边框,不创建的单元格没边框
    145         for (int j = 0; j <= 1; j++) {
    146             Cell emptyCel = row.createCell(j);
    147             emptyCel.setCellStyle(styles.get("data")); //style为带边框的样式 上面有定义
    148             emptyCel.setCellValue("");
    149         }
    150         for(int i=0; i<header_1.length; i++){
    151             final Cell cell = row.createCell(i+2);    //第3-8列(下标:2-7)
    152             cell.setCellStyle(styles.get("data"));
    153             cell.setCellValue(header_1[i]);
    154             int colWidth = sheet.getColumnWidth(i+2) * 2;
    155             sheet.setColumnWidth(i+2, colWidth < 3000 ? 3000 : colWidth);
    156         }
    157         
    158         
    159         List<List<String>> dataList = new ArrayList<>();
    160         for (int i = 0; i < reportList.size(); i++) {
    161             List<String> list = new ArrayList<>();
    162             list.add(reportList.get(i).getData1());
    163             list.add(reportList.get(i).getData2());
    164             list.add(reportList.get(i).getData3());
    165             list.add(reportList.get(i).getData4());
    166             list.add(reportList.get(i).getData5());
    167             list.add(reportList.get(i).getData6());
    168             list.add(reportList.get(i).getData7());
    169             list.add(reportList.get(i).getData8());
    170             dataList.add(list);
    171         }
    172         
    173         
    174         //遍历报表数据,每行每行塞入excel表格
    175         for (int i = 0; i < dataList.size(); i++) {
    176             //新增excel行
    177             Row rowData = sheet.createRow(6+i);
    178             for (int j = 0; j < dataList.get(i).size(); j++) {
    179 //                utils.addCell(row, j, dataList.get(i).get(j));
    180                 utils.addCellNew(rowData, j, dataList.get(i).get(j), 0, Class.class, styles, wb);
    181             }
    182         }
    183         
    184         //报表名称
    185         String reportName = "中国XX来款汇总表"+pDateTime;
    186         //下载
    187         try {        
    188             response.setContentType("application/octet-stream;charset=UTF-8");
    189             response.setHeader("Content-Disposition",
    190                     "attachment; filename=" + java.net.URLEncoder.encode(reportName+ ".xls", "UTF-8"));
    191             OutputStream out = response.getOutputStream();
    192             wb.write(out);//写出文件
    193             
    194             out.flush();
    195             out.close();
    196         } catch (Exception e) {
    197             e.printStackTrace();
    198         }
    199     }

    其中:第一:ExportExcelNewUtils代码为:

     1 /**
     2  * 
     3  */
     4 package kklazy.utils;
     5 
     6 import java.util.Date;
     7 import java.util.Map;
     8 
     9 import org.apache.poi.ss.usermodel.Cell;
    10 import org.apache.poi.ss.usermodel.CellStyle;
    11 import org.apache.poi.ss.usermodel.DataFormat;
    12 import org.apache.poi.ss.usermodel.Row;
    13 import org.apache.poi.xssf.streaming.SXSSFWorkbook;
    14 import org.slf4j.LoggerFactory;
    15 
    16 /**
    17  * 
    18  * 导出excel工具类
    19  *
    20  */
    21 public class ExportExcelNewUtils extends  ExportExcelUtils{
    22     private static org.slf4j.Logger log = LoggerFactory.getLogger(ExportExcelUtils.class);
    23     
    24     /**
    25      * 
    26      */
    27     public ExportExcelNewUtils() {
    28         
    29     }
    30     
    31     /**
    32      * 添加一个单元格
    33      * 
    34      * @param row
    35      *            添加的行
    36      * @param column
    37      *            添加列号
    38      * @param val
    39      *            添加值
    40      * @param align
    41      *            对齐方式(1:靠左;2:居中;3:靠右)
    42      * @return 单元格对象
    43      */
    44     public Cell addCellNew(Row row, int column, Object val, int align,
    45             Class<?> fieldType,Map<String, CellStyle> styles,SXSSFWorkbook wb) {
    46         Cell cell = row.createCell(column);
    47         /*CellStyle style = styles.get("data"
    48                 + (align >= 1 && align <= 3 ? align : ""));*/
    49         CellStyle style = styles.get("header");
    50         try {
    51             if (val == null) {
    52                 cell.setCellValue("");
    53             } else if (val instanceof String) {
    54                 cell.setCellValue((String) val);
    55             } else if (val instanceof Integer) {
    56                 cell.setCellValue((Integer) val);
    57             } else if (val instanceof Long) {
    58                 cell.setCellValue((Long) val);
    59             } else if (val instanceof Double) {
    60                 cell.setCellValue((Double) val);
    61             } else if (val instanceof Float) {
    62                 cell.setCellValue((Float) val);
    63             } else if (val instanceof Date) {
    64                 DataFormat format = wb.createDataFormat();
    65                 style.setDataFormat(format.getFormat("yyyy-MM-dd"));
    66                 cell.setCellValue((Date) val);
    67             } else {
    68                 if (fieldType != Class.class) {
    69                     cell.setCellValue((String) fieldType.getMethod("setValue",
    70                             Object.class).invoke(null, val));
    71                 } else {
    72                     cell.setCellValue((String) Class
    73                             .forName(
    74                                     this.getClass()
    75                                             .getName()
    76                                             .replaceAll(
    77                                                     this.getClass()
    78                                                             .getSimpleName(),
    79                                                     "fieldtype."
    80                                                             + val.getClass()
    81                                                                     .getSimpleName()
    82                                                             + "Type"))
    83                             .getMethod("setValue", Object.class)
    84                             .invoke(null, val));
    85                 }
    86             }
    87         } catch (Exception ex) {
    88             log.info("Set cell value [" + row.getRowNum() + "," + column
    89                     + "] error: " + ex.toString());
    90             cell.setCellValue(val.toString());
    91         }
    92         cell.setCellStyle(style);
    93         return cell;
    94     }
    95     
    96 }

    第二:ExportExcelUtils.createStyles()创建表格样式代码为:

     1 /**
     2      * 创建表格样式
     3      *
     4      * @param wb
     5      *            工作薄对象
     6      * @return 样式列表
     7      */
     8     public Map<String, CellStyle> createStyles(Workbook wb) {
     9         Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
    10 
    11         CellStyle style = wb.createCellStyle();//设置样式
    12         style.setAlignment(CellStyle.ALIGN_CENTER);
    13         style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
    14         Font titleFont = wb.createFont();// 设置字体
    15         titleFont.setFontName("Arial");//设置字体名字 
    16         titleFont.setFontHeightInPoints((short) 16);//设置字体大小
    17         titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);//设置字体加粗
    18         style.setFont(titleFont);
    19         styles.put("title", style);
    20 
    21         style = wb.createCellStyle();
    22         //style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
    23         style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //设置垂直对齐的样式为居中对齐; 
    24         style.setBorderRight(CellStyle.BORDER_THIN);//设置右边框; 
    25         //style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
    26         style.setBorderLeft(CellStyle.BORDER_THIN);//设置左边框; 
    27         //style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
    28         style.setBorderTop(CellStyle.BORDER_THIN); //设置顶边框; 
    29         //style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
    30         style.setBorderBottom(CellStyle.BORDER_THIN);//设置底边框; 
    31         //style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
    32         Font dataFont = wb.createFont();
    33         dataFont.setFontName("Arial");
    34         dataFont.setFontHeightInPoints((short) 10);
    35         style.setFont(dataFont);
    36         styles.put("data", style);
    37 
    38         style = wb.createCellStyle();
    39         style.cloneStyleFrom(styles.get("data"));//克隆样式
    40         style.setAlignment(CellStyle.ALIGN_LEFT);//设置水平对齐的样式为居中对齐;
    41         styles.put("data1", style);
    42 
    43         style = wb.createCellStyle();
    44         style.cloneStyleFrom(styles.get("data"));
    45         style.setAlignment(CellStyle.ALIGN_CENTER);
    46         styles.put("data2", style);
    47 
    48         style = wb.createCellStyle();
    49         style.cloneStyleFrom(styles.get("data"));
    50         style.setAlignment(CellStyle.ALIGN_RIGHT);
    51         styles.put("data3", style);
    52 
    53         style = wb.createCellStyle();
    54         style.cloneStyleFrom(styles.get("data"));
    55         style.setWrapText(true);
    56         style.setAlignment(CellStyle.ALIGN_CENTER);
    57         style.setFillForegroundColor(IndexedColors.WHITE.getIndex());
    58         style.setFillPattern(CellStyle.SOLID_FOREGROUND);
    59         Font headerFont = wb.createFont();
    60         headerFont.setFontName("Arial");
    61         headerFont.setFontHeightInPoints((short) 10);
    62         headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
    63         headerFont.setColor(IndexedColors.BLACK.getIndex());
    64         style.setFont(headerFont);
    65         styles.put("header", style);
    66 
    67         return styles;
    68     }

    第三:为防止合并单元格,但合并后边框消失:涉及到的单元格都需要被create,否则 没有被创建的单元格的边框不显示:具体见代码

    最后:导出excel效果如下:

    我的老腰呀,今天暂时告一段落,over。

  • 相关阅读:
    浙大数据结构课后习题 练习二 7-2 Reversing Linked List (25 分)
    浙大数据结构课后习题 练习二 7-2 一元多项式的乘法与加法运算 (20 分)
    浙大数据结构课后习题 练习一 7-1 Maximum Subsequence Sum (25 分)
    浙大数据结构课后习题 练习一 7-1 最大子列和问题 (20 分)
    PAT Basic 1019 数字黑洞 (20 分)
    PAT Basic 1017 A除以B (20 分)
    PAT Basic 1013 数素数 (20 分)
    PAT Basic 1007 素数对猜想 (20 分)
    PAT Basic 1003 我要通过! (20 分)
    自动化运维——HelloWorld(一)
  • 原文地址:https://www.cnblogs.com/whhjava/p/9488400.html
Copyright © 2011-2022 走看看