每日一点,轻松绘制单斜线

问题:各样excel都亟需做表头,特别是斜线怎么办出来的?

一、背景

在后台项目中,常常会蒙受将表现的剧情导出到Excel的须要,通过都以导出单个表头的Excel文件,假设存在级联关系的景况下,也就须要导出多表头的现象。今日那篇文章正是共享导出Excel单表头或多表头的完毕,近些日子促成方案仅援救2行表头场景。如有更头晕目眩的3行表头、4行表头复杂必要能够活动达成。

大范围的斜线表头包含单斜线表头和双斜线表头两类。单斜线表头的制作

在稍复杂的EXCEL数据表中,大家需求通晓数据区第一行、第一列、数值区各属什么品种,由此,要求创立斜线表头。

回答:介绍3种大家最常用的表头,单斜线表头、双斜线表头和斜体表头。

二、实现思路

1.借助POI包完结表头的写入。每种表头其实正是单排,若是是多少个表头,无非正是将写多行表头,然后将要求联合的表头进行合併,借助POI的函数为addMergedRegion。

2.将导出数据开展转载为四个集聚,循环写入每行数据。

如下图所示,选定需求安装但斜线表头的单元格,然后按下Ctrl+1急速键,弹出对话框,切换来选项卡,然后点击边框设置开关的“斜线”就可以得到单斜线表头的差相当少雏形。

每日一点,轻松绘制单斜线。如下:

实际上,无论哪一类表头,框架制作只要求多少个主导步骤:

三、实现代码

3.1pom引入

图片 1图片 2

<properties>        <java.version>1.8</java.version>        <poi.version>3.17</poi.version>        <mybatis.version>1.3.2</mybatis.version>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-aop</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-validation</artifactId>        </dependency>        <dependency>            <groupId>org.mybatis.spring.boot</groupId>            <artifactId>mybatis-spring-boot-starter</artifactId>            <version>${mybatis.version}</version>        </dependency>        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <scope>runtime</scope>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>        <dependency>            <groupId>org.apache.poi</groupId>            <artifactId>poi-ooxml</artifactId>            <version>${poi.version}</version>        </dependency>        <dependency>            <groupId>org.apache.poi</groupId>            <artifactId>poi</artifactId>            <version>${poi.version}</version>        </dependency>    </dependencies>

View Code

3.2Java代码达成

