自定义excel格式导出查询出的数据

1.数据导出在业务场景中经常使用,下面需要导出以下样式的excel表格.

可以看出这个excel表格不是很复杂,只需要将前三行自己写进去.用的技术是POI的导出

2.具体实现

  2.1 首先是创建样式,创建字体的大小和位置

        //创建样式
        cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        //创建字体样式
        HSSFFont font2 = wb.createFont();
        font2.setFontName("宋体");
        font2.setFontHeightInPoints((short) 10);
        //水平对齐方式(居中)
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        //垂直对齐方式(居中)
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        cellStyle.setFont(font2);

   2.2 写入前三行

    //创建第一行
        HSSFRow row = sheet.createRow(0);
        //合并第一行的一二三列
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2));
        HSSFCell cell = row.createCell(0);
        //样式
        cell.setCellStyle(cellStyle);
        cell.setCellType(HSSFCell.CELL_TYPE_STRING);
        //
        cell.setCellValue("浙江公司基建管理单位复工人员情况统计表");

    2.3 第二三行  

        HSSFRow row1 = sheet.createRow(1);
//设置第二行第一列的宽度 sheet.setColumnWidth(
0,(int)((35+0.72)*256)); HSSFCell cell1 = row1.createCell(0); cell1.setCellStyle(cellStyle); cell1.setCellValue("基建管理单位"); sheet.addMergedRegion(new CellRangeAddress(1, 1, 1, 2)); HSSFCell cel2 = row1.createCell(1); cel2.setCellStyle(cellStyle); cel2.setCellValue("管理人员"); HSSFRow row2 = sheet.createRow(2); row2.setRowStyle(cellStyle); row2.createCell(1).setCellValue("绿码人员"); row2.createCell(2).setCellValue("红码人员");

  还可以根据该列内容的长度自适应列的宽度,这里长度差不多,就直接写死了.

    2.4 插入中间数据    

 private void setCellData(List<Map> data, int startRow,
                             String[] colKeys) {
        HSSFRow row = null;
        HSSFCell cell = null;
        int i = startRow;
        if (data != null && data.size() > 0) {
            for (int k=0;k<data.size();k++){
                Map<String, Object> rowData = data.get(k);
                row = sheet.createRow(i);
                int j = 0;
                for (String key:colKeys){
                    Object colValue = rowData.get(key);
                    cell = row.createCell(j);
                    if (colValue != null) {
                        sheet.setColumnWidth(0,(int)((35+0.72)*256));
                        cell.setCellValue(colValue.toString());
                       if (j!=0){
                           cell.setCellStyle(cellStyle);
                       }
                    }
                    j++;
                }
                i++;
            }

        }
    }

  2.5 直接导出显示在浏览器上下载

            response.reset();
            String fileName = URLEncoder.encode("浙江公司基建管理单位管理人员复工情况表.xls","UTF-8");
            response.setHeader("content-disposition", "attachment;filename="+fileName);
            response.setCharacterEncoding("UTF-8");
            //1.设置文件ContentType类型,这样设置,会自动判断下载文件类型
            response.setContentType("multipart/form-data");
            // 创建输出流
            OutputStream out = response.getOutputStream();
            HSSFWorkbook workbook = (excel.getExcelFile(data, "管理人员", headNames, keys,data.size()));
            workbook.write(out);
            workbook.close();
            out.close();

  3 合成代码

  

package com.hyit.appdev.personnel.appHealth.service;

import com.hyit.appdev.personnel.appHealth.bean.AppHealthPersonnelInfomation;
import org.apache.poi.hssf.usermodel.HSSFCell;
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.util.CellRangeAddress;
import org.apache.poi.hssf.usermodel.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class excel {
   private HSSFWorkbook wb;
   private HSSFSheet sheet;
   private HSSFCellStyle cellStyle;
    public void createExcel(HSSFWorkbook wb){
        sheet = wb.createSheet("管理人员");

        //创建样式
        cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        //创建字体样式
        HSSFFont font2 = wb.createFont();
        font2.setFontName("宋体");
        font2.setFontHeightInPoints((short) 10);
        //水平对齐方式(居中)
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        //垂直对齐方式(居中)
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        cellStyle.setFont(font2);


        //创建第一行
        HSSFRow row = sheet.createRow(0);
        //合并第一行的一二三列
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2));
        HSSFCell cell = row.createCell(0);
        //样式
        cell.setCellStyle(cellStyle);
        cell.setCellType(HSSFCell.CELL_TYPE_STRING);
        //
        cell.setCellValue("浙江公司基建管理单位复工人员情况统计表");

        HSSFRow row1 = sheet.createRow(1);
        sheet.setColumnWidth(0,(int)((35+0.72)*256));
        HSSFCell cell1 = row1.createCell(0);
        cell1.setCellStyle(cellStyle);
        cell1.setCellValue("基建管理单位");

        sheet.addMergedRegion(new CellRangeAddress(1, 1, 1, 2));
        HSSFCell cel2 = row1.createCell(1);
        cel2.setCellStyle(cellStyle);
        cel2.setCellValue("管理人员");

        HSSFRow row2 = sheet.createRow(2);
        row2.setRowStyle(cellStyle);
        row2.createCell(1).setCellValue("绿码人员");
        row2.createCell(2).setCellValue("红码人员");
    }

    public HSSFWorkbook getExcelFile(List<Map> data, String sheetName, String[] headNames,
                                    String[] colKeys, int size) throws IOException {
        wb = new HSSFWorkbook();
        //sheet = wb.createSheet(sheetName);// 创建表头 startRow代表表体开始的行
        createExcel(wb);
        setCellData(data,3, colKeys);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        wb.write(baos);
        byte[] ba = baos.toByteArray();
        ByteArrayInputStream bais = new ByteArrayInputStream(ba);
        return wb;
    }

    private void setCellData(List<Map> data, int startRow,
                             String[] colKeys) {

        HSSFRow row = null;
        HSSFCell cell = null;
        int i = startRow;
        if (data != null && data.size() > 0) {
            for (int k=0;k<data.size();k++){
                Map<String, Object> rowData = data.get(k);
                row = sheet.createRow(i);
                int j = 0;
                for (String key:colKeys){
                    Object colValue = rowData.get(key);
                    cell = row.createCell(j);
                    if (colValue != null) {
                        sheet.setColumnWidth(0,(int)((35+0.72)*256));
                        cell.setCellValue(colValue.toString());
                       if (j!=0){
                           cell.setCellStyle(cellStyle);
                       }
                    }
                    j++;
                }
                i++;
            }

        }
    }

    public void exportData(HttpServletResponse response, List<AppHealthPersonnelInfomation>  list, Integer red, Integer green, Integer yellow){
        excel excel = new excel();
        List<Map> data = new ArrayList<>();
        LinkedHashMap<String, Object> e = new LinkedHashMap<String, Object>();
        for(int i=0;i<list.size();i++){
            e =new LinkedHashMap<String,Object>();
            e.put("unit", list.get(i).getUnit());
            e.put("greenCode", list.get(i).getGreenCodeTotal());
            e.put("redCode", list.get(i).getRedCodeTotal());
            data.add(e);

        }
        String[] headNames = { "单位名称", "绿码人数", "红码人数" };
        String[] keys = { "unit",  "greenCode", "redCode"};

        try{
            response.reset();
            String fileName = URLEncoder.encode("浙江公司基建管理单位管理人员复工情况表.xls","UTF-8");
            response.setHeader("content-disposition", "attachment;filename="+fileName);
            response.setCharacterEncoding("UTF-8");
            //1.设置文件ContentType类型,这样设置,会自动判断下载文件类型
            response.setContentType("multipart/form-data");
            // 创建输出流
            OutputStream out = response.getOutputStream();
            HSSFWorkbook workbook = (excel.getExcelFile(data, "管理人员", headNames, keys,data.size()));
            workbook.write(out);
            workbook.close();
            out.close();
    }catch (Exception ex){
            ex.printStackTrace();
        }


    }

}

end!

猜你喜欢

转载自www.cnblogs.com/fyy151617/p/12400955.html