您当前的位置:首页 > 计算机 > 编程开发 > Java

Excel表格多单元合并

时间:02-01来源:作者:点击数:

需要动态生成如下的表头,涉及到横向、纵向单元格合并,效果图:

0

使用的是SXSSFWorkbook,可用于数据量很大的情景,会将数据放在硬盘上,防止堆内存溢出

代码如下:

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.junit.jupiter.api.Test;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * ExcelTest
 *
 * @author zhouxy
 * @date 2022/5/11
 **/
@Slf4j
public class ExcelTest {
    /**
     * 导出excel (HSSFWorkbook)
     */
    @Test
    public void exportExcel() {

        /** 第一步,创建一个Workbook,对应一个Excel文件  */
        SXSSFWorkbook wb = new SXSSFWorkbook();

        /** 第二步,在Workbook中添加一个sheet,对应Excel文件中的sheet  */
        SXSSFSheet sheet = wb.createSheet("报表");

        /** 第三步,创建标题 ,合并标题单元格 */
        // 行号
        int rowNum = 0;
        // 创建第一页的第一行,索引从0开始
        SXSSFRow row0 = sheet.createRow(rowNum++);
        row0.setHeight((short) 800);// 设置行高

        String title = "报表";
        SXSSFCell c00 = row0.createCell(0);
        c00.setCellValue(title);
        CellStyle titleStyle = createTitleCellStyle(wb);
        CellStyle headerStyle = createHeadCellStyle(wb);
        c00.setCellStyle(titleStyle);
        // 合并单元格,参数依次为起始行,结束行,起始列,结束列 (索引0开始)
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 8));//标题合并单元格操作,6为总列数

        // 第二行
        SXSSFRow row1 = sheet.createRow(rowNum++);
        row1.setHeight((short) 500);
        String[] row_first = {"姓名", "年龄", "年级", "成绩", "", "", "", "", ""};
        for (int i = 0; i < row_first.length; i++) {
            SXSSFCell tempCell = row1.createCell(i);
            tempCell.setCellValue(row_first[i]);
            tempCell.setCellStyle(headerStyle);

            // 合并
            if (i < 3) {
                sheet.addMergedRegion(new CellRangeAddress(1, 2, i, i));
            }
        }
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 3, 8));

        //设置第三行标题
        String[] titles_row2 = {"语文", "数学", "英语", "生物", "物理",
                "化学"};
        SXSSFRow title_row2 = sheet.createRow(2);
        for (int j = 0; j <= 8; j++) {
            SXSSFCell tempCell = title_row2.createCell(j);
            tempCell.setCellStyle(headerStyle);
            if(j >= 3){
                tempCell.setCellValue(titles_row2[j - 3]);
            }
        }
        //导出
        try (FileOutputStream excel = new FileOutputStream("excel.xls");
             BufferedOutputStream bos = new BufferedOutputStream(excel)) {
            wb.write(bos);
            System.out.println("导出完成");
        } catch (IOException e) {
            System.out.println("导出失败:" + e.getMessage());
        }

    }

    /**
     * 创建标题样式
     *
     * @param wb
     * @return
     */
    private static CellStyle createTitleCellStyle(SXSSFWorkbook wb) {
        CellStyle cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直对齐
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        cellStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());//背景颜色

        Font headerFont1 = wb.createFont(); // 创建字体样式
        headerFont1.setFontName("黑体"); // 设置字体类型
        headerFont1.setFontHeightInPoints((short) 15); // 设置字体大小
        cellStyle.setFont(headerFont1); // 为标题样式设置字体样式

        return cellStyle;
    }

    /**
     * 创建表头样式
     *
     * @param wb
     * @return
     */
    private static CellStyle createHeadCellStyle(SXSSFWorkbook wb) {
        CellStyle cellStyle = wb.createCellStyle();
        cellStyle.setWrapText(true);// 设置自动换行
        cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());//背景颜色
        cellStyle.setAlignment(HorizontalAlignment.CENTER); //水平居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); //垂直对齐
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        cellStyle.setBottomBorderColor(IndexedColors.BLACK.index);
        cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
        cellStyle.setBorderLeft(BorderStyle.THIN); //左边框
        cellStyle.setBorderRight(BorderStyle.THIN); //右边框
        cellStyle.setBorderTop(BorderStyle.THIN); //上边框

        Font headerFont = wb.createFont(); // 创建字体样式
        headerFont.setFontName("黑体"); // 设置字体类型
        headerFont.setFontHeightInPoints((short) 12); // 设置字体大小
        cellStyle.setFont(headerFont); // 为标题样式设置字体样式

        return cellStyle;
    }
}
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门