前言
    系统数据导出excel已经很具普遍性,不单单是BI有这需求,表单性质的数据大都希望直接导出excel,这个需求甚至比邮件接收更加突出。
    Davinci导出excel有两种方式,都在dashboard页面
- 单个widget导出
 - 整个dashboard导出,多个sheet页,一个sheet页对应一个widget数据
表格数据
 
    Davinci透视驱动和图表驱动下都有表格的功能,表格中维度指标是自动合并的,效果如下:
图表驱动

透视驱动

表格导出excel
    这里先不考虑图形效果的数据导出,表格数据更希望导出excel是相同的样式,也就是自动合并单元格,现有的表格数据导出效果如下:
图表驱动

透视驱动

图表驱动表格excel自动合并单元格
合并后效果图
图表驱动

透视驱动

了解现有逻辑
1 2 3 4 5
   | <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> </dependency>
   | 
通过代码和依赖可以看出采用的poi处理导出excel
改造计划
    如果通过现有的方式加入合并单元格的逻辑改造有点麻烦,这里我们直接找较完善的poi合并单元格的方法来直接引用并调用,如果有更好的方式可以一起讨论交流,欢迎留言。
    参考poi合并单元格:https://www.cnblogs.com/mr-wuxiansheng/p/7930378.html
代码改造
    参考上面链接这里直接提供改造后端的代码
一
新增PoiInfo实体类,严格意义上这应该是DO这样我们放的DTO下面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
   | package edp.davinci.dto.poiDto; import lombok.Data; import java.io.Serializable; /**  * POI Excel报表导出,列合并实体<br>  */ @Data public class PoiInfo implements Serializable{     private static final long serialVersionUID = 1L;     private String content;     private String oldContent;     private int rowIndex;     private int cellIndex;     public PoiInfo() {     }     public PoiInfo(String content, String oldContent, int rowIndex,                    int cellIndex) {         this.content = content;         this.oldContent = oldContent;         this.rowIndex = rowIndex;         this.cellIndex = cellIndex;     }     @Override     public String toString() {         return "PoiInfo [content=" + content + ", oldContent=" + oldContent                 + ", rowIndex=" + rowIndex + ", cellIndex=" + cellIndex + "]";     } }
   | 
二
废弃writeLine方法,新增createSheet方法
1
   | \server\src\main\java\edp\davinci\service\excel\AbstractSheetWriter.java
   | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32...  |