Excel报表导出之动态合并单元格

Vue3项目实战:用xlsx-js-style导出带复杂样式的Excel报表(附完整代码) 本文详细介绍了在Vue3项目中如何使用xlsx-js-style库实现带复杂样式的Excel报表导出。从基础集成到高级样式封装,再到性能优化策略,提供了完整的代码示例和实战技巧,帮助企业开发者高效解决报表导出需求。 阅读详情

要求:

代码: 

JSP页面代码:

<body>
<div id="div1">
    <fieldset style="border: 0; margin-top: 20px;">
            <legend>
                <span style="font-weight: bold; font-size: 15px;">讲师津贴明细查询导出</span>
            </legend>
            <hr>
    </fieldset>

//这个请求千万不要忘记!!!!我会写在最后,这是动态拼Excel表格样式的代码
    <form action="${ctx}/teacherManage/exportMXExcel.do" id="queryTeacherForm" name="fm"  class="form-horizontal">
        <table id="manageUserForm1" style="width: 85%;">
            <tr>
                开始日期:<input name="start_date"
                    id="start_date" class="mini-datepicker" format="yyyy-MM-dd"
                    timeFormat="H:mm:ss" showTime="false" allowInput="false" />
            </tr>  
            <tr>        
                结束日期:<input name="end_date"
                    id="end_date" class="mini-datepicker" format="yyyy-MM-dd"
                    timeFormat="H:mm:ss" showTime="false" allowInput="false" />
            </tr>
        </table>
    </form>
        <br/>
        <div class="mini-button" onclick="checkOutMX()" style="width:150px; margin-right: 32px;">导出讲师津贴明细</div>
</body>

JS中代码:

mini.parse();

var ctx = mini.get("ctx").getValue();
var form = new mini.Form("#exportForm");
function resetF() {
    form.reset();
}


    //津贴明细导出
function checkOutMX() {
    
    var start_date = mini.get("start_date").getText();
    var end_date = mini.get("end_date").getText();
    if((start_date!=null&&start_date!='') && (end_date != null&&end_date!='')){
        if(start_date>end_date){
            mini.alert("开始时间不能大于结束时间!");
            return;
        }
    }
    
    if(!exportExcelCheckMX()){
        return;
    }
    $("#queryTeacherForm").submit();
}

//津贴明细导出前校验
function exportExcelCheckMX() {
    var flag = false;
    var start_date = mini.get("start_date").getText();
    var end_date = mini.get("end_date").getText();
   
    $.ajax({
        type : 'POST',
        async : false,
        url : ctx + "/teacherManage/exportExcelCheckMX.do",
        data : {
            start_date:start_date,
            end_date:end_date
        },
        dataType : "json",
        success : function(data) {
            if(data.flag == "0"){
                flag = true;
            }else{
                mini.alert(data.msg);
            }
        },
        error : function(e) {
            mini.alert("系统异常,请稍后再试!");
        }
    });
    
    return flag;
}
 

Controller中代码:

/**
             * 讲师津贴明细报表导出前校验
             * @param trainee
             * @return
             * @throws ParseException
             */
            @RequestMapping(value = "/exportExcelCheckMX.do")
            public @ResponseBody ComResultDTO CReportExportExcelCheckMX(HttpServletRequest request,HttpSession session,PageDTO pageDTO){
                logger.info("============讲师津贴明细导出前校验============");
                TeacherManagerDto req = new TeacherManagerDto();
                String start_date = request.getParameter("start_date");
                String end_date = request.getParameter("end_date");
                req.setStart_date(start_date);
                req.setEnd_date(end_date);
                String manage_com =SessionUtil.getUser().getManageCom();
                req.setManage_com(manage_com);
                pageDTO.setParameters(req);
                
                int startNum = (pageDTO.getPageIndex()-1)*pageDTO.getPageSize();
                pageDTO.setStartNum(startNum);
                List<TeacherManagerDto> queryList = teacherManagerService.selectTeacherChargeByPageDTO(pageDTO);
                ComResultDTO comResultDTO = new ComResultDTO();
                if(queryList != null && queryList.size() > 50000){
                    comResultDTO.setFlag("1");
                    comResultDTO.setMsg("导出报表上限为50000条,数据量过大,导出失败!");
                    logger.info("============导出报表上限为50000条,数据量过大,导出失败!============");
                }else if(queryList != null && queryList.size() == 0){
                    comResultDTO.setFlag("1");
                    comResultDTO.setMsg("导出数据为空,导出失败!");
                    logger.info("============导出数据为空,导出失败!============");
                }else{
                    comResultDTO.setFlag("0");
                }
                return comResultDTO;
            }


service中代码:

@Override
    public List<TeacherManagerDto> selectTeacherChargeByPageDTO(PageDTO pageDTO) {
        
        return teacherManagerMapper.selectTeacherChargeByPageDTO(pageDTO);
        
    }

