精华内容
下载资源
问答
  • poi导出Excel报表表头双层表头、合并单元格 效果图: controller层方法:  /**  *   * 导出Excel报表  * @param request  * @return  *   */  @RequestMapping("/export")  @...

    poi导出Excel报表多表头双层表头、合并单元格

    效果图:

    controller层方法:

      /**
         * 
         * 导出Excel报表
         * @param request
         * @return
         * 
         */
        @RequestMapping("/export")
        @ResponseBody
        public void export(HttpServletRequest request,
                HttpServletResponse response, String yearMonth) {
            try {
                SimpleDateFormat dateFmt = new SimpleDateFormat("yyyy-MM-dd");
                Map<String, Object> params = new HashMap<String, Object>();
                params.put("yearMonth", yearMonth + "%");
                List<TemperHumidityModel> list = temperHumidityService
                        .getList(params);
                for (int i = 0; i < list.size(); i++) {
                    Date date = list.get(i).getRecordDate();
                    String dateStr = dateFmt.format(date);
                    dateStr = dateStr.replace(yearMonth + "-", "");
                    list.get(i).setRecordDay(dateStr);
                }
                
                Map<Integer, String> map = new HashMap<Integer, String>();
                    map.put(1, "晴");
                    map.put(2, "多云");
                    map.put(3, "阴");
                    map.put(4, "小雨");
                    map.put(5, "中雨");
                    map.put(6, "大雨");
                    map.put(7, "大到暴雨");
                    map.put(8, "雾");
                    map.put(9, "霾");    
                // 构造导出数据
                List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
                for (int i = 0; i < list.size(); i++) {
                    TemperHumidityModel model = list.get(i);
                    Map<String, Object> tmpMap = new HashMap<String, Object>();
                    tmpMap.put("date", model.getRecordDay());
                    if(model.getWeather() == 1) {
                        tmpMap.put("weather", map.get(1));
                    }else if(model.getWeather() == 2) {
                        tmpMap.put("weather", map.get(2));
                    }else if(model.getWeather() == 3) {
                        tmpMap.put("weather", map.get(3));
                    }else if(model.getWeather() == 4) {
                        tmpMap.put("weather", map.get(4));
                    }else if(model.getWeather() == 5) {
                        tmpMap.put("weather", map.get(5));
                    }else if(model.getWeather() == 6) {
                        tmpMap.put("weather", map.get(6));
                    }else if(model.getWeather() == 7) {
                        tmpMap.put("weather", map.get(7));
                    }else if(model.getWeather() == 8) {
                        tmpMap.put("weather", map.get(8));
                    }else if(model.getWeather() == 9) {
                        tmpMap.put("weather", map.get(9));
                    }
                    tmpMap.put("natureTem", model.getNatureTem());
                    tmpMap.put("natureHum", model.getNatureHum());
                    tmpMap.put("adjustTem", model.getAdjustTem());
                    tmpMap.put("adjustHum", model.getAdjustHum());
                    tmpMap.put("remark", model.getRemark());
                    tmpMap.put("creator", model.getRealname());
                    dataList.add(tmpMap);
                }
                String sheetName = "温湿度日记录";
                String date = yearMonth;
                String[] head0 = new String[] { "日期", "天气", "自然", "自然", "调整", "调整",
                        "备注", "记录人" };  //在excel中的第3行每列的参数
                String[] head1 = new String[] { "温度℃", "湿度%", "温度℃", "湿度%" };  //在excel中的第4行每列(合并列)的参数
                String[] headnum0 = new String[] { "2,3,0,0", "2,3,1,1", "2,2,2,3",
                        "2,2,4,5", "2,3,6,6", "2,3,7,7" };  //对应excel中的行和列,下表从0开始{"开始行,结束行,开始列,结束列"}
                String[] headnum1 = new String[] { "3,3,2,2", "3,3,3,3", "3,3,4,4",
                        "3,3,5,5" };
                String[] colName = new String[] { "date", "weather", "natureTem",
                        "natureHum", "adjustTem", "adjustHum", "remark", "creator" };  //需要显示在excel中的参数对应的值,因为是用map存的,放的都是对应的key
                reportMergeXls(request, response, dataList, sheetName, head0,
                        headnum0, head1, headnum1, colName, date);   //utils类需要用到的参数
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

     

    utils类:

    package org.base.controller;

    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.OutputStream;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    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.hssf.util.CellRangeAddress;
    import org.base.util.CellUtil;
    import org.core.controller.BaseController;

        /**
         * 多行表头
         * dataList:导出的数据;sheetName:表头名称; head0:表头第一行列名;headnum0:第一行合并单元格的参数
         * head1:表头第二行列名;headnum1:第二行合并单元格的参数;detail:导出的表体字段
         *
         */
        public void reportMergeXls(HttpServletRequest request,
                HttpServletResponse response, List<Map<String, Object>> dataList,
                String sheetName, String[] head0, String[] headnum0,
                String[] head1, String[] headnum1, String[] detail , String date)
                throws Exception {
            HSSFWorkbook workbook = new HSSFWorkbook();
            HSSFSheet sheet = workbook.createSheet(sheetName);// 创建一个表
            // 表头标题样式
            HSSFFont headfont = workbook.createFont();
            headfont.setFontName("宋体");
            headfont.setFontHeightInPoints((short) 22);// 字体大小
            HSSFCellStyle headstyle = workbook.createCellStyle();
            headstyle.setFont(headfont);
            headstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中
            headstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
            headstyle.setLocked(true);    
            // 表头时间样式
            HSSFFont datefont = workbook.createFont();
            datefont.setFontName("宋体");
            datefont.setFontHeightInPoints((short) 12);// 字体大小
            HSSFCellStyle datestyle = workbook.createCellStyle();
            datestyle.setFont(datefont);
            datestyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中
            datestyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
            datestyle.setLocked(true);
            // 列名样式
            HSSFFont font = workbook.createFont();
            font.setFontName("宋体");
            font.setFontHeightInPoints((short) 12);// 字体大小
            HSSFCellStyle style = workbook.createCellStyle();
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
            style.setFont(font);
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中
            style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
            style.setLocked(true);
            // 普通单元格样式(中文)
            HSSFFont font2 = workbook.createFont();
            font2.setFontName("宋体");
            font2.setFontHeightInPoints((short) 12);
            HSSFCellStyle style2 = workbook.createCellStyle();
            style2.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
            style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
            style2.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
            style2.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
            style2.setFont(font2);
            style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中
            style2.setWrapText(true); // 换行
            style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
            // 设置列宽  (第几列,宽度)
            sheet.setColumnWidth( 0, 1600);
            sheet.setColumnWidth( 1, 3600);  
            sheet.setColumnWidth( 2, 2800);  
            sheet.setColumnWidth( 3, 2800);  
            sheet.setColumnWidth( 4, 2800);  
            sheet.setColumnWidth( 5, 2800);
            sheet.setColumnWidth( 6, 4500);
            sheet.setColumnWidth( 7, 3600); 
            sheet.setDefaultRowHeight((short)360);//设置行高
            // 第一行表头标题
            sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, head0.length-1));
            HSSFRow row = sheet.createRow(0);
            row.setHeight((short) 0x349);
            HSSFCell cell = row.createCell(0);
            cell.setCellStyle(headstyle);
            CellUtil.setCellValue(cell, sheetName);
            // 第二行时间
            sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, head0.length-1));
            HSSFRow row1 = sheet.createRow(1);
            row.setHeight((short) 0x349);
            HSSFCell cell1 = row1.createCell(0);
            cell1.setCellStyle(datestyle);
            CellUtil.setCellValue(cell1, date);        
            // 第三行表头列名
            row = sheet.createRow(2);
            for (int i = 0; i < 8; i++) {
                cell = row.createCell(i);
                cell.setCellValue(head0[i]);
                cell.setCellStyle(style);
            }
            //动态合并单元格
            for (int i = 0; i < headnum0.length; i++) {
                String[] temp = headnum0[i].split(",");
                Integer startrow = Integer.parseInt(temp[0]);
                Integer overrow = Integer.parseInt(temp[1]);
                Integer startcol = Integer.parseInt(temp[2]);
                Integer overcol = Integer.parseInt(temp[3]);
                sheet.addMergedRegion(new CellRangeAddress(startrow, overrow,
                        startcol, overcol));
            }
            //设置合并单元格的参数并初始化带边框的表头(这样做可以避免因为合并单元格后有的单元格的边框显示不出来)
            row = sheet.createRow(3);  //因为下标从0开始,所以这里表示的是excel中的第四行
            for (int i = 0; i < head0.length; i++) { 
                cell = row.createCell(i);
                cell.setCellStyle(style);  //设置excel中第四行的1、2、7、8列的边框
                if(i > 1 && i< 6) {
                    for (int j = 0; j < head1.length; j++) {
                        cell = row.createCell(j + 2);
                        cell.setCellValue(head1[j]);  //给excel中第四行的3、4、5、6列赋值("温度℃", "湿度%", "温度℃", "湿度%")
                        cell.setCellStyle(style);  //设置excel中第四行的3、4、5、6列的边框
                    } 
                } 
            }
            //动态合并单元格
            for (int i = 0; i < headnum1.length; i++) {
                String[] temp = headnum1[i].split(",");
                Integer startrow = Integer.parseInt(temp[0]);
                Integer overrow = Integer.parseInt(temp[1]);
                Integer startcol = Integer.parseInt(temp[2]);
                Integer overcol = Integer.parseInt(temp[3]);
                sheet.addMergedRegion(new CellRangeAddress(startrow, overrow,
                        startcol, overcol));
            }

            // 设置列值-内容
            for (int i = 0; i < dataList.size(); i++) {
                row = sheet.createRow(i + 4);//标题、时间、表头字段共占了4行,所以在填充数据的时候要加4,也就是数据要从第5行开始填充
                for (int j = 0; j < detail.length; j++) {
                    Map tempmap = (HashMap) dataList.get(i);
                    Object data = tempmap.get(detail[j]);                
                    cell = row.createCell(j);
                    cell.setCellStyle(style2);
                    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                    CellUtil.setCellValue(cell, data);
                }
            }
            String fileName = new String(sheetName.getBytes("gb2312"), "ISO8859-1");
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            workbook.write(baos);
            response.setContentType("application/x-download;charset=utf-8");
            response.addHeader("Content-Disposition", "attachment;filename="
                    + fileName + ".xls");
            OutputStream os = response.getOutputStream();
            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            byte[] b = new byte[1024];
            while ((bais.read(b)) > 0) {
                os.write(b);
            }
            bais.close();
            os.flush();
            os.close();
        }

     

    CellUtil类:

    package org.base.util;

    import java.math.BigDecimal;
    import java.sql.Date;
    import java.text.DecimalFormat;
    import java.text.SimpleDateFormat;
    import java.util.regex.Pattern;

    import org.apache.poi.hssf.usermodel.HSSFCell;

    public class CellUtil {
        
        public static String returnCellValue(HSSFCell cell){
            String cellvalue = "";
            if (null != cell) {   
                switch (cell.getCellType()) {   
                case HSSFCell.CELL_TYPE_NUMERIC: // 数字   
                    return String.valueOf(cell.getNumericCellValue()).trim();
                case HSSFCell.CELL_TYPE_STRING: // 字符串   
                    return String.valueOf(cell.getStringCellValue()).trim();
                case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean   
                    return String.valueOf(cell.getBooleanCellValue()).trim();
                case HSSFCell.CELL_TYPE_FORMULA: // 公式   
                    return String.valueOf(cell.getCellFormula()).trim();  
                case HSSFCell.CELL_TYPE_BLANK: // 空值   
                    return "";  
                case HSSFCell.CELL_TYPE_ERROR: // 故障   
                    return ""; 
                default:   
                    return "";   
                }   
            } else {   
                
            }  
            return cellvalue;
        }
        
        //避免cell.setCellValue(checkOrderQmSave.getSellOrderNo())中参数为空就会报错
        public static void setCellValue(HSSFCell cell, Object object){
            if(object == null){
                cell.setCellValue("");  
            }else{
                if (object instanceof String) {
                    cell.setCellValue(String.valueOf(object));  
                }else if(object instanceof Long){
                    Long temp = (Long)object;
                    String cellvalue = new DecimalFormat("#0.00").format(temp.doubleValue());
                    cell.setCellValue(cellvalue);  
                }else if(object instanceof Double){
                    Double temp = (Double)object;
                    String cellvalue = new DecimalFormat("#0.00").format(temp.doubleValue());
                    cell.setCellValue(cellvalue);  
                }else if(object instanceof Float){
                    Float temp = (Float)object;
                    String cellvalue = new DecimalFormat("#0.00").format(temp.doubleValue());
                    cell.setCellValue(cellvalue);  
                }else if(object instanceof Integer){
                    Integer temp = (Integer)object;
                    cell.setCellValue(temp.intValue());  
                }else if(object instanceof BigDecimal){
                    BigDecimal temp = (BigDecimal)object;
                    String cellvalue = new DecimalFormat("#0.00").format(temp.doubleValue());
                    cell.setCellValue(cellvalue);  
                }else{
                    cell.setCellValue("");  
                }
            }
        }
        public static void setCellValue(HSSFCell cell, Object object, String model){
            if(object == null){
                cell.setCellValue("");  
            }else{
                if (object instanceof String) {
                    cell.setCellValue(String.valueOf(object));  
                }else if(object instanceof Long){
                    Long temp = (Long)object;
                    String cellvalue = new DecimalFormat("#0.00").format(temp.doubleValue());
                    cell.setCellValue(cellvalue);  
                }else if(object instanceof Double){
                    Double temp = (Double)object;
                    String cellvalue = new DecimalFormat("#0.00").format(temp.doubleValue());
                    cell.setCellValue(cellvalue);  
                }else if(object instanceof Float){
                    Float temp = (Float)object;
                    String cellvalue = new DecimalFormat("#0.00").format(temp.doubleValue());
                    cell.setCellValue(cellvalue);  
                }else if(object instanceof Integer){
                    Integer temp = (Integer)object;
                    cell.setCellValue(temp.intValue());  
                }else if(object instanceof BigDecimal){
                    BigDecimal temp = (BigDecimal)object;
                    String cellvalue = new DecimalFormat("#0.00").format(temp.doubleValue());
                    cell.setCellValue(cellvalue);  
                }else if(object instanceof java.sql.Date){
                    cell.setCellValue(new SimpleDateFormat(model).format(object));  
                }else if(object instanceof java.util.Date){
                    cell.setCellValue(new SimpleDateFormat(model).format(object));  
                }else{
                    cell.setCellValue("");  
                }
            }
        }
        public static void setCellValue(HSSFCell cell, String object){
            if(object == null){
                cell.setCellValue("");  
            }else{
                cell.setCellValue(object);  
            }
        }
        public static void setCellValue(HSSFCell cell, Long object){
            if(object == null){
                cell.setCellValue("");  
            }else{
                cell.setCellValue(object.doubleValue());  
            }
        }
        public static void setCellValue(HSSFCell cell, Double object){
            if(object == null){
                cell.setCellValue("");  
            }else{
                cell.setCellValue(object.doubleValue());  
            }
        }
        public static void setCellValue(HSSFCell cell, double object){
            
                cell.setCellValue(object);  
            
        }
        public static void setCellValue(HSSFCell cell, Date object, String model){
            if(object == null){
                cell.setCellValue("");  
            }else{
                cell.setCellValue(new SimpleDateFormat(model).format(object));  
            }
        }
        public static void setCellValue(HSSFCell cell, java.util.Date object, String model){
            if(object == null){
                cell.setCellValue("");  
            }else{
                cell.setCellValue(new SimpleDateFormat(model).format(object));  
            }
        }
        public static void setCellValue(HSSFCell cell, BigDecimal object){
            if(object == null){
                cell.setCellValue("");  
            }else{
                cell.setCellValue(object.toString());  
            }
        }
        
        //判断EXCEL表格高度用 row.setHeight((short) CellUtil.getExcelCellAutoHeight(TAR_VAL_ALL_STRING, 280, 30));
        public static float getExcelCellAutoHeight(String str,float defaultRowHeight, int fontCountInline) {
            int defaultCount = 0;
            for (int i = 0; i < str.length(); i++) {
                int ff = getregex(str.substring(i, i + 1));
                defaultCount = defaultCount + ff;
            }
            if (defaultCount > fontCountInline){
                return ((int) (defaultCount / fontCountInline) + 1) * defaultRowHeight;//计算
            } else {
                return defaultRowHeight;
            }
        }
        public static int getregex(String charStr) {
            if("".equals(charStr) || charStr == null){
                return 1;
            }
            // 判断是否为字母或字符
            if (Pattern.compile("^[A-Za-z0-9]+$").matcher(charStr).matches()) {
                return 1;
            }
            // 判断是否为全角
            if (Pattern.compile("[\u4e00-\u9fa5]+$").matcher(charStr).matches()) {
                return 2;
            }
            //全角符号 及中文
            if (Pattern.compile("[^x00-xff]").matcher(charStr).matches()) {
                return 2;
            }
            return 1;
        }
    }

    展开全文
  • 效果图:controller层方法:/**** 导出Excel报表* @param request* @return**/@RequestMapping("/export")@ResponseBodypublic void export(HttpServletRequest request,HttpServletResponse response, String year...

    效果图:

    controller层方法:

    /**

    *

    * 导出Excel报表

    * @param request

    * @return

    *

    */

    @RequestMapping("/export")

    @ResponseBody

    public void export(HttpServletRequest request,

    HttpServletResponse response, String yearMonth) {

    try {

    SimpleDateFormat dateFmt = new SimpleDateFormat("yyyy-MM-dd");

    Map params = new HashMap();

    params.put("yearMonth", yearMonth + "%");

    List list = temperHumidityService

    .getList(params);

    for (int i = 0; i < list.size(); i++) {

    Date date = list.get(i).getRecordDate();

    String dateStr = dateFmt.format(date);

    dateStr = dateStr.replace(yearMonth + "-", "");

    list.get(i).setRecordDay(dateStr);

    }

    Map map = new HashMap();

    map.put(1, "晴");

    map.put(2, "多云");

    map.put(3, "阴");

    map.put(4, "小雨");

    map.put(5, "中雨");

    map.put(6, "大雨");

    map.put(7, "大到暴雨");

    map.put(8, "雾");

    map.put(9, "霾");

    // 构造导出数据

    List> dataList = new ArrayList>();

    for (int i = 0; i < list.size(); i++) {

    TemperHumidityModel model = list.get(i);

    Map tmpMap = new HashMap();

    tmpMap.put("date", model.getRecordDay());

    if(model.getWeather() == 1) {

    tmpMap.put("weather", map.get(1));

    }else if(model.getWeather() == 2) {

    tmpMap.put("weather", map.get(2));

    }else if(model.getWeather() == 3) {

    tmpMap.put("weather", map.get(3));

    }else if(model.getWeather() == 4) {

    tmpMap.put("weather", map.get(4));

    }else if(model.getWeather() == 5) {

    tmpMap.put("weather", map.get(5));

    }else if(model.getWeather() == 6) {

    tmpMap.put("weather", map.get(6));

    }else if(model.getWeather() == 7) {

    tmpMap.put("weather", map.get(7));

    }else if(model.getWeather() == 8) {

    tmpMap.put("weather", map.get(8));

    }else if(model.getWeather() == 9) {

    tmpMap.put("weather", map.get(9));

    }

    tmpMap.put("natureTem", model.getNatureTem());

    tmpMap.put("natureHum", model.getNatureHum());

    tmpMap.put("adjustTem", model.getAdjustTem());

    tmpMap.put("adjustHum", model.getAdjustHum());

    tmpMap.put("remark", model.getRemark());

    tmpMap.put("creator", model.getRealname());

    dataList.add(tmpMap);

    }

    String sheetName = "温湿度日记录";

    String date = yearMonth;

    String[] head0 = new String[] { "日期", "天气", "自然", "自然", "调整", "调整",

    "备注", "记录人" };  //在excel中的第3行每列的参数

    String[] head1 = new String[] { "温度℃", "湿度%", "温度℃", "湿度%" };  //在excel中的第4行每列(合并列)的参数

    String[] headnum0 = new String[] { "2,3,0,0", "2,3,1,1", "2,2,2,3",

    "2,2,4,5", "2,3,6,6", "2,3,7,7" };  //对应excel中的行和列,下表从0开始{"开始行,结束行,开始列,结束列"}

    String[] headnum1 = new String[] { "3,3,2,2", "3,3,3,3", "3,3,4,4",

    "3,3,5,5" };

    String[] colName = new String[] { "date", "weather", "natureTem",

    "natureHum", "adjustTem", "adjustHum", "remark", "creator" };  //需要显示在excel中的参数对应的值,因为是用map存的,放的都是对应的key

    reportMergeXls(request, response, dataList, sheetName, head0,

    headnum0, head1, headnum1, colName, date);   //utils类需要用到的参数

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    utils类:

    package org.base.controller;

    import java.io.ByteArrayInputStream;

    import java.io.ByteArrayOutputStream;

    import java.io.OutputStream;

    import java.util.HashMap;

    import java.util.List;

    import java.util.Map;

    import java.util.regex.Matcher;

    import java.util.regex.Pattern;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    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.hssf.util.CellRangeAddress;

    import org.base.util.CellUtil;

    import org.core.controller.BaseController;

    /**

    * 多行表头

    * dataList:导出的数据;sheetName:表头名称; head0:表头第一行列名;headnum0:第一行合并单元格的参数

    * head1:表头第二行列名;headnum1:第二行合并单元格的参数;detail:导出的表体字段

    *

    */

    public void reportMergeXls(HttpServletRequest request,

    HttpServletResponse response, List> dataList,

    String sheetName, String[] head0, String[] headnum0,

    String[] head1, String[] headnum1, String[] detail , String date)

    throws Exception {

    HSSFWorkbook workbook = new HSSFWorkbook();

    HSSFSheet sheet = workbook.createSheet(sheetName);// 创建一个表

    // 表头标题样式

    HSSFFont headfont = workbook.createFont();

    headfont.setFontName("宋体");

    headfont.setFontHeightInPoints((short) 22);// 字体大小

    HSSFCellStyle headstyle = workbook.createCellStyle();

    headstyle.setFont(headfont);

    headstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中

    headstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中

    headstyle.setLocked(true);

    // 表头时间样式

    HSSFFont datefont = workbook.createFont();

    datefont.setFontName("宋体");

    datefont.setFontHeightInPoints((short) 12);// 字体大小

    HSSFCellStyle datestyle = workbook.createCellStyle();

    datestyle.setFont(datefont);

    datestyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中

    datestyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中

    datestyle.setLocked(true);

    // 列名样式

    HSSFFont font = workbook.createFont();

    font.setFontName("宋体");

    font.setFontHeightInPoints((short) 12);// 字体大小

    HSSFCellStyle style = workbook.createCellStyle();

    style.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框

    style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框

    style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框

    style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框

    style.setFont(font);

    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中

    style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中

    style.setLocked(true);

    // 普通单元格样式(中文)

    HSSFFont font2 = workbook.createFont();

    font2.setFontName("宋体");

    font2.setFontHeightInPoints((short) 12);

    HSSFCellStyle style2 = workbook.createCellStyle();

    style2.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框

    style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框

    style2.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框

    style2.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框

    style2.setFont(font2);

    style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中

    style2.setWrapText(true); // 换行

    style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中

    // 设置列宽  (第几列,宽度)

    sheet.setColumnWidth( 0, 1600);

    sheet.setColumnWidth( 1, 3600);

    sheet.setColumnWidth( 2, 2800);

    sheet.setColumnWidth( 3, 2800);

    sheet.setColumnWidth( 4, 2800);

    sheet.setColumnWidth( 5, 2800);

    sheet.setColumnWidth( 6, 4500);

    sheet.setColumnWidth( 7, 3600);

    sheet.setDefaultRowHeight((short)360);//设置行高

    // 第一行表头标题

    sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, head0.length-1));

    HSSFRow row = sheet.createRow(0);

    row.setHeight((short) 0x349);

    HSSFCell cell = row.createCell(0);

    cell.setCellStyle(headstyle);

    CellUtil.setCellValue(cell, sheetName);

    // 第二行时间

    sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, head0.length-1));

    HSSFRow row1 = sheet.createRow(1);

    row.setHeight((short) 0x349);

    HSSFCell cell1 = row1.createCell(0);

    cell1.setCellStyle(datestyle);

    CellUtil.setCellValue(cell1, date);

    // 第三行表头列名

    row = sheet.createRow(2);

    for (int i = 0; i < 8; i++) {

    cell = row.createCell(i);

    cell.setCellValue(head0[i]);

    cell.setCellStyle(style);

    }

    //动态合并单元格

    for (int i = 0; i < headnum0.length; i++) {

    String[] temp = headnum0[i].split(",");

    Integer startrow = Integer.parseInt(temp[0]);

    Integer overrow = Integer.parseInt(temp[1]);

    Integer startcol = Integer.parseInt(temp[2]);

    Integer overcol = Integer.parseInt(temp[3]);

    sheet.addMergedRegion(new CellRangeAddress(startrow, overrow,

    startcol, overcol));

    }

    //设置合并单元格的参数并初始化带边框的表头(这样做可以避免因为合并单元格后有的单元格的边框显示不出来)

    row = sheet.createRow(3);  //因为下标从0开始,所以这里表示的是excel中的第四行

    for (int i = 0; i < head0.length; i++) {

    cell = row.createCell(i);

    cell.setCellStyle(style);  //设置excel中第四行的1、2、7、8列的边框

    if(i > 1 && i< 6) {

    for (int j = 0; j < head1.length; j++) {

    cell = row.createCell(j + 2);

    cell.setCellValue(head1[j]);  //给excel中第四行的3、4、5、6列赋值("温度℃", "湿度%", "温度℃", "湿度%")

    cell.setCellStyle(style);  //设置excel中第四行的3、4、5、6列的边框

    }

    }

    }

    //动态合并单元格

    for (int i = 0; i < headnum1.length; i++) {

    String[] temp = headnum1[i].split(",");

    Integer startrow = Integer.parseInt(temp[0]);

    Integer overrow = Integer.parseInt(temp[1]);

    Integer startcol = Integer.parseInt(temp[2]);

    Integer overcol = Integer.parseInt(temp[3]);

    sheet.addMergedRegion(new CellRangeAddress(startrow, overrow,

    startcol, overcol));

    }

    // 设置列值-内容

    for (int i = 0; i < dataList.size(); i++) {

    row = sheet.createRow(i + 2 + dataList.size());

    for (int j = 0; j < detail.length; j++) {

    Map tempmap = (HashMap) dataList.get(i);

    Object data = tempmap.get(detail[j]);

    cell = row.createCell(j);

    cell.setCellStyle(style2);

    cell.setCellType(HSSFCell.CELL_TYPE_STRING);

    CellUtil.setCellValue(cell, data);

    }

    }

    String fileName = new String(sheetName.getBytes("gb2312"), "ISO8859-1");

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    workbook.write(baos);

    response.setContentType("application/x-download;charset=utf-8");

    response.addHeader("Content-Disposition", "attachment;filename="

    + fileName + ".xls");

    OutputStream os = response.getOutputStream();

    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());

    byte[] b = new byte[1024];

    while ((bais.read(b)) > 0) {

    os.write(b);

    }

    bais.close();

    os.flush();

    os.close();

    }

    展开全文
  • 业务是导出一个报表,要求有一个跨列的表头,肯定要用到合并单元格,但合并后边框消失。网上的一些解决办法是重写合并单元格方法,但弄清楚原因后,其实没必要。原来是这样的:合并后就第一个有边框,其余全成空白...

    业务是导出一个报表,要求有一个跨多列的表头,肯定要用到合并单元格,但合并后边框消失。网上的一些解决办法是重写合并单元格方法,但弄清楚原因后,其实没必要。

    原来是这样的:

    0b569c45835f6e213c68351e437a192c.png

    合并后就第一个有边框,其余全成空白了,上代码:

    HSSFCellStyle style = wb.createCellStyle(); 创建样式

    style.setAlignment(HSSFCellStyle.ALIGN_RIGHT); //字体右对齐

    style.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框

    style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框

    style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框

    style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框

    HSSFRow row = sheet.createRow(1);

    HSSFCell cel = row.createCell(0);

    cel.setCellValue("编制人:" + "admin" + " 日期:" + sdf.format(new Date()));

    cel.setCellStyle(style);

    for (int j = 1; j <= 11; j++) {

    cel = row.createCell(j);

    cel.setCellStyle(style); //style为带边框的样式 上面有定义

    cel.setCellValue("");

    }

    运行后:

    2ba9be210cb77a942d3a5d5be5827cab.png

    哈哈!完美的解决了

    分析:创建的行的的时候只row.createCell(0),当然只有第一列有边框,其余没边框了,然后一合并,结果就显而易见出现图一的情况了。但要是创建等多的单元格,每个单元格都加上边框,再合并就没事了。

    还是搞清原理比较好。还有一个根据单元格内容自适应高宽的问题,官方给的有问题,还没解决。>_<

    展开全文
  • 业务是导出一个报表,要求有一个跨列的表头,肯定要用到合并单元格,但合并后边框消失。网上的一些解决办法是重写合并单元格方法,但弄清楚原因后,其实没必要。 原来是这样的: 合并后就第一个有边框,其余...

    业务是导出一个报表,要求有一个跨多列的表头,肯定要用到合并单元格,但合并后边框消失。网上的一些解决办法是重写合并单元格方法,但弄清楚原因后,其实没必要。

    原来是这样的:

    合并后就第一个有边框,其余全成空白了,上代码:

     

    HSSFCellStyle style = wb.createCellStyle(); 创建样式
      style.setAlignment(HSSFCellStyle.ALIGN_RIGHT); //字体右对齐
      style.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框
      style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
      style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
      style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
    HSSFRow row = sheet.createRow(1);
    HSSFCell cel = row.createCell(0);
      cel.setCellValue("编制人:" + "admin" + "         日期:" + sdf.format(new Date()));
      cel.setCellStyle(style);
      for (int j = 1; j <= 11; j++) {
        cel = row.createCell(j);
        cel.setCellStyle(style); //style为带边框的样式 上面有定义
        cel.setCellValue("");
      }
    

    运行后: 

    哈哈!完美的解决了

    分析:创建的行的的时候只row.createCell(0),当然只有第一列有边框,其余没边框了,然后一合并,结果就显而易见出现图一的情况了。但要是创建等多的单元格,每个单元格都加上边框,再合并就没事了。

    还是搞清原理比较好。还有一个根据单元格内容自适应高宽的问题,官方给的有问题,还没解决。>_<

     

    转载于:https://www.cnblogs.com/yangchas/p/8311656.html

    展开全文
  • POI 导出Excel 复杂表头,合并单元格

    千次阅读 2018-03-27 15:09:40
    最近在研究报表导出的方式,在网络上找了很方法,因我要导出的报表是比较复杂一点的,涉及到复杂的表头,合并单元格,最后找到了这篇文章里所写的方法,所以就总结了一下,希望对大家有帮助。1、 controller层方法...
  • Excel支持大量图片导出 ...excel文件由声明,数据,单元格数据,媒体文件等等组件组成, 这些组件分别对应了不同的数据单元.只要把数据分别写入对应的组件,最后构建成一个需要的excel文件. 源码地址 git@github.com
  • java excel 合并单元格

    2020-12-11 14:44:05
    easy-poi注解导出,@Excel 注解有个 needMerge 属性,属性描述:是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的个row),这个属性默认为false,若为true,则会将当前单元格与上
  • 群上常有人在问datagrid怎么导出excel。其实导出可以分两种,一种是直接将页面的数据导出(即前台导出),一种是点击“导出”后再次请求后台,然后封装数据进行导出(即后台导出)。前台导出虽然可以不用再次请求...
  • * 导出excel */ @Override public void exportExcel(HomeForm form) { try { List&lt;String&gt; titles = new ArrayList&lt;String&gt;(); Collections.addAll(titles, new...
  • 一般在导出Excel中,在创建工作sheet后,初始化的sheet中row都是一行一行的,每个单元格都是最小单位,所以问题1什么时候将单元格合并? 方案:先将数据组装成json格式方便插入Excel时进行遍历,接着以巡检项为每...
  • 今天做了一个关于订单得导出得,一个订单一般都是个商品,那么就会出现单元格合并得情况,还有复杂表头得情况,现在拿我做得,给大家一个小demo 先看最终效果 后台实现: 代码: [HttpGet] ...
  • range.NumberFormatLocal="@";//设置单元格格式为文本range=(Range)worksheet.get_...//获取Excel多单元格区域:本例做为Excel表头range.Merge(0);//单元格合并动作worksheet.Cells[1,1]="Excel单元格赋值";//...
  • 传统项目会有关于到处excel的操作 而到处的excel总体来看分两种  一种就是简单结构 表头 行列分明  还有一种稍微复杂些带单元格合并以及行列的增加删除等 第一种很容易找到例子 简单说下第二种情况 首先jar...
  • 本例子是上一篇 DataTable 导出 Excel 的进阶,除了上一篇提到的处理乱码问题,本例还添加了处理多行表头、合并单元格的功能及处理中文文件名乱码问题,应该可以满足日常开发的需要了。 废话不说了,直接上代码...
  • range.NumberFormatLocal = "@"; //设置单元格格式为文本   range = (Range)worksheet.get... //获取Excel多单元格区域:本例做为Excel表头   range.Merge(0); //单元格合并动作   workshee
  • /*** 导出Excel工作蒲* @param $work 导出Excel工作蒲数据* @param string $fileName 导出Excel工作蒲名称* @param string $savePath 保存Excel工作蒲路径* @param bool $isDown ...
  • 本例子是上一篇DataTable 导出 Excel的进阶,除了上一篇提到的处理乱码问题,本例还添加了处理多行表头、合并单元格的功能及处理中文文件名乱码问题,应该可以满足日常开发的需要了。 废话不说了,直接上代码: ...
  • range.NumberFormatLocal="@";//设置单元格格式为文本range=(Range)worksheet.get_Range(...//获取Excel多单元格区域:本例做为Excel表头range.Merge(0);//单元格合并动作worksheet.Cells[1,1]="Excel单元格赋值...
  • 创建一个或个Sheet工作 合并想要合并单元格 创建行Row 根据行row获取单元格cell 给单元格赋值 导出 添加依赖 pom.xml的依赖 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> ...
  • 因为需求变更,最后决定使用做JS导出Excel,网上看了很的帖子和例子,很的例子并不能满足需求(处理复杂表头,兼容主流浏览器,兼容IE等等)。所以,自己找了几个比较不错的例子,在其基础上结合自己的需求进行...
  • Excel导出多层表头

    2012-04-13 17:03:29
    Excel导出多层表头,Excel导出Excel单元格合并

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 150
精华内容 60
关键字:

导出excel合并单元格多表