精华内容
下载资源
问答
  • 前景提要(文末提供源文件下载)多行表头,表头中含有合并单元格,这种类型的Excel表格在我们的日常工作中是经常出现的,很多的人在做表格的时候,想要体现表格的整齐和美观,大批量的使用了合并单元格、多行表头的...

    前景提要(文末提供源文件下载)

    多行表头,表头中含有合并单元格,这种类型的Excel表格在我们的日常工作中是经常出现的,很多的人在做表格的时候,想要体现表格的整齐和美观,大批量的使用了合并单元格、多行表头的形式,虽然整体表格数据好看了很多,但是对于数据分析和数据汇总的童鞋来说,则是非常头疼的事情,小伙伴们在日常的工作中也反馈会碰到多行表头的情况,所以我们今天针对多行表头的数据汇总来分析下方法

    场景模拟

    假设我们要统计的Excel中每个表格都有表头,如下图

    5349de0521913da012ee01fe7e129e62.png

    现在我们不仅仅要汇总表头,同时还需要汇总表头下面的具体的数据内容,很明显,我们之前的代码面对这样的问题的时候,就受到限制了,因为我们之前的表头都是默认只有一行的标准数据,那么眼下面对这样的情况我们要如何来解决呢?

    请听我的拙见~~

    代码区

    既然有了多行的标有,那么我们实际操作的时候,确定有多少行表头不就行了。

    来试下Sub test()Dim pathn, rng As Range, sth As Worksheet, book As WorkbookSet book = ActiveWorkbookpathn = ActiveWorkbook.Pathk = 0f = Dir(pathn & "")Do While f <> "" If f <> ThisWorkbook.Name Then k = k + 1 Workbooks.Open pathn & "" & f If k = 1 Then Set rng = Application.InputBox("请选择表头区域
    展开全文
  • 一般是导出有固定字段的excel 本文介绍 XSSFWorkbook 导出Excel多行表头合并单元格的表格 引入pom依赖 <!-- 构建Excel --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml...

    poi导出excel有两种方式:

    第一种:从无到有的创建整个excel,通过HSSFWorkbook,HSSFSheet HSSFCell, 等对象一步一步的创建出工作簿,sheet,和单元格,并添加样式,数据等。

    第二种:通过excel.xls 模板的方式,自己在桌面创建一个excel, 然后修改这个excel为模板,复制到项目中(我是放在根目录下),再然后读取模板,修改模板,给模板填充数据,最后把模板写入到另外一个excel2.xls中(硬盘中的)。 按我自己的理解,这种方式只适合,需要导出的内容是固定格式的,只需要填充一次数据的 情况。比如简历。

    本文内容如下:

        1. 使用 HSSFWorkbook 对象 实现excel导出。一般是导出excel2003
    
        2. 使用 XSSFWorkbook 对象实现excel导出。 一般是导出excel2007
    
        3. 使用 SXSSFWorkbook 对象实现excel导出。 一般是导出百万级数据的excel
    
        4. 使用 template.xls 格式模板,实现excel导出。 一般是导出有固定字段的excel
    

    本文介绍 XSSFWorkbook 导出Excel多行表头、合并单元格的表格
    引入pom依赖

    <!-- 构建Excel -->
    <dependency>
    	<groupId>org.apache.poi</groupId>
    	<artifactId>poi-ooxml</artifactId>
    	<version>3.9</version>
    </dependency>
    

    主要的方法如下:

    XSSFWorkbook workBook = new XSSFWorkbook(); //新建一个Excel文件
    XSSFSheet sheet = workBook.createSheet();  //新建一个sheet,index为sheet的页码
    XSSFRow row = sheet.createRow(int index);  //新建一行,index为行号
    XSSFCell cell = row.createCell(int index)  //新建一个单元格,index为单元格的列号
    cell.setCellValue(String str);  //给单元格赋值
    

    简单示例

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import com.elasticsearch.pojo.Student;
    import org.apache.poi.xssf.usermodel.*;
    
    /**
     * @Author:刘德安
     * @Date: 2021/1/11 10:37
     */
    public class TestExcelDemo {
    
        public static void main(String[] args) {
            Student student =new Student();
            student.setName("XXX ");
            student.setResult("95");
            student.setClazz("二班");
            student.setGrade("五年级");
            student.setNumber("66");
            List<Student> list =new ArrayList<>();
            list.add(student);
            list.add(student);
            list.add(student);
            testExcelDemo(list);
        }
        /**
         *
         * @param list 需要写入excel的数据 从数据库或者其他途径读取
         */
        public static void testExcelDemo(List<Student> list) {
            XSSFWorkbook workBook = new XSSFWorkbook();
            XSSFSheet sheet = workBook.createSheet();
            // 表头
            XSSFRow row = sheet.createRow(0);
            row.createCell(0).setCellValue("学号");
            row.createCell(1).setCellValue("姓名");
            row.createCell(2).setCellValue("年级");
            row.createCell(3).setCellValue("班别");
            row.createCell(4).setCellValue("成绩");
            for (int i = 0; i < list.size(); i++) {
                row = sheet.createRow(i+1);
                row.createCell(0).setCellValue(list.get(i).getNumber());
                row.createCell(1).setCellValue(list.get(i).getName());
                row.createCell(2).setCellValue(list.get(i).getGrade());
                row.createCell(3).setCellValue(list.get(i).getClazz());
                row.createCell(4).setCellValue(list.get(i).getResult());
            }
            String filePath = "D:\\Demo\\";
            String fileName = "testExcelDemo.xlsx";
            File file = new File(filePath + fileName);
            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(file);
                // 写入磁盘
                workBook.write(fos);
                fos.close();//记得关闭
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    

    复杂示例(多行表头、合并单元格)

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.elasticsearch.pojo.Student;
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.ss.util.CellRangeAddress;
    import org.apache.poi.xssf.usermodel.*;
    
    /**
     * @Author:刘德安
     * @Date: 2021/1/11 10:37
     */
    public class TestExcelDemo {
    
        public static void main(String[] args) {
            Student student =new Student();
            student.setName("XXX ");
            student.setResult("95");
            student.setClazz("二班");
            student.setGrade("五年级");
            student.setNumber("66");
            List<Student> list =new ArrayList<>();
            list.add(student);
            list.add(student);
            list.add(student);
            testExcelDemo(list);
        }
        /**
         *
         * @param list 需要写入excel的数据 从数据库或者其他途径读取
         */
        public static void testExcelDemo(List<Student> list) {
            /** 第一步,创建一个Workbook,对应一个Excel文件  */
            XSSFWorkbook wb = new XSSFWorkbook();
            /** 第二步,在Workbook中添加一个sheet,对应Excel文件中的sheet  */
            XSSFSheet sheet = wb.createSheet("excel导出标题");
            /** 第三步,设置样式以及字体样式*/
            XSSFCellStyle titleStyle = createTitleCellStyle(wb);
            XSSFCellStyle headerStyle = createHeadCellStyle(wb);
            XSSFCellStyle contentStyle = createContentCellStyle(wb);
            /** 第四步,创建标题 ,合并标题单元格 */
            // 行号
            int rowNum = 0;
            // 创建第一页的第一行,索引从0开始
            XSSFRow row0 = sheet.createRow(rowNum++);
            row0.setHeight((short) 800);// 设置行高
    
            String title = "excel导出标题";
            XSSFCell c00 = row0.createCell(0);
            c00.setCellValue(title);
            c00.setCellStyle(titleStyle);
            // 合并单元格,参数依次为起始行,结束行,起始列,结束列 (索引0开始)
            sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 4));//标题合并单元格操作,6为总列数
            //第二行
            XSSFRow row2 = sheet.createRow(rowNum++);
            row2.setHeight((short) 700);
            String[] row_third = {"学号", "姓名", "年级", "班级", "成绩"};
            for (int i = 0; i < row_third.length; i++) {
                XSSFCell tempCell = row2.createCell(i);
                tempCell.setCellValue(row_third[i]);
                tempCell.setCellStyle(headerStyle);
            }
            for (Student student : list) {
                XSSFRow tempRow = sheet.createRow(rowNum++);
                tempRow.setHeight((short) 500);
                // 循环单元格填入数据
                for (int j = 0; j < 5; j++) {
                    XSSFCell tempCell = tempRow.createCell(j);
                    tempCell.setCellStyle(contentStyle);
                    String tempValue = "";
                    if (j == 0) {
                        // 学号
                        tempValue = student.getNumber();
                    } else if (j == 1) {
                        // 姓名
                        tempValue = student.getName();
                    } else if (j == 2) {
                        // 年级
                        tempValue = student.getGrade();
                    } else if (j == 3) {
                        // 班级
                        tempValue = student.getClazz();
                    } else if (j == 4) {
                        // 成绩
                        tempValue = student.getResult();
                    }
                    tempCell.setCellValue(tempValue);
                }
            }
            String filePath = "D:\\Demo\\";
            String fileName = "testExcelDemo.xlsx";
            File file = new File(filePath + fileName);
            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(file);
                // 写入磁盘
                wb.write(fos);
                fos.close();//记得关闭
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
    
        /**
         * 创建标题样式
         * @param wb
         * @return
         */
        private static XSSFCellStyle createTitleCellStyle(XSSFWorkbook wb) {
            XSSFCellStyle cellStyle = wb.createCellStyle();
            cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平居中
            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直对齐
            cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            cellStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());//背景颜色
    
            XSSFFont headerFont1 = (XSSFFont) wb.createFont(); // 创建字体样式
            headerFont1.setBold(true); //字体加粗
            headerFont1.setFontName("黑体"); // 设置字体类型
            headerFont1.setFontHeightInPoints((short) 15); // 设置字体大小
            cellStyle.setFont(headerFont1); // 为标题样式设置字体样式
            return cellStyle;
        }
    
        /**
         * 创建表头样式
         * @param wb
         * @return
         */
        private static XSSFCellStyle createHeadCellStyle(XSSFWorkbook wb) {
            XSSFCellStyle 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); //上边框
    
            XSSFFont headerFont = (XSSFFont) wb.createFont(); // 创建字体样式
            headerFont.setBold(true); //字体加粗
            headerFont.setFontName("黑体"); // 设置字体类型
            headerFont.setFontHeightInPoints((short) 12); // 设置字体大小
            cellStyle.setFont(headerFont); // 为标题样式设置字体样式
    
            return cellStyle;
        }
    
        /**
         * 创建内容样式
         * @param wb
         * @return
         */
        private static XSSFCellStyle createContentCellStyle(XSSFWorkbook wb) {
            XSSFCellStyle cellStyle = wb.createCellStyle();
            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
            cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平居中
            cellStyle.setWrapText(true);// 设置自动换行
            cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
            cellStyle.setBorderLeft(BorderStyle.THIN); //左边框
            cellStyle.setBorderRight(BorderStyle.THIN); //右边框
            cellStyle.setBorderTop(BorderStyle.THIN); //上边框
    
            // 生成12号字体
            XSSFFont font = wb.createFont();
            font.setColor((short)8);
            font.setFontHeightInPoints((short) 12);
            cellStyle.setFont(font);
    
            return cellStyle;
        }
    }
    
    
    展开全文
  • https://www.cnblogs.com/hxun/p/11387726.html
    展开全文
  • GridView多行表头合并

    2018-03-09 14:54:43
    GridView多行表头合并多行表头合并, 网上很多实例, 这里写的很详细, 力求让每个人都能看懂. 实现原理:GridView在ASP.NET中最终转为HMTL的表格显示表头。 在GridView创建行表头行时: e.Row.RowType == ...

    GridView多行表头合并

    多行表头合并, 网上很多实例, 这里写的很详细, 力求让每个人都能看懂. 实现原理:GridView在ASP.NET中最终转为HMTL的表格显示表头。 在GridView创建行表头行时: e.Row.RowType == DatacontrolRowType.Header 清除掉旧的表头, 再重新拼接新的表头.

    TableHeaderCell thc = new TableHeaderCell();

    thc.Text = "表头";

    对应生成的HTML为:<th>表头</th>

    多行表头合并效果图

    测试多行合并表头
    表头表头1表头2表头3
    表头1-1表头2-1表头2-2表头3-1表头3-2

    表头3-3

    protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
        {
            //判断创建的行是否为表头行
            if (e.Row.RowType == DataControlRowType.Header)
            {
                //获取表头所在行的所有单元格
                TableCellCollection tcHeader = e.Row.Cells;
                //清除自动生成的表头
                tcHeader.Clear();
     
                //新添加的第一个表头单元格, 设置为合并7个列, 从而形成一行.
                tcHeader.Add(new TableHeaderCell());
                tcHeader[0].ColumnSpan = 7;
                tcHeader[0].Text = "测试多行合并表头</th></tr><tr>";
                //</th>表示当前单元格结束, </tr>表示本行结束, <tr>另起新一行    关键点
                 
                //添加第二个表头单元格, 设置为合并两行.
                tcHeader.Add(new TableHeaderCell());
                tcHeader[1].RowSpan = 2;
                tcHeader[1].Text = "表头";
     
                tcHeader.Add(new TableHeaderCell());
                tcHeader[2].Text = "表头1";
     
                tcHeader.Add(new TableHeaderCell());
                tcHeader[3].ColumnSpan = 2;
                tcHeader[3].Text = "表头2";
     
                tcHeader.Add(new TableHeaderCell());
                tcHeader[4].ColumnSpan = 3;
                tcHeader[4].Text = "表头3</th></tr><tr>";
                 
                //第二行的所有的单元格添加完成, 换行</th></tr><tr>
     
                //添加第三行所有的单元格
                  tcHeader.Add(new TableHeaderCell());
                tcHeader[5].Text = "表头1-1";
     
                tcHeader.Add(new TableHeaderCell());
                tcHeader[6].Text = "表头2-1";
     
                tcHeader.Add(new TableHeaderCell());
                tcHeader[7].Text = "表头2-2";
     
                tcHeader.Add(new TableHeaderCell());
                tcHeader[8].Text = "表头3-1";
     
                tcHeader.Add(new TableHeaderCell());
                tcHeader[9].Text = "表头3-2";
     
                tcHeader.Add(new TableHeaderCell());
                tcHeader[10].Text = "表头3-3</th></tr><tr>";
            }
     
        }
    展开全文
  • /**第四步,创建标题 ,合并标题单元格*/ //行号 int rowNum = 0;//创建第一页的第一行,索引从0开始 HSSFRow row0 = sheet.createRow(rowNum++); row0.setHeight((short) 800);//设置行高 String title= "excel导出...
  • 前景提要(文末提供源码下载)发现小伙伴们的数据结果真的好复杂,不昨天才分享过有多行表头的数据如何汇总合并,今天就有小伙伴反馈,他的数据虽然是有多行表头的,但是又有一些数据没有多行表头,那么在进行批量数据...
  • 占用两行数据,利用合并表格功能实现多行表头
  • 在项目中,客户经常有这样的EXCEL表格给到我们,如下:可以看到,EXCEL的表头行,有几列属于同一组,会合并产生了两行表头,这样其他不需要分组的需要两行表头合并。但是SAP系统的ALV GRID,却是这样的:A...
  • 吐槽今天,在vue中遇到 复杂表格的渲染 ,需要合并表头th的单元格,且合并单元格的那列的表头数据是动态数据,也就是不知道会有多少个表头列,而这几个表头列还分了好几个子表头。这个需求在js里用Juicer模板很好做...

空空如也

空空如也

1 2 3 4 5
收藏数 88
精华内容 35
关键字:

多行表头表格合并