mapper.xml中代码:

<!-- 查询讲师报表导出数据 -->
   <select id="selectTeacherChargeByPageDTO" resultMap="teacherManage" parameterType="com.hualife.bit.util.PageDTO" >
           select 
               a.teacher_id,
               (select b.short_name from managecom_info b where b.manage_com=SUBSTRING(a.manage_com,1,4)) fen_gongsi,
                     (select b.short_name from managecom_info b where b.manage_com=SUBSTRING(a.manage_com,1,6)) zhong_zhi,
               (select b.manage_com from managecom_info b where b.manage_com=a.manage_com) manage_com,
               a.name,
               (select c.value from def_code_info c where c.code=a.if_employee and c.code_type='if_employee') if_employee,
               (select e.value from def_code_info e where e.code=a.teacher_type and e.code_type='teacher_type') teacher_type,
               (select e.value from def_code_info e where e.code=a.teacher_grade and e.code_type='teacher_grade') teacher_grade,
               DATE_FORMAT(a.created_time,'%Y-%m-%d %H:%i') created_time,
                            case when tc.charge_type='1' then IFNULL(SUM(tc.charge*tc.charge_total*tc.rate),0) end shou_ke,
                            case when tc.charge_type='2' then IFNULL(SUM(tc.charge*tc.charge_total*tc.rate),0) end yan_fa,
                            case when tc.charge_type='3' then IFNULL(SUM(tc.charge*tc.charge_total*tc.rate),0) end xiang_mu,
                            case when tc.charge_type='4' then IFNULL(SUM(tc.charge*tc.charge_total*tc.rate),0) end zhu_jiao,
                            IFNULL(SUM(tc.charge*tc.charge_total*tc.rate),0) zongji

       from teacher a LEFT JOIN teacher_charge tc on a.teacher_id=tc.teacher_id where a.created_time &gt;= #{parameters.start_date} and a.created_time &lt;= #{parameters.end_date} and a.manage_com like concat(#{parameters.manage_com},'%')  
GROUP BY a.teacher_id  
    
        limit #{startNum,jdbcType=DECIMAL},#{pageSize,jdbcType=DECIMAL}
   </select>
动态拼Excel表格样式的代码:

Controller中代码:

 /**
             * 讲师津贴明细报表导出功能
             * @param requestDTO
             * @param request
             * @param response
             * @throws Exception
             */
            @RequestMapping(value = "/exportMXExcel.do")
            public void CReportExportExcelMX(TeacherManagerDto requestDTO,HttpServletRequest request, 
                    HttpServletResponse response,PageDTO pageDTO)
                            throws Exception {
                String manage_com =SessionUtil.getUser().getManageCom();
                requestDTO.setManage_com(manage_com);
                pageDTO.setParameters(requestDTO);
                //封装搜索引擎参数
                //Map<String, Object> map = new HashMap<String, Object>();
                /*map =*/
                teacherChargeQueryService.reportExcelMX(request,response,pageDTO);
                /*ExcelView viewExcel = new ExcelView();
                HSSFWorkbook arg1= new HSSFWorkbook();
                viewExcel.buildExcelDocument1(map, arg1, request, response);*/
            }
 

Service中代码:

public Map<String, Object> reportExcelMX(HttpServletRequest request, HttpServletResponse response,PageDTO pageDTO) throws Exception {
        
        
    
        // 表头
        //String[] tableHeader = {  "分公司", "中支", "构编编码", "姓名", "人员类别(前线、后线)","讲师类别(专职讲师、督训、兼职讲师)","岗位职级 (xx级督训)", "研发津贴",
        //        "授课津贴","助教津贴","项目津贴","金额合计"};
        
        // 表名
        //String tableName = "讲师津贴明细报表";
        //Map<String, Object> map = new HashMap<String, Object>();
        //map.put("teacherList", teacherList);
        //map.put("tableHeader", tableHeader);
        //map.put("tableName", tableName);
        //return map;
        
        String filename = "TeacherCharge";

        // 获得输出流,该输出流的输出介质是客户端浏览器

        OutputStream output = response.getOutputStream();

        response.reset();

        response.setHeader("Content-disposition", "attachment;filename=" + filename + ".xls");

        response.setContentType("application/msexcel");

        // 创建可写入的Excel工作薄,且内容将写入到输出流,并通过输出流输出给客户端浏览

        WritableWorkbook wk = Workbook.createWorkbook(output);

        /// 创建可写入的Excel工作表

        WritableSheet sheet = wk.createSheet("讲师津贴明细报表", 0);
        sheet.setColumnView(0, 10);
        sheet.setColumnView(1, 15);
        sheet.setColumnView(2, 20);
        sheet.setColumnView(3, 13);
        sheet.setColumnView(4, 13);
        sheet.setColumnView(5, 15);
        sheet.setColumnView(6, 15);
        sheet.setColumnView(7, 15);
        sheet.setColumnView(8, 15);
        sheet.setColumnView(9, 15);
        sheet.setColumnView(10, 15);
        sheet.setColumnView(11, 15);
        sheet.setColumnView(12, 15);
        sheet.setColumnView(13, 15);
        sheet.setColumnView(14, 15);
        sheet.setColumnView(15, 15);
        sheet.setColumnView(16, 15);

        // 把单元格(column, row)到单元格(column1, row1)进行合并。

        // mergeCells(column, row, column1, row1);

        //sheet.mergeCells(0, 0, 5, 0);// 单元格合并方法
        

        // 创建WritableFont 字体对象,参数依次表示黑体、字号12、粗体、非斜体、不带下划线、亮蓝色
        WritableFont titleFont0 = new WritableFont(WritableFont.createFont("宋体"), 18, WritableFont.BOLD, false,
                UnderlineStyle.NO_UNDERLINE, Colour.BLACK);

        WritableFont titleFont1 = new WritableFont(WritableFont.createFont("宋体"), 12, WritableFont.BOLD, false,
                UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
        WritableFont titleFont2 = new WritableFont(WritableFont.createFont("宋体"), 11, WritableFont.NO_BOLD, false,
                UnderlineStyle.NO_UNDERLINE, Colour.BLACK);

        // 创建WritableCellFormat对象,将该对象应用于单元格从而设置单元格的样式

        WritableCellFormat titleFormat0 = new WritableCellFormat();
        titleFormat0.setFont(titleFont0);
        titleFormat0.setAlignment(Alignment.CENTRE);
        titleFormat0.setVerticalAlignment(VerticalAlignment.CENTRE);
        titleFormat0.setBorder(Border.ALL, BorderLineStyle.THIN);
        titleFormat0.setWrap(true);

        WritableCellFormat titleFormat1 = new WritableCellFormat();

        // 设置字体格式

        titleFormat1.setFont(titleFont1);

        // 设置文本水平居中对齐

        titleFormat1.setAlignment(Alignment.CENTRE);

        // 设置文本垂直居中对齐

        titleFormat1.setVerticalAlignment(VerticalAlignment.CENTRE);

        // 设置背景颜色

        titleFormat1.setBackground(Colour.YELLOW);
        titleFormat1.setBorder(Border.ALL, BorderLineStyle.THIN);
        // 设置自动换行
        titleFormat1.setWrap(true);

        WritableCellFormat titleFormat2 = new WritableCellFormat();
        titleFormat2.setFont(titleFont2);
        titleFormat2.setAlignment(Alignment.CENTRE);
        titleFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);
        titleFormat2.setWrap(true);
        titleFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);

        /*ClassInfo classInfo = classInfoMapper.selectByPrimaryKey(Long.valueOf(class_id));
        List<TraineeSignInfo> signlist = classInfoHelperMapper.querySignInTraineeInfoByClassId(Long.valueOf(class_id));*/
        //String[] tableHeader = {  "分公司", "中支", "机构编码", "姓名", "人员类别(前线、后线)","讲师类别(专职讲师、督训、兼职讲师)",
        //"岗位职级 (xx级督训)", "研发津贴",
                //        "授课津贴","助教津贴","项目津贴","金额合计"};
        //sheet.addCell(new Label(0, 0, "讲师津贴明细报表", titleFormat0));
        sheet.addCell(new Label(0, 0, "序号", titleFormat1));
        sheet.addCell(new Label(1, 0, "分公司", titleFormat1));
        sheet.addCell(new Label(2, 0, "中支", titleFormat1));
        sheet.addCell(new Label(3, 0, "机构编码", titleFormat1));
        sheet.addCell(new Label(4, 0, "姓名", titleFormat1));
        sheet.addCell(new Label(5, 0, "人员类别(前线、后线)", titleFormat1));
        sheet.addCell(new Label(6, 0, "讲师类别(专职讲师、督训、兼职讲师)", titleFormat1));
        sheet.addCell(new Label(7, 0, "岗位职级 (xx级督训)", titleFormat1));
        sheet.mergeCells(8, 0, 9, 0);// 单元格合并方法
        sheet.addCell(new Label(8, 0, "研发津贴", titleFormat1));
        /*sheet.addCell(new Label(9, 1, "研发津贴", titleFormat1));*/
        sheet.mergeCells(10, 0, 11, 0);
        sheet.addCell(new Label(10, 0, "授课津贴", titleFormat1));
        /*sheet.addCell(new Label(11, 1, "授课津贴", titleFormat1));*/
        sheet.mergeCells(12, 0, 13, 0);
        sheet.addCell(new Label(12, 0, "助教津贴", titleFormat1));
        /*sheet.addCell(new Label(13, 1, "助教津贴", titleFormat1));*/
        sheet.mergeCells(14, 0, 15, 0);
        sheet.addCell(new Label(14, 0, "项目津贴", titleFormat1));
        /*sheet.addCell(new Label(15, 1, "项目津贴", titleFormat1));*/
        /*sheet.addCell(new Label(16, 1, "金额合计", titleFormat1));*/
        sheet.addCell(new Label(16, 0, "金额合计", titleFormat1));
        
        sheet.addCell(new Label(8, 1, "项目", titleFormat1));
        sheet.addCell(new Label(9, 1, "金额", titleFormat1));
        sheet.addCell(new Label(10, 1, "项目", titleFormat1));
        sheet.addCell(new Label(11, 1, "金额", titleFormat1));
        sheet.addCell(new Label(12, 1, "项目", titleFormat1));
        sheet.addCell(new Label(13, 1, "金额", titleFormat1));
        sheet.addCell(new Label(14, 1, "项目", titleFormat1));
        sheet.addCell(new Label(15, 1, "金额", titleFormat1));
        
        sheet.mergeCells(0, 0, 0, 1);
        sheet.mergeCells(1, 0, 1, 1);
        sheet.mergeCells(2, 0, 2, 1);
        sheet.mergeCells(3, 0, 3, 1);
        sheet.mergeCells(4, 0, 4, 1);
        sheet.mergeCells(5, 0, 5, 1);
        sheet.mergeCells(6, 0, 6, 1);
        sheet.mergeCells(7, 0, 7, 1);
        sheet.mergeCells(16, 0, 16, 1);
        
        List<TeacherManagerDto> teacherList = TeacherManagerMapper.selectTeacherChargeByPageDTO(pageDTO);
        
        if(teacherList.size()!=0){
            int flag2 = 0 ;
            for (int i = 0; i < teacherList.size(); i++) {

                int flag1 = 0 ;
                Long teacher_id =teacherList.get(i).getTeacher_id();
                
                
                List<TeacherChargeDto> list1 =TeacherManagerMapper.selectChargeType1(teacher_id);
                for (int j = 0; j < list1.size(); j++) {
                    sheet.addCell(new Label(8, 2 + j+flag2, list1.get(j).getCourse_name(), titleFormat2));
                    sheet.addCell(new Label(9, 2 + j+flag2, list1.get(j).getJin_e(), titleFormat2));
                }
                
                    flag1=list1.size();
                
                
                List<TeacherChargeDto> list2 =TeacherManagerMapper.selectChargeType2(teacher_id);
                for (int j = 0; j < list2.size(); j++) {
                    
                    sheet.addCell(new Label(10, 2 + j+flag2, list2.get(j).getCourse_name(), titleFormat2));
                    sheet.addCell(new Label(11, 2 + j+flag2, list2.get(j).getJin_e(), titleFormat2));
                }
                if(list2.size() > flag1){
                    flag1=list2.size();
                }
                
                List<TeacherChargeDto> list3 =TeacherManagerMapper.selectChargeType3(teacher_id);
                for (int j = 0; j < list3.size(); j++) {
                    sheet.addCell(new Label(12, 2 + j+flag2, list3.get(j).getCourse_name(), titleFormat2));
                    sheet.addCell(new Label(13, 2 + j+flag2, list3.get(j).getJin_e(), titleFormat2));
                }
            

           if(list3.size() >flag1 ){
                    flag1=list3.size();
                }
                
                List<TeacherChargeDto> list4 =TeacherManagerMapper.selectChargeType2(teacher_id);
                for (int j = 0; j < list4.size(); j++) {
                    
                    sheet.addCell(new Label(14, 2 + j+flag2, list4.get(j).getCourse_name(), titleFormat2));
                    sheet.addCell(new Label(15, 2 + j+flag2, list4.get(j).getJin_e(), titleFormat2));
                }
                if(list4.size() > flag1){
                    flag1=list4.size();
                }
                sheet.mergeCells(0,2+flag2+i, 0, 2+flag2+flag1-1+i);
                sheet.mergeCells(1,2+flag2+i, 1, 2+flag2+flag1-1+i);
                sheet.mergeCells(2,2+flag2+i, 2, 2+flag2+flag1-1+i);
                sheet.mergeCells(3,2+flag2+i, 3, 2+flag2+flag1-1+i);
                sheet.mergeCells(4,2+flag2+i, 4, 2+flag2+flag1-1+i);
                sheet.mergeCells(5,2+flag2+i, 5, 2+flag2+flag1-1+i);
                sheet.mergeCells(6,2+flag2+i, 6, 2+flag2+flag1-1+i);
                sheet.mergeCells(7,2+flag2+i, 7, 2+flag2+flag1-1+i);
                sheet.mergeCells(16,2+flag2+i,16, 2+flag2+flag1-1+i);
                
                sheet.addCell(new Label(0, 2+flag2, String.valueOf(i + 1), titleFormat2));
                sheet.addCell(new Label(1, 2+flag2, teacherList.get(i).getFen_gongsi(), titleFormat2));
                sheet.addCell(new Label(2, 2+flag2, teacherList.get(i).getZhong_zhi(), titleFormat2));
                sheet.addCell(new Label(3, 2+flag2, teacherList.get(i).getManage_com(), titleFormat2));
                sheet.addCell(new Label(4, 2+flag2, teacherList.get(i).getName(), titleFormat2));
                sheet.addCell(new Label(5, 2+flag2, teacherList.get(i).getIf_employee(), titleFormat2));
                sheet.addCell(new Label(6, 2+flag2, teacherList.get(i).getTeacher_type(), titleFormat2));
                sheet.addCell(new Label(7, 2+flag2, teacherList.get(i).getTeacher_grade(), titleFormat2));
                sheet.addCell(new Label(16,2+flag2, teacherList.get(i).getZongji(), titleFormat2));
                flag2=flag2+(flag1==0?1:flag1);
            }
            
            
        }


        // 添加Label对象,参数依次表示在第一列,第一行,内容,使用的格式

        // Label lab_00=new Label(0,0,"学员考试成绩一览表",titleFormat1);

        // 将定义好的Label对象添加到工作表上,这样工作表的第一列第一行的内容为‘学员考试成绩一览表’并应用了titleFormat定义的样式

        // sheet.addCell(lab_00);
        //
        // WritableCellFormat cloumnTitleFormat=new WritableCellFormat();
        //
        // cloumnTitleFormat.setFont(new
        // WritableFont(WritableFont.createFont("宋体"),10,WritableFont.BOLD,false));
        //
        // cloumnTitleFormat.setAlignment(Alignment.CENTRE);
        //
        // Label lab_01=new Label(0,1,"姓名",cloumnTitleFormat);
        //
        // Label lab_11=new Label(1,1,"班级",cloumnTitleFormat);
        //
        // Label lab_21=new Label(2,1,"笔试成绩",cloumnTitleFormat);
        //
        // Label lab_31=new Label(3,1,"上机成绩",cloumnTitleFormat);
        //
        // Label lab_41=new Label(4,1,"考试日期",cloumnTitleFormat);
        //
        // sheet.addCell(lab_01);
        //
        // sheet.addCell(lab_11);
        //
        // sheet.addCell(lab_21);
        //
        // sheet.addCell(lab_31);
        //
        // sheet.addCell(lab_41);
        //
        // sheet.addCell(new Label(0,2,"李明"));
        //
        // sheet.addCell(new Label(1,2,"As178"));

        // 定义数字格式

        // NumberFormat nf=new NumberFormat("0.00");
        //
        // WritableCellFormat wcf=new WritableCellFormat(nf);

        // 类似于Label对象,区别Label表示文本数据,Number表示数值型数据

        // Number numlab_22=new Number(2,2,78,wcf);
        //
        // sheet.addCell(numlab_22);
        //
        // sheet.addCell(newNumber(3,2,87,new WritableCellFormat(new
        // NumberFormat("#.##") )));

        // 定义日期格式
        //
        // DateFormat df=new DateFormat("yyyy-MM-dd hh:mm:ss");

        // 创建WritableCellFormat对象

        // WritableCellFormat datewcf=new WritableCellFormat(df);

        // 类似于Label对象,区别Label表示文本数据,DateTime表示日期型数据

        // DateTime dtLab_42=new DateTime(4,2,new Date(),datewcf);
        //
        // sheet.addCell(dtLab_42);

        // 将定义的工作表输出到之前指定的介质中(这里是客户端浏览器)

        wk.write();

        // 操作完成时,关闭对象,释放占用的内存空间

        wk.close();
        // 加下划线这部分代码是B/S模式中采用的输出方式,而不是输出到本地指定的磁盘目录。该代码表示将temp.xls的Excel文件通过应答实体(response)输出给请求的客户端浏览器,下载到客户端本地(保存或直接打开)。若要直接输出到磁盘文件可采用下列代码替换加下划线这部分代码
        // File file=new File("D://temp.xls");
        // WritableWorkbook wwb = Workbook.createWorkbook(file);

        return null;

    }
四个红色下划线需要的SQL语句查询:

<!-- 查询讲师报表导出数据 -->
   <select id="selectTeacherChargeByPageDTO" resultMap="teacherManage" parameterType="com.hualife.bit.util.PageDTO" >
           select 
               a.teacher_id,
               (select b.short_name from managecom_info b where b.manage_com=SUBSTRING(a.manage_com,1,4)) fen_gongsi,
                     (select b.short_name from managecom_info b where b.manage_com=SUBSTRING(a.manage_com,1,6)) zhong_zhi,
               (select b.manage_com from managecom_info b where b.manage_com=a.manage_com) manage_com,
               a.name,
               (select c.value from def_code_info c where c.code=a.if_employee and c.code_type='if_employee') if_employee,
               (select e.value from def_code_info e where e.code=a.teacher_type and e.code_type='teacher_type') teacher_type,
               (select e.value from def_code_info e where e.code=a.teacher_grade and e.code_type='teacher_grade') teacher_grade,
               DATE_FORMAT(a.created_time,'%Y-%m-%d %H:%i') created_time,
                            case when tc.charge_type='1' then IFNULL(SUM(tc.charge*tc.charge_total*tc.rate),0) end shou_ke,
                            case when tc.charge_type='2' then IFNULL(SUM(tc.charge*tc.charge_total*tc.rate),0) end yan_fa,
                            case when tc.charge_type='3' then IFNULL(SUM(tc.charge*tc.charge_total*tc.rate),0) end xiang_mu,
                            case when tc.charge_type='4' then IFNULL(SUM(tc.charge*tc.charge_total*tc.rate),0) end zhu_jiao,
                            IFNULL(SUM(tc.charge*tc.charge_total*tc.rate),0) zongji

       from teacher a LEFT JOIN teacher_charge tc on a.teacher_id=tc.teacher_id where a.created_time &gt;= #{parameters.start_date} and a.created_time &lt;= #{parameters.end_date} and a.manage_com like concat(#{parameters.manage_com},'%')  
GROUP BY a.teacher_id  
    
        limit #{startNum,jdbcType=DECIMAL},#{pageSize,jdbcType=DECIMAL}
   </select>
  <!-- 查询讲师津贴详细信息报表导出 -->
   <select id="selectChargeType1" resultMap="teacherCharge" parameterType="java.lang.Long" >
 select 
 a.id,
(select course_name from class_course c where a.course_id = c.course_id )course_name,
IFNULL(SUM(a.charge*a.charge_total*a.rate),0) jin_e
from teacher_charge a where a.teacher_id = #{parameters.teacher_id} and a.charge_type = '1'
GROUP BY a.id 
   </select>
   
   <select id="selectChargeType2" resultMap="teacherCharge" parameterType="java.lang.Long" >
select 
 a.id,
(select class_name from class_info c where a.class_id = c.class_id )course_name,
IFNULL(SUM(a.charge*a.charge_total*a.rate),0) jin_e
from teacher_charge a where a.teacher_id = #{parameters.teacher_id} and a.charge_type = '2'
GROUP BY a.id 
   </select>
   
   <select id="selectChargeType3" resultMap="teacherCharge" parameterType="java.lang.Long" >
select 
 a.id,
(select project_name from project_manage c where a.project_id = c.project_id )course_name,
IFNULL(SUM(a.charge*a.charge_total*a.rate),0) jin_e
from teacher_charge a where a.teacher_id = #{parameters.teacher_id} and a.charge_type = '3'
GROUP BY a.id 
   </select>

 

 

 


 

J2EE项目开发Excel导入导出操作组件源代码(附带说明文档) J2EE项目开发Excel数据导入导出操作组件源代码(附带说明文档),非常实用! 立即下载

相关推荐

Unity四部曲(核心)

需要先改成Cube复杂的展开留到unity进阶再说。

ultraman1234566的博客 2797

别再手动调Excel格式了!用EasyExcel 3.x的模板填充,5分钟搞定复杂报表导出

本文介绍了如何使用EasyExcel 3.x的模板填充功能快速生成复杂Excel报表,告别手动调整格式的烦恼。通过模板设计、数据绑定和执行导出三个步骤,开发者可以轻松实现多级表头、合并单元格和动态统计等复杂需求,大幅提升工作效率。

weixin_33692284的博客 1626

告别VBA!用Python+PyWin32自动化你的SolidWorks建模流程(附完整代码)

本文详细介绍了如何利用Python和PyWin32实现SolidWorks建模流程的自动化,替代传统的VBA宏开发。通过环境配置、宏代码转换、高级开发模式及工程化实践等实战内容,帮助机械设计师构建高效、可维护的自动化工作流,显著提升设计效率。

weixin_30485379的博客 367

CXF框架利用poi导出excel

在此记下此笔记,以便自己以后忘了重新学习使用,也希望能帮到大家,怎么配置使用的我就不解释了,在此仅向大家演示如何导出在此框架下如何导出excel,导出excel是大家常用的功能,希望能帮到大家。 如果没有poi的jar包,请先下载jar包   废话不多说,直接上代码: -------------------------------------------------------------...

七星程序员的博客 1463

2026 年第十六届MathorCup数学应用挑战赛题目C题中老年人群高血脂症的风险预警及干预方案优化 2026妈妈杯 详细思路、代码、模型

2026 年第十六届MathorCup数学应用挑战赛题目 C题中老年人群高血脂症的风险预警及干预方案优化 人口老龄化进程的持续加快,使得40岁及以上中老年人群成为 慢性病防控的核心群体,其中高血脂症的发病率呈逐年攀升态势, 已成为诱发冠心病、脑梗死等心脑血管疾病的重要危险因素,严重 威胁中老年群体的心血管健康与生活质量,也加重了基层医疗的慢 病管理负担。从中医体质学视角来看,体质禀赋与偏颇是疾病发生 发展的内在根基,其中痰湿体质为中老年高血脂症的高发体质类型, 该体质人群存在痰湿内蕴、脾胃运化失常、水湿代谢

YOLO 756

ROS入门教程(四)—— URDF文件与导出

本文将介绍如何在ROS中描述我们的机器人。

吾门的博客 8187

EasyExcle导出动态列 + 合并单元格

easyExcle 导出 动态列 合并单元格

XiaoSongQian的博客 1533

【控制模块算法】控制理论的进修之路

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、(经典)自动控制理论【本科阶段】二、现代控制理论【本科阶段】三、最优控制理论【硕士阶段】总结 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对对控制理论的理解做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 一、(经典)自动控制理论【本科阶段】 一般控制工程、自动化相关的考研专业课就是自动

qq_35635374的博客 1450

java---实现导出excel文件及自定义选择路径