@Getter@Setterpublic class ExcelHelper<T> {    /**     * 表格标题     */    private String title;    /**     * 单元格宽度     */    private int colWidth = 20;    /**     * 行高度     */    private int rowHeight = 20;    private HSSFWorkbook workbook;    /**     * 表头样式     */    private HSSFCellStyle headStyle;    /**     * 主体样式     */    private HSSFCellStyle bodyStyle;    /**     * 日期格式化,默认yyyy-MM-dd HH:mm:ss     */    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    /**     * Constructor     * @param title     */    public ExcelHelper(String title){        this.title = title;        workbook = new HSSFWorkbook();        init();    }    /**     * Constructor     * @param title     * @param colWidth     * @param rowHeight     */    public ExcelHelper(String title, int colWidth, int rowHeight){        this.colWidth = colWidth;        this.rowHeight = rowHeight;        this.title = title;        workbook = new HSSFWorkbook();        init();    }    /**     * Constructor     * @param title     * @param colWidth     * @param rowHeight     * @param dateFormat     */    public ExcelHelper(String title, int colWidth, int rowHeight, String dateFormat) {        this.title = title;        this.colWidth = colWidth;        this.rowHeight = rowHeight;        workbook = new HSSFWorkbook();        sdf = new SimpleDateFormat(dateFormat);        init();    }    /**     * 导出Excel,适用于web导出excel     *     * @param sheet     * @param data     */    private void writeSheet(HSSFSheet sheet, List<T> data,List<Column> headerList) {        try {            sheet.setDefaultColumnWidth;            sheet.setDefaultRowHeightInPoints(rowHeight);            createHead(headerList, sheet);            writeSheetContent(headerList, data, sheet);        } catch (Exception e) {            throw new RuntimeException;        }    }    /**     * 导出表格     * @param listColumn     * @param datas     * @return     * @throws Exception     */    public InputStream exportExcel(List<Column> listColumn,List<T> datas) throws Exception {        splitDataToSheets(datas,listColumn);        return save;    }    /**     * 导出表格 支持2级表头或单表头的Excel导出     * @param headers     * @param datas     * @param filePath     * @throws FileNotFoundException     * @throws IOException     * void     */    public void exportExcel(List<Column> headers,List<T> datas,String filePath) throws IOException {        splitDataToSheets(datas, headers);        save(workbook, filePath);    }    /**     * 把数据写入到单元格     * @param listColumn     * @param datas     * @param sheet     * @throws Exception     * void     */    private void writeSheetContent(List<Column> listColumn,List<T> datas,HSSFSheet sheet) throws Exception {        HSSFRow row;        List<Column> listCol = getColumnList(listColumn);        for (int i = 0, index = 2; i < datas.size(); i++, index++) {            // 创建行            row = sheet.createRow;            for (int j = 0; j < listCol.size(); j++) {                Column c = listCol.get;                createCol(row, c, datas.get;            }        }    }    /**     * 创建表头     * @param listColumn 表头数组     * @return 返回表头总行数     */    public void createHead(List<Column> listColumn, HSSFSheet sheetCo){        HSSFRow row = sheetCo.createRow(0);        HSSFRow row2 = sheetCo.createRow(1);        for(short i = 0, n = 0; i < listColumn.size(); i++){            HSSFCell cell1 = row.createCell;            cell1.setCellStyle(headStyle);            HSSFRichTextString text;            List<Column> columns = listColumn.get.getListColumn();            //双标题            if(CollectionUtils.isEmpty{                // 单标题                HSSFCell cell2 = row2.createCell;                cell2.setCellStyle(headStyle);                text = new HSSFRichTextString(listColumn.get.getContent;                sheetCo.addMergedRegion(new CellRangeAddress(0, n, 1, n));                n++;                cell1.setCellValue;                continue;            }            text = new HSSFRichTextString(listColumn.get.getContent;            cell1.setCellValue;            // 创建第一行大标题            sheetCo.addMergedRegion(new CellRangeAddress(0, 0, n, (short) (n + columns.size() -1)));            // 给标题赋值            for(int j = 0; j < columns.size(); j++){                HSSFCell cell2 = row2.createCell(n++);                cell2.setCellStyle(headStyle);                cell2.setCellValue(new HSSFRichTextString(columns.get.getContent;            }        }    }    /**     * 创建行     * @param row     * @param column     * @param v     * @param rowIndex     * @return     * @throws Exception     */    public int createRowVal(HSSFRow row, Column column,T v,int rowIndex) throws Exception{        // 遍历标题        if(column.getListColumn() != null && column.getListColumn > 0){            for(int i = 0; i < column.getListColumn; i++){                createRowVal(row,column.getListColumn,v,rowIndex);            }        }else{            createCol(row,column,v,rowIndex++);        }        return rowIndex;    }    /**     * 创建单元格     * @param row     * @param column     * @param v     * @param columnIndex     * @throws Exception     */    public void createCol(HSSFRow row,Column column,T v,int columnIndex) throws Exception{        // 创建单元格        HSSFCell cell = row.createCell(columnIndex);        // 设置单元格样式        cell.setCellStyle(bodyStyle);        Class cls = v.getClass();        Field field = cls.getDeclaredField(column.getFieldName;        // 设置些属性是可以访问的        field.setAccessible(true);        if(field.get != null){            Object value = field.get;            if(value instanceof Date){                value = parseDatevalue);            }            HSSFRichTextString richString = new HSSFRichTextString(value.toString;            cell.setCellValue(richString);        }    }    /**     * init     */    private void init(){        // 生成表头样式        headStyle = workbook.createCellStyle();        headStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.AQUA.getIndex;        headStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);        headStyle.setBorderBottom(BorderStyle.THIN);        headStyle.setBorderLeft(BorderStyle.THIN);        headStyle.setBorderRight(BorderStyle.THIN);        headStyle.setBorderTop(BorderStyle.THIN);        headStyle.setAlignment(HorizontalAlignment.CENTER);        headStyle.setVerticalAlignment(VerticalAlignment.CENTER);        // 生成一个字体        HSSFFont headFont = workbook.createFont();        headFont.setColor(HSSFColor.HSSFColorPredefined.VIOLET.getIndex;        headFont.setFontHeightInPoints((short) 12);        headFont.setBold(true);        // 把字体应用到当前的样式        headStyle.setFont;        // 生成并设置另一个样式        bodyStyle = workbook.createCellStyle();        bodyStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.WHITE.getIndex;        bodyStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);        bodyStyle.setBorderBottom(BorderStyle.THIN);        bodyStyle.setBorderLeft(BorderStyle.THIN);        bodyStyle.setBorderRight(BorderStyle.THIN);        bodyStyle.setBorderTop(BorderStyle.THIN);        bodyStyle.setAlignment(HorizontalAlignment.CENTER);        bodyStyle.setVerticalAlignment(VerticalAlignment.CENTER);        // 生成另一个字体        HSSFFont bodyFont = workbook.createFont();        bodyFont.setBold(false);        // 把字体应用到当前的样式        bodyStyle.setFont;    }    /**     * 时间转换     * @param date     * @return     * String     */    private  String parseDate(Date date){        String dateStr = "";        try{            dateStr = sdf.format;        } catch (Exception e){            e.printStackTrace();        }        return dateStr;    }    /**     * 拆分sheet,因为每个sheet不能超过6526,否则会报异常     * @param data     * @param listColumn     * void     */    private void splitDataToSheets(List<T> data,List<Column> listColumn) {        int dataCount = data.size();        int maxColumn = 65535;        int pieces = dataCount / maxColumn;        for (int i = 1; i <= pieces; i++) {            HSSFSheet sheet = workbook.createSheet(this.title + i);            List<T> subList = data.subList * maxColumn, i * maxColumn);            writeSheet(sheet, subList, listColumn);        }        HSSFSheet sheet = workbook.createSheet(this.title + (pieces + 1));        writeSheet(sheet, data.subList(pieces * maxColumn, dataCount), listColumn);    }    /**     * 把column的columnList整理成一个list<column>     * @param listColumn     * @return     * List<Column>     */    private List<Column> getColumnList(List<Column> listColumn){        List<Column> listCol = new ArrayList<>();        for(int i = 0; i < listColumn.size(); i++){            List<Column> list = listColumn.get.getListColumn();            if(list.size() > 0){                for(Column c : list){                    if(c.getFieldName() != null){                        listCol.add;                    }                }            }else{                if(listColumn.get.getFieldName() != null){                    listCol.add(listColumn.get;                }            }        }        return listCol;    }    /**     * 保存Excel到InputStream,此方法适合web导出excel     *     * @param workbook     * @return     */    private InputStream save(HSSFWorkbook workbook) {        ByteArrayOutputStream bos = new ByteArrayOutputStream();        try {            workbook.write;            InputStream bis = new ByteArrayInputStream(bos.toByteArray;            return bis;        } catch (Exception e) {            e.printStackTrace();            throw new RuntimeException;        }    }    /**     * 保存文件     * @param workbook     * @param filePath     * @throws IOException     */    private void save(HSSFWorkbook workbook,String filePath) throws IOException {        workbook.write(new FileOutputStream);    }

图片 3

图片 4

图片 5

四、测试类

图片 6图片 7

public class ExportTest {    @Data    @AllArgsConstructor    public class ValueObj {        private String value1;        private String value2;    }    public static void main(String[] args) throws Exception {        //用于存放第一行单元格        List<Column> listColumn = new ArrayList<>();        // 用于存放第一列第二行的单元格        List<Column> list2 = new ArrayList<>();        // 创建一列,value1 表示这一列需要导出字段的值        list2.add(new Column("标题1","value1"));        list2.add(new Column("标题2","value1"));        list2.add(new Column("标题3","value1"));        // 用于存放第二列第二行的单元格        List<Column> list3  = new ArrayList<>();        list3.add(new Column("标题6","value2"));        list3.add(new Column("标题7","value2"));        //创建第一行大标题,大标题的fieldName 为 null        Column c1 = new Column("标题1",null);        c1.setListColumn;        Column c2 = new Column("标题2",null);        c2.setListColumn;        listColumn.add;        listColumn.add;        //需要导出的数据        List<ValueObj> valueList = new ArrayList<>();        valueList.add(new ValueObj("1","11"));        valueList.add(new ValueObj("2","22"));        valueList.add(new ValueObj("3","33"));        valueList.add(new ValueObj("4","44"));        ExcelHelper<ValueObj> ta = new ExcelHelper<ValueObj>("表格",15,20);        ta.exportExcel(listColumn, valueList,"D:\\outExcel.xls");    }}

View Code

大家还索要将单元格的对齐情势设置为“左对齐”,调节行高之后,用Alt+Enter火速键强制换行,然后输入第2行文字。最终通过在首先行前面增多空格,将其“挤”到最左边。那样就拿走了最终的结果。完整的设置进程如下图所示。

或:

上海体育场地斜体表头:

五、完成效果与利益

图片 8

图片 9

图片 10

步骤1、选定单元格。

双斜线表头的营造

前端是单斜线表头,前者是双斜线表头。

步骤2、设置角度 。

对此此种情状,单斜线表头有的制作方法已经不再适用。我们得以经过插入直线,结合强制换行、对齐等操作完结那样的法力。

制图方法

步骤3、设置斜线 。

率先调治行高,并将单元格设置为“左对齐”,然后经过Alt+Enter快捷键强制换行,输入3行表头标题,然后将第1行标题通过嵌入空格实行右对齐,第2行居中对齐,第3行保持默许左对齐。

单斜线表头

我们切实来操作一下:

图片 11

绘图方法:

图片 12

下一场,切换来菜单,插入两条直线,将3行标题分隔开分离,并安装直线样式与表格边框相称就可以。

图片 13

1、选定B1:H1区域

图片 14

要点:

图片 15

展开:对于三线表头或然多线表头的炮制,大家能够参照双斜线表头的制程。

1、“月份”与“部门”之间用Alt+Enter分两行,“月份”前加空格调治地方;

2、按Ctrl+1,弹出“设置单元格格式”窗口,角度为45度

2、绘制表头的单元格上右键,能够在漂移工具栏选【边框】——【其余边框】,也足以一贯张开【设置单元格格式】,来找斜线边框。

图片 16

双斜线表头

3、选择“边框”选项卡,点击一下“斜线”按键,如上图

绘制方法: