首页 web前端 js教程 多种情况合并单元格的方法讲解

多种情况合并单元格的方法讲解

Jul 19, 2017 pm 04:52 PM
datatables 单元格

直接上代码,原理之前的随笔已经讲过了。

1.先看看效果

 

 

2.html代码,含js代码

cpm system
登录后复制
<div>
    <a href="/home/export">导出</a>
</div>
登录后复制
地区公司部门员工姓名
登录后复制

 

3.后台代码

3.1 分页参数对象

package com.xincheng.cpm.common;/**
 * Created by hdwang on 2017/6/22.
 * 分页参数 */public class PageParam {/** * 第几次绘画(前端标识)     */private int draw;/** * 起始记录(从0开始),mysql也是从0开始,吻合,good!     */private int start;/** * 页大小     */private int length;public int getDraw() {return draw;
    }public void setDraw(int draw) {this.draw = draw;
    }public int getStart() {return start;
    }public void setStart(int start) {this.start = start;
    }public int getLength() {return length;
    }public void setLength(int length) {this.length = length;
    }/** * 第几页(0-n)     */public int getPage(){return this.start/this.length;
    }
}
登录后复制

 

3.2 数据返回对象

package com.xincheng.cpm.common;import java.util.List;/**
 * Created by hdwang on 2017/6/22.
 * 表格数据(datatables) */public class TableData<T> {/** * 第几次绘画(前端标识)     */private int draw;/** * 行过滤(不知道干嘛的)     */private int recordsFiltered;/** * 总行数     */private int recordsTotal;/** * 行数据     */private List<T> data;/** * 起始记录(用于前端初始化序列号用的)     */private int start;/** *  错误信息     */private String error;public int getDraw() {return draw;
    }public void setDraw(int draw) {this.draw = draw;
    }public int getRecordsFiltered() {return recordsFiltered;
    }public void setRecordsFiltered(int recordsFiltered) {this.recordsFiltered = recordsFiltered;
    }public int getRecordsTotal() {return recordsTotal;
    }public void setRecordsTotal(int recordsTotal) {this.recordsTotal = recordsTotal;
    }public List<T> getData() {return data;
    }public void setData(List<T> data) {this.data = data;
    }public int getStart() {return start;
    }public void setStart(int start) {this.start = start;
    }public String getError() {return error;
    }public void setError(String error) {this.error = error;
    }
}
登录后复制

 

 3.3 数据实体对象

package com.xincheng.cpm.common;import java.io.Serializable;/**
 * Created by hdwang on 2017/7/14. */public class Member{private String area;private String company;private String department;private String userName;private Integer areaRowSpan;private Integer companyRowSpan;private Integer departmentRowSpan;public Member(String area,String company,String department,String userName){this.area = area;this.company = company;this.department = department;this.userName = userName;
    }public String getArea() {return area;
    }public void setArea(String area) {this.area = area;
    }public String getCompany() {return company;
    }public void setCompany(String company) {this.company = company;
    }public String getDepartment() {return department;
    }public void setDepartment(String department) {this.department = department;
    }public String getUserName() {return userName;
    }public void setUserName(String userName) {this.userName = userName;
    }public Integer getAreaRowSpan() {return areaRowSpan;
    }public void setAreaRowSpan(Integer areaRowSpan) {this.areaRowSpan = areaRowSpan;
    }public Integer getCompanyRowSpan() {return companyRowSpan;
    }public void setCompanyRowSpan(Integer companyRowSpan) {this.companyRowSpan = companyRowSpan;
    }public Integer getDepartmentRowSpan() {return departmentRowSpan;
    }public void setDepartmentRowSpan(Integer departmentRowSpan) {this.departmentRowSpan = departmentRowSpan;
    }
}
登录后复制

 

3.4 导出相关类

package com.xincheng.cpm.common;/**
 * Created by hdwang on 2017/7/14. */public class ExcelData {private String value;//单元格的值private int colSpan = 1;//单元格跨几列private int rowSpan = 1;//单元格跨几行private boolean alignCenter;//单元格是否居中,默认不居中,如果选择是,则水平和上下都居中public boolean isAlignCenter() {return alignCenter;
    }public void setAlignCenter(boolean alignCenter) {this.alignCenter = alignCenter;
    }public String getValue() {return value;
    }public void setValue(String value) {this.value = value;
    }public int getColSpan() {return colSpan;
    }public void setColSpan(int colSpan) {this.colSpan = colSpan;
    }public int getRowSpan() {return rowSpan;
    }public void setRowSpan(int rowSpan) {this.rowSpan = rowSpan;
    }
}
登录后复制
package com.xincheng.cpm.common;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.CellStyle;import org.apache.poi.ss.util.CellRangeAddress;import org.apache.poi.xssf.usermodel.XSSFFont;import org.apache.poi.xssf.usermodel.XSSFRow;import org.apache.poi.xssf.usermodel.XSSFSheet;import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.util.List;/**
 * Created by hdwang on 2017/7/14. */public class ExcelUtil {/** * 生成excel工作簿
     * @param sheetTitle sheet名称
     * @param titles 标题
     * @param rows 行数据
     * @return 工作簿     */public XSSFWorkbook execute(String sheetTitle,String[] titles,List<List<ExcelData>> rows) {//定义工作簿XSSFWorkbook workbook = new XSSFWorkbook();//th样式CellStyle titleStyle = workbook.createCellStyle();
        titleStyle.setBorderBottom((short) 1);
        titleStyle.setBorderRight((short)1);
        titleStyle.setBorderLeft((short)1);
        titleStyle.setBorderTop((short)1);
        titleStyle.setVerticalAlignment((short)1);
        titleStyle.setAlignment((short)2);
        XSSFFont font = workbook.createFont();
        font.setBold(true);
        titleStyle.setFont(font);//td样式CellStyle style = workbook.createCellStyle();
        style.setBorderBottom((short)1);
        style.setBorderRight((short)1);
        style.setBorderLeft((short)1);
        style.setBorderTop((short)1);
        style.setVerticalAlignment((short)1);//创建工作表XSSFSheet sheet = workbook.createSheet(sheetTitle);
        sheet.setDefaultRowHeightInPoints(20.0F);//创建标题行XSSFRow titleRow = sheet.createRow(0);for(int col=0;col<titles.length;col++) { //遍历列Cell cell = titleRow.createCell(col);
            cell.setCellStyle(titleStyle);
            cell.setCellValue(titles[col]);for(int row=0;row<rows.size();row++){ //遍历行int rowIndex = row+1;
                XSSFRow contentRow = sheet.getRow(rowIndex);if(contentRow == null){
                    contentRow = sheet.createRow(rowIndex);
                }
                ExcelData data = rows.get(row).get(col);
                Cell contentRowCell = contentRow.createCell(col);
                contentRowCell.setCellStyle(style);
                contentRowCell.setCellValue(data.getValue());//合并单元格if (data.getColSpan() > 1 || data.getRowSpan() > 1) {
                    CellRangeAddress cra = new CellRangeAddress(rowIndex, rowIndex + data.getRowSpan() - 1, col, col + data.getColSpan() - 1);
                    sheet.addMergedRegion(cra);
                }
            }
        }return workbook;
    }
}
登录后复制

 

 

3.5 controller层

package com.xincheng.cpm.controller;import com.chenrd.common.excel.ExportExcel;import com.xincheng.cpm.common.*;import com.xincheng.cpm.entity.cpm.User;import com.xincheng.cpm.service.UserService;import com.xincheng.cpm.vo.IncomeDailyVO;import org.apache.commons.lang3.StringUtils;import org.apache.poi.xssf.usermodel.XSSFWorkbook;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.domain.Page;import org.springframework.data.domain.PageImpl;import org.springframework.data.domain.PageRequest;import org.springframework.data.domain.Pageable;import org.springframework.stereotype.Controller;import org.springframework.ui.ModelMap;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;import java.io.OutputStream;import java.net.URLEncoder;import java.util.*;/**
 * Created by hdwang on 2017/6/19. */@Controller
@RequestMapping("/home")public class HomeController {

    @Autowired
    UserService userService;

    @RequestMapping("")public String index(HttpSession session, ModelMap map, HttpServletRequest request){
        User user = (User) session.getAttribute("user");
        map.put("user",user);return "home";
    }


    @RequestMapping(value="/query",method= RequestMethod.POST)
    @ResponseBodypublic TableData<Member> getUserByPage(PageParam pageParam, User user){
        Page<Member> userPage = this.getMembers(pageParam);
        TableData<Member> datas = new TableData<>();
        datas.setDraw(pageParam.getDraw());
        datas.setStart(pageParam.getStart());
        datas.setData(userPage.getContent());
        datas.setRecordsFiltered((int)userPage.getTotalElements());
        datas.setRecordsTotal((int)userPage.getTotalElements());return datas;
    }private Page<Member> getMembers(PageParam pageParam) {//1.模拟数据库查询Pageable pageable = new PageRequest(pageParam.getPage(), pageParam.getLength());long count = 6;
        List<Member> members = getMembersFromDb();//2.计算rowspanthis.countRowspan(members);


        Page<Member> memberPage = new PageImpl<Member>(members,pageable,count);return memberPage;
    }private void countRowspan(List<Member> members) {
        Map<String,Integer> propertyCountMap = this.countPropertyCount(members);
        List<String> hadGetKeys = new ArrayList<>(); //曾经取过的keyfor(Member member:members){
            String areaKey = member.getArea();
            String companyKey = areaKey+member.getCompany();
            String departmentKey = companyKey+ member.getDepartment();

            Integer areaCount = propertyCountMap.get(areaKey);if(areaCount == null){
                member.setAreaRowSpan(1);
            }else{if(hadGetKeys.contains(areaKey)){
                    member.setAreaRowSpan(0); //曾经取过}else{
                    member.setAreaRowSpan(areaCount); //第一次取                    hadGetKeys.add(areaKey);
                }
            }

            Integer companyCount = propertyCountMap.get(companyKey);if(companyCount == null){
                member.setCompanyRowSpan(1);
            }else {if(hadGetKeys.contains(companyKey)){
                    member.setCompanyRowSpan(0);
                }else{
                    member.setCompanyRowSpan(companyCount);
                    hadGetKeys.add(companyKey);
                }
            }

            Integer departmentCount = propertyCountMap.get(departmentKey);if(companyCount == null){
                member.setDepartmentRowSpan(1);
            }else {if(hadGetKeys.contains(departmentKey)){
                    member.setDepartmentRowSpan(0);
                }else{
                    member.setDepartmentRowSpan(departmentCount);
                    hadGetKeys.add(departmentKey);
                }
            }
        }
    }private List<Member> getMembersFromDb() {
        Member member1 = new Member("安徽","A","人力资源部"," 小红");
        Member member2 = new Member("安徽","B","人力资源部"," 小明");
        Member member3 = new Member("浙江","C","人力资源部"," 小君");
        Member member4 = new Member("浙江","C","技术部"," 小王");
        Member member5 = new Member("浙江","D","技术部"," 小李");
        Member member6 = new Member("浙江","D","人力资源部"," 小刚");
        List<Member> members = new ArrayList<>();
        members.add(member1);
        members.add(member2);
        members.add(member3);
        members.add(member4);
        members.add(member5);
        members.add(member6);return members;
    }/** * 统计每个字段的每组成员个数
     * @param rows  记录
     * @return 每个字段的每组成员个数     */private Map<String,Integer> countPropertyCount(List<Member> rows){

        Map<String,Integer> propertyCountMap = new HashMap<>();for(Member member:rows){// "area": 无父级分组String area = member.getArea();if(propertyCountMap.get(area) == null){
                propertyCountMap.put(area,1);
            }else{int count = propertyCountMap.get(area);
                propertyCountMap.put(area,count+1);
            }// "company":有area父组String company = member.getCompany();
            String uniqueParent = member.getArea();
            String key = uniqueParent + company;if(propertyCountMap.get(key) == null){
                propertyCountMap.put(key,1);
            }else{int count = propertyCountMap.get(key);
                propertyCountMap.put(key,count+1);
            }// "department": 有area,company这两个父组String department = member.getDepartment();
            uniqueParent = member.getArea()+member.getCompany();
            key = uniqueParent + department;if(propertyCountMap.get(key) == null){
                propertyCountMap.put(key,1);
            }else{int count = propertyCountMap.get(key);
                propertyCountMap.put(key,count+1);
            }
        }return propertyCountMap;
    }


    @RequestMapping("/export")public void export(HttpServletResponse response) throws IOException {
        List<Member> members = this.getMembersFromDb();this.countRowspan(members);

        List<List<ExcelData>> rows = new ArrayList<>();for(Member member:members){
            List<ExcelData> row = new ArrayList<>();
            ExcelData col1 = new ExcelData();
            col1.setValue(member.getArea());
            col1.setRowSpan(member.getAreaRowSpan());
            row.add(col1);

            ExcelData col2 = new ExcelData();
            col2.setValue(member.getCompany());
            col2.setRowSpan(member.getCompanyRowSpan());
            row.add(col2);

            ExcelData col3 = new ExcelData();
            col3.setValue(member.getDepartment());
            col3.setRowSpan(member.getDepartmentRowSpan());
            row.add(col3);

            ExcelData col4 = new ExcelData();
            col4.setValue(member.getUserName());
            row.add(col4);

            rows.add(row);
        }

        OutputStream outputStream = response.getOutputStream();try {
            String filename = URLEncoder.encode("员工" + ".xlsx", "UTF-8");
            response.setContentType("application/vnd.ms-excel");
            response.addHeader("Content-Disposition", "octet-stream;filename=" + filename);

            ExcelUtil excelUtil = new ExcelUtil();
            XSSFWorkbook workbook = excelUtil.execute("sheet1",new String[]{"地区","公司","部门","员工姓名"},rows);
            workbook.write(outputStream);
        } finally {if (outputStream != null) outputStream.close();
        }
    }




}
登录后复制

导出excel功能使用poi类库实现。至此,页面展示和导出均OK!

 

以上是多种情况合并单元格的方法讲解的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1250
24
Excel 发现一个或多个公式引用存在问题:如何修复 Excel 发现一个或多个公式引用存在问题:如何修复 Apr 17, 2023 pm 06:58 PM

使用错误检查工具使用Excel电子表格查找错误的最快方法之一是使用错误检查工具。如果该工具发现任何错误,您可以更正它们并再次尝试保存文件。但是,该工具可能无法找到所有类型的错误。如果错误检查工具没有发现任何错误或修复它们不能解决问题,那么您需要尝试以下其他修复之一。要在Excel中使用错误检查工具:选择公式 选项卡。单击错误检查 工具。在发现错误时,有关错误原因的信息将出现在工具中。如果不需要,请修复错误或删除导致问题的公式。在错误检查工具中,单击下一步以查看下一个错误并重复该过程。当没

如何在 Google Sheets 中设置打印区域? 如何在 Google Sheets 中设置打印区域? May 08, 2023 pm 01:28 PM

如何在打印预览中设置GoogleSheets打印区域Google表格允许您使用三个不同的打印区域打印电子表格。您可以选择打印整个电子表格,包括您创建的每个单独的工作表。或者,您可以选择打印单个工作表。最后,您只能打印您选择的部分单元格。这是您可以创建的最小打印区域,因为理论上您可以选择单个单元格进行打印。最简单的设置方法是使用内置的Google表格打印预览菜单。您可以在PC、Mac或Chromebook上的网络浏览器中使用Google表格查看此内容。要设置Google

如何在 Excel 工作表中嵌入 PDF 文档 如何在 Excel 工作表中嵌入 PDF 文档 May 28, 2023 am 09:17 AM

通常需要将PDF文档插入Excel工作表。就像公司的项目列表一样,我们可以立即将文本和字符数据附加到Excel单元格中。但是,如果想将特定项目的解决方案设计附加到其相应的数据行怎么办?嗯,人们经常停下来思考。有时思考也不起作用,因为解决方案并不简单。深入研究这篇文章,了解如何轻松地将多个PDF文档插入Excel工作表,以及非常特定的数据行。示例场景在本文所示的示例中,我们有一个名为ProductCategory的列,它在每个单元格中列出了一个项目名称。另一列ProductSpeci

不同单元格格式太多复制不了怎么办 不同单元格格式太多复制不了怎么办 Mar 02, 2023 pm 02:46 PM

不同单元格格式太多复制不了的解决办法:1、打开EXCEL文档,然后在几个单元格中输入不同格式的内容;2、在Excel页面的左上角找到“格式刷”按钮,然后单击“格式刷”选项;3、点击鼠标左键,将格式统一设置成一致的即可。

如何在 Excel 中创建随机数生成器 如何在 Excel 中创建随机数生成器 Apr 14, 2023 am 09:46 AM

如何使用 RANDBETWEEN 在 Excel 中生成随机数如果要生成特定范围内的随机数,RANDBETWEEN 函数是一种快速简便的方法。这允许您在您选择的任何两个值之间生成随机整数。使用 RANDBETWEEN 在 Excel 中生成随机数:单击您希望出现第一个随机数的单元格。键入=RANDBETWEEN(1,500)将“1”替换为您要生成的最低随机数,将“500”替换为

如何在Excel中使用SIGN函数判断数值的正负 如何在Excel中使用SIGN函数判断数值的正负 May 07, 2023 pm 10:37 PM

SIGN函数是MicrosoftExcel内置的一个非常有用的函数。使用此功能,您可以找出数字的符号。即,数字是否为正。如果数字为正,SIGN函数返回1,如果数字为负,则返回-1,如果数字为零,则返回零。虽然这听起来太明显了,但如果有一个包含许多数字的大列,并且我们想要找到所有数字的符号,那么使用SIGN函数并在几秒钟内完成工作非常有用。在本文中,我们通过3种不同的方法解释了如何在任何Excel文档中轻松使用SIGN函数来计算数字的符号。继续阅读,了解如何掌握这个很酷的技巧。启动

如何计算 Google 表格上的日期之间的差异 如何计算 Google 表格上的日期之间的差异 Apr 19, 2023 pm 08:07 PM

如果您的任务是处理包含大量日期的电子表格,那么计算多个日期之间的差异可能会非常令人沮丧。虽然最简单的选择是依靠在线日期计算器,但它可能不是最方便的,因为您可能必须将日期一一输入到在线工具中,然后手动将结果复制到电子表格中。 对于大量日期,您需要一个更方便地完成工作的工具。幸运的是,谷歌表格允许用户在本地计算电子表格中两个日期之间的差异。在这篇文章中,我们将使用一些内置函数帮助您计算Google表格上两个日期之间的天数。 如何计算Google表格上的日期之间的差异如果您希望Google

如何从 Excel 中的数字值和文本值中删除逗号 如何从 Excel 中的数字值和文本值中删除逗号 Apr 17, 2023 pm 09:01 PM

在数值上,在文本字符串上,在错误的地方使用逗号确实会变得烦人,即使对于最大的Excel极客来说也是如此。您甚至可能知道如何摆脱逗号,但您知道的方法可能对您来说很耗时。好吧,无论您的问题是什么,如果它与您的Excel工作表中的错误位置的逗号有关,我们可以告诉您一件事,您所有的问题今天都会得到解决,就在这里!深入研究这篇文章,了解如何通过尽可能简单的步骤轻松去除数字和文本值中的逗号。希望你喜欢阅读。哦,别忘了告诉我们哪种方法最吸引你的眼球!第1节:如何从数值中删除逗号当数值包含逗号时,可能有两种情

See all articles