废话不多说,直接上代码---------&gt; public void export( HttpServletResponse res) throws IOException { // 创建HSSFWorkbook对象(excel的文档对象) HSSFWorkbook wb = new HSSFWorkbook(); // 建立新的sheet对象(excel的表单) HSSFSh...

wy123123000的博客 2万+

innovus:NRDB-2276 special net route layer与NanoRouteMode route layer冲突问题解决方法

NanoRouteMode中设置绕线层次2-6,但是被动到的special net有8-11的preferred route layer,这个层次可能是create_route_type+set_ccopt_property -net_type 定义的。二者绕线层次范围有冲突,导致在调整过这条net后再绕线就会提示失败。然后再下route_design 等route命令去绕别的net。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1105

把 ST03 的历史数据留得更久:ABAP Workload 统计保留期设置、原理与落地避坑指南

SAP ST03性能数据保留期配置指南 ST03/ST03N是SAP系统性能分析的核心工具,但默认数据保留期通常较短(3个月左右),难以满足跨季度对比、年度规划等需求。本文详细解析了ST03数据保留期的配置方法及注意事项: 数据存储机制:性能数据存储在监控库中,通过定期重组作业清理过期数据 配置路径:7.0+系统在"Workload Collector Database→Reorganization→Control"中按Profile分别设置 关键限制:保留期最大值建议不超过99,否则可

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 219

导出时合并单元格

首先需要导出的页面是这样,涉及到合并单元格的操作 调用合并单元格需要的参数说明 String fileName = "调休统计表"; String[] head0=new String[] {"姓名","值班类型","工作日夜班","工作日夜班","周末公休日和法定节假日","周末公休日和法定节假日","合计补休(天)"}; String[] headnum0 = new String[] { "1,2,0,0", "1,2,1,1", "1,1,2,3",

hello_xing的博客 901

DeepSeek Harness 工程实践与高级特性:从测试到安全的完整指南

AI Agent 能执行命令、读写文件、自主决策,能力越强风险越大——删文件、泄密钥、死循环、竞态条件随时可能发生。本文是 DeepSeek Harness 系列第三篇,深入剖析其工程实践与高级特性:从单元测试到真实 API 冒烟测试的分层策略,拒绝 Mock 依赖、坚持"验证世界而非自我报告";从正交结果、规范化契约到 Dispose 静止的防御式编程铁律;以及跨平台多层进程沙箱、文件系统版本守卫、fail-closed 审批机制、模型编写的工作流引擎与上下文压缩等高级能力。

program哲学 208

手把手教你用Excel画模板:SpringBoot项目如何优雅导出带合并单元格和冻结表头的复杂报表

本文详细介绍了SpringBoot项目中如何利用Excel模板和FreeMarker模板引擎优雅导出复杂报表,包括合并单元格、冻结表头等高级功能。通过可视化设计Excel模板并转换为XML格式,结合FreeMarker动态填充数据,大幅提升开发效率和维护便捷性,特别适合企业级报表导出需求。

weixin_30576827的博客 471

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java 导出 Excel 利器:JXLS

标注:简单的excel格式,用简单的poi,easyExcel等工具都能导出。Area是jXLS中的一个主要概念,它本质上代表了一个矩形区域,这个区域包含了需要进行数据转换的单元格。每个Area可以包含一组转换命令和一组嵌套的子区域,这些子区域也是Area,它们有自己的命令和子区域。符号中,比如我们需要把数据输出的同时进行计算,比如我们数据中的比率值是1(excel上最终需要显示为1%)。通过在Excel模板中使用类似jsp的标签,jXls提供了极高的灵活性,可以轻松地生成各种格式的报表。

ung3063com的博客 372

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SpringBoot+EasyPOI实战:3种企业级Excel导出方案对比(含完整代码)

本文深度解析了SpringBoot集成EasyPOI实现企业级Excel导出的三种核心方案:纵向合并单元格、二级表头和动态导出。通过对比各方案的原理、适用场景与代码实践,为开发者提供了清晰的选型指南,帮助应对复杂报表导出需求,提升开发效率与系统可维护性。

potato的博客 640

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C# WinForm开发系列 - Crystal Report水晶报表

转自:ttp://www.cnblogs.com/peterzb/archive/2009/07/11/1521325.html 水晶报表(Crystal Report)是业内最专业、功能最强的报表系统,它除了强大的报表功能外,最大的优势是实现了与绝大多数流行开发工具的集成和接口。 在VS.Net平台做过报表开发的程序员,一定都对水晶报表强大、高效、集成等特性留下了深刻印象。 除了开发新程序外

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 1510

C# WinForm开发系列 - Crystal Report

水晶报表(Crystal Report)是业内最专业、功能最强的报表系统,它除了强大的报表功能外,最大的优势是实现了与绝大多数流行开发工具的集成和接口。在VS.Net平台做过报表开发的程序员,一定都对水晶报表强大、高效、集成等特性留下了深刻印象。 除了开发新程序外,在工作中我们常需要接触到很多较早的软件系统报表功能升级的需求,如果能结合水晶报表这一强大的工具,往往能事半功倍。 01. .NET ...

weixin_33918114的博客 150

Python自动化Excel合并单元格填充与导出实战指南

在数据处理与报表自动化领域,Excel合并单元格是常见的格式需求,但其底层实现逻辑与程序处理方式存在显著差异。合并单元格在Excel内部仅由主单元格存储数据,其他单元格逻辑上为空,这导致自动化填充时数据易丢失或格式错乱。理解这一原理是解决技术痛点的关键。通过Python的openpyxl库进行精细的单元格坐标控制,结合pandas高效处理数据,可以构建健壮的自动化解决方案。该技术能显著提升财务报表、人员花名册等场景的报表生成效率与准确性。本文针对python处理excel合并单元格和el-table合并单元

weixin_30536861的博客 271

EasyPoi导出包含动态列的Excel

@Test     public void dynaCol() { try { List&lt;ExcelExportEntity&gt; colList = new ArrayList&lt;ExcelExportEntity&gt;(); ExcelExportEntity colEntity = new ExcelExp...

1万+

使用 easypoi 导出 excel 实现动态列,完美解决!

大家好。说明使用的是easypoi进行导出行头是动态生成依据key进行列匹配,进行数据填充第一列进行纵向动态合并自己的一个使用,记录一下工具依赖<dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId...

java思维导图 1729

别再手动拼接Excel了!用Easypoi的模板导出,5分钟搞定SpringBoot报表下载

本文介绍了如何使用EasyPOI模板导出功能在SpringBoot中快速实现Excel报表下载,告别手动拼接单元格的繁琐操作。通过模板设计、数据填充和导出控制器的三步流程,开发者可以高效生成复杂样式的报表,大幅提升开发效率和维护便捷性。

weixin_30376509的博客 431

〔十二〕Excel报表一键导出:openpyxl全攻略(基于真实项目)

本文介绍了使用 Python 的 openpyxl 库生成复杂格式 Excel 报表的实现方法,主要面向 Django 项目中的报表导出需求。文章重点讲解了两种业务报表(机构设置表和信息统计表)的实现方案,详细说明了 openpyxl 的核心概念、样式设置(字体、对齐、边框、填充)、合并单元格、动态标题、行列尺寸调整等关键技术点,并分享了跨模块数据统计的实现技巧。文中包含大量实际项目中的代码示例和详细注释,适合需要实现专业 Excel 导出的开发者参考学习。

binghetianxia的博客 983

ejsExcel:Node.js Excel模板引擎终极指南 - 快速生成动态报表的10个技巧

想要在Node.js项目中快速生成复杂的Excel报表吗?ejsExcel作为一款强大的Node.js Excel模板引擎,让动态报表生成变得简单高效!🚀 无论你是需要生成财务报表、数据导出还是业务报表,ejsExcel都能帮你轻松搞定。这个智能报表系统基于ejs语法,支持丰富的模板功能,是Node.js开发者处理Excel报表的终极解决方案。 ## 📊 为什么选择ejsExcel模板引擎?

gitblog_00642的博客 591
上一篇: java中判断四个String类型的数据不能同时都为空,或者不能只有其中一个字段,StringUtils的isBlank()方法
下一篇: mybatis中sql语句中类似于大于号等特殊符号转义
不修电脑的程序员
博客等级 码龄9年 47粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值