精华内容
下载资源
问答
  • poi 导出 excel 设置 表头固定不动

    千次阅读 2019-06-14 11:43:23
    HSSFSheet sheet = ...//固定第一行十五个列 createFreezePane (API): / * * *创建一个分割(freezepane)。任何现有的冷冻epane或拆分窗格都被覆盖。 * *如果colSplit和rowSplit都为零,则删除现有的冻结窗格 ...

    HSSFSheet sheet = workbook.createSheet(“导出数据”);
    sheet.createFreezePane(15, 1);//固定第一行十五个列

    createFreezePane (API):
    / * *
    *创建一个分割(freezepane)。任何现有的冷冻epane或拆分窗格都被覆盖。


    *
    *如果colSplit和rowSplit都为零,则删除现有的冻结窗格
    *

    • @param colSplit的水平位置。
    • @param rowSplit的垂直位置。
    • /
    • @Override
      public void createFreezePane(int colSplit, int rowSplit) {
      createFreezePane(colSplit, rowSplit, colSplit, rowSplit);
      }

    //sheet.protectSheet(“123456”); //设置编辑密码

    展开全文
  • EXCEL如何让表头不动 冻结表头

    千次阅读 2018-09-19 22:40:19
  • java导出excel复杂表头

    2019-02-20 16:09:50
    java工程,源代码,可直接运行,需自己改造成web下载方式。
  • 主要为大家详细介绍了java生成可变表头excel的方法,传入一个表头和数据,将数据导入到excel中,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • java实现导出Excel多行表头复杂模板 一般我们都会选择poi来导出,选择一个比较好的ExcelUtils 但是对于初学者而言了解poi的,还需从poi API文档去学习,如果是自学的话更好,如果是公司安排的任务,没有接触过有...
  • Java实现Excel表头动态数据导出

    千次阅读 2020-07-23 13:05:12
    两个内容都是有后台人员分别由两个接口返回的(也可以一个,但一个会显得格式冗余),因此他的表头数据是不固定的,可能有甲方要求,甲方、乙方、丙方要求等,是随机看后台数据的,所以我们就不能事先画好Excel模板...

       好久没时间写帖子了,由于工作需要,写一个基于JAVA实现的Excel多表头动态导出功能,首先可能这个叫法比较啰嗦,下面我们先看看什么是Excel多表头动态导出(效果图):

     它包含两部分:1、是表头,就像大家看到的样子它的表头是多行合并的(多表头);2.内容部分,就是下方的数据数据内容。

    两个内容都是有后台人员分别由两个接口返回的(也可以一个,但一个会显得格式冗余),因此他的表头数据是不固定的,可能有甲方要求,甲方、乙方、丙方要求等,是随机看后台数据的,所以我们就不能事先画好Excel模板进行导出,好以上就是我对java实现Excel多表头动态导出的说明下面开始吧。

    一、在开发前我们要撸一下思路,该怎么去做?会遇到什么坑?首先不用多说肯定识这个多表头的问题了,后端返回的Json数据一般都:

    不难发现一个list<Map>发现虽然都有一、二级目录的区分,但是分开的不符合我们的需要,因此我们需要转换分组为想要的数据类型

    Map<String, List<Map>>格式的数据:既把同一个一级目录下的二级目录放到一个List<Map>中方便后面的Excel渲染

    二、就是在Excel做数据渲染时的数据角标的计算问题,以及如何让经过我们分组后的表头数据与内容匹配上,因为数据是动态生成的,所以在生成数据是一定要注意,后几列的数据再前几列数据生成的基础上向后推的。

    三、主要的坑应该就是上面两个问题了,那我们开发撸代码吧:

    1、我使用的实现语言是JAVA中的servlet,关于servlet不太熟悉的小伙伴可以百度自行科普一下,简单说就是(1):

    集成HttpServlet并实现其几个方法;(2)配置web.xlm文件等。

    代码:

    /**
     * 自定义表头导出方法
     * @throws: l
     * @param :resultParam 导出excel名称、模板名称、导出地址
     */
    public void exportExcelByDiyTitle(HttpServletRequest request, HttpServletResponse response)throws IOException{
       System.out.println("进入自定义导出表头方法");
       response.reset();// 清空输出流
       String templateName ="按异常原因统计";
       //获取导出参数进行查询orgId=06&date=2020-07
       String orgId = request.getParameter("orgId");//组织ID
       String date = request.getParameter("date");//日期
       String type = request.getParameter("type");//日期
       List<Map<String,Object>> listtitle=null;
       List<Map<String,Object>> list=null;
       WorkOrderInforShowService workOrderInforShowService = new WorkOrderInforShowServiceImpl();
       //这是调用后台Execl表头数据接口
          listtitle = workOrderInforShowService.getYCLXTypeOfYY(orgId,date);
         //获取Excell内容数据接口
          list = workOrderInforShowService.getAppWorkOrderStatisticsOfYY(orgId,date);
       //设置谷歌和Ie浏览器导出表单乱码问题
       String userAgent = request.getHeader("User-Agent");
       if (userAgent.contains("MSIE")||userAgent.contains("Trident")){
          templateName = java.net.URLEncoder.encode(templateName, "UTF-8");
       }else{
          templateName = new String(templateName.getBytes("UTF-8"),"ISO-8859-1");
       }
       response.setHeader("Content-disposition", "attachment; filename="
             + templateName+ ".xls");// 设定输出文件头
          response.setContentType("application/msexcel");
          // 创建一个工作薄
           HSSFWorkbook workbook = new HSSFWorkbook();
           // 生成一个表格
           HSSFSheet sheet = workbook.createSheet("数据明细");
       HSSFCellStyle cellStyle = workbook.createCellStyle();
       //设置表头字体
       HSSFFont font2 = workbook.createFont();
       font2.setFontName("仿宋_GB2312");
       font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示
       font2.setFontHeightInPoints((short) 10);
       //TODO 水平垂直居中 列宽
       cellStyle.setAlignment(HorizontalAlignment.CENTER_SELECTION);
       cellStyle.setFont(font2);
       // 产生表格标题行
           HSSFRow firrow = sheet.createRow(0);
       // 产生表格标题行
       HSSFRow row = sheet.createRow(1);
       CellRangeAddress cellRange = null;
       //一级表头
       String manKey=null;
       //判断表头是否有数据
       if(listtitle.size()==0){
          return;
       }
    //这就是我们对无序的表头数据进行分组得等满足要求的Map<String, List<Map>> 格式数据
          Map<String, List<Map>> temp =new HashMap<String, List<Map>>();
          for(Map item:listtitle){
             String key = item.get("VAL_ONE").toString();
             if(temp.get(key) == null){
                List<Map> list1 = new ArrayList<>();
                temp.put(key,list1);
             }else{
                temp.put(key,temp.get(key));
             }
             temp.get(key).add(item);
          }
        
       //设置固定单位列
       HSSFCell organizeCell = firrow.createCell(0);
       organizeCell.setCellStyle(cellStyle);
       //由于后台数据并没有返回项目名称这一列接口数据,因此我们只能自己生成
       organizeCell.setCellValue("项目名称");
       sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0));
           //遍历生成一、二级表头
       int count = 1;
           for(Map.Entry<String, List<Map>> entry : temp.entrySet()){
               List<Map> mapValue = entry.getValue();
                 manKey=entry.getKey();
               if(mapValue.size()>0){
                   //设置一级表头
             HSSFCell fircell = firrow.createCell(count);
             fircell.setCellStyle(cellStyle);
             fircell.setCellValue(manKey);
             //对合并列进行判断,当二级目录为一时既不需要合并
             if(mapValue.size()>1){
               //设置单元格合并操作,可以查询Excel导出api
                cellRange = new CellRangeAddress(0, 0, count, count + mapValue.size()-1);
                try {
                   sheet.addMergedRegion(cellRange);
                   addBorderLine(sheet,cellRange,workbook);
                }catch (Exception e){
                   e.printStackTrace();
                }
             }
           for (short i = 0; i < mapValue.size(); i++) {
                try {
                   //设置二级表头
                       HSSFCell cell = row.createCell(count+i);
                      HSSFRichTextString text = new HSSFRichTextString(mapValue.get(i).get("VAL_TWO").toString());
                      cell.setCellValue(text);
                //设置二级表头宽度
                sheet.setColumnWidth(count+i, text.toString().getBytes("UTF-8").length*256);
                cell.setCellStyle(cellStyle);
                CellRangeAddress cellRange1 = new CellRangeAddress(1, 1, count-1, count+i);
                //sheet.addMergedRegion(cellRange1);
                   //设置水平位置
                 addBorderLine(sheet, cellRange1, workbook);
                     }catch (Exception e){
                    e.printStackTrace();
                }
                  }
             count = count + mapValue.size();
          }
       }
           // 遍历集合数据,产生数据行
           if(list!=null && list.size() > 0){
               int index = 1;
               int count1 = 1;
          for (short i = 0; i < list.size(); i++) {
                   index++;
                   // 从表头下一行开始插入数据
                   row = sheet.createRow(index);
             row.createCell(0).setCellValue(list.get(i).get("XLMC").toString());
             for(Map.Entry<String, List<Map>> entry : temp.entrySet()){
                List<Map> mapValue = entry.getValue();
                manKey=entry.getKey();
                if(mapValue.size()>0){
                   for (short ii = 0; ii < mapValue.size(); ii++) {
                      try {
                         HSSFCell cell = row.createCell(count1 + ii);
                        //通过遍历表头二级表单“CODE_TWO”值 匹配内容接口数据
                         if(null==list.get(i).get(mapValue.get(ii).get("CODE_TWO").toString())||("null").equals(list.get(i).get(mapValue.get(ii).get("CODE_TWO").toString()))){
                            cell.setCellValue("0");
                         }else {
                            cell.setCellValue(list.get(i).get(mapValue.get(ii).get("CODE_TWO").toString()).toString());
                         }
                      }catch (Exception e){
                         e.printStackTrace();
                      }
                   }
                   count1 = count1 + mapValue.size();
                }
             }//当该行数据遍历完成之后,下一行从第二列开始
             count1=1;
               }
           }
           OutputStream outputStream = response.getOutputStream();// 打开流
           workbook.write(outputStream);// HSSFWorkbook写入流
           workbook.close();// HSSFWorkbook关闭
           outputStream.flush();// 刷新流
           outputStream.close();// 关闭流
           System.out.println("导出成功");
    }
    private void addBorderLine(HSSFSheet sheet,CellRangeAddress cellRangeAddress,HSSFWorkbook workbook){
       RegionUtil.setBorderTop(1, cellRangeAddress, sheet, workbook);
       RegionUtil.setBorderBottom(1, cellRangeAddress, sheet, workbook);
       RegionUtil.setBorderLeft(1, cellRangeAddress, sheet, workbook);
       RegionUtil.setBorderRight(1, cellRangeAddress, sheet, workbook);
    }
    

    内容接口:

     

    展开全文
  • 主要介绍了Java实现生成Excel树形表头完整代码示例,具有一定借鉴价值,需要的朋友可以参考下。
  • java实现excel动态表头导入

    千次阅读 2019-06-19 10:13:47
    使用java在导入excel表格时,一般采用hssfworkbook(excel2003)和xssfworkbook(excel2007) 首先获取workbook: /** * 描述:根据文件后缀,自适应上传文件的版本 * * @param inStr 将file.getInputStream()...

    问题的提出

    使用java在导入excel表格时,一般采用hssfworkbook(excel2003)和xssfworkbook(excel2007)
    首先获取workbook:

    /**
    	 * 描述:根据文件后缀,自适应上传文件的版本
    	 * 
    	 * @param inStr    将file.getInputStream()获取的输入流
    	 * @param fileName file.getOriginalFilename()获取的原文件名
    	 */
    	public static Workbook getWorkbook(InputStream inStr, String fileName) throws Exception {
    		Workbook wb = null;
    		String fileType = fileName.substring(fileName.lastIndexOf("."));
    		if (excel2003L.equals(fileType)) {
    			wb = new HSSFWorkbook(inStr); // 2003-
    		} else if (excel2007U.equals(fileType)) {
    			wb = new XSSFWorkbook(inStr); // 2007+
    		} else {
    			throw new Exception("解析的文件格式有误!");
    		}
    		return wb;
    	}
    

    使用List<List>类型存储读取到的数据

    /**
     * 
     * 读取指定sheet 页指定行数据
     * 
     * @param sheetIx  指定 sheet 页,从 0 开始
     * @param startRow 指定开始行,从 0 开始
     * @param endRow   指定结束行,从 0 开始 start=end=0 就是第一行
     * @param startCol 指定开始列
     * @param startCol 指定结束列
     * @return
     * @throws Exception
     */
    public List<List<String>> read(int sheetIx, int startRow, int endRow, int startCol, int endCols) throws Exception {
    	Sheet sheet = workbook.getSheetAt(sheetIx);
    	List<List<String>> list = new ArrayList<List<String>>();
    
    	if (endRow > getRowCount(sheetIx)) {
    		endRow = getRowCount(sheetIx);
    	}
    
    	for (int i = startRow; i <= endRow; i++) {
    		List<String> rowList = new ArrayList<String>();
    		Row row = sheet.getRow(i);
    		for (int j = startCol; j < endCols; j++) {
    			if (row == null) {
    				rowList.add(null);
    				continue;
    			}
    			//rowList.add(getCellValue(row.getCell(j)));
    			//取excel表中公式数据 ,表格中row.getCell(j).getCellTypeEnum() 可能会发生空指针错误,用try...catch处理
    			try {
    		        if (row.getCell(j).getCellTypeEnum() == CellType.FORMULA) {
    		        	row.getCell(j).setCellType(CellType.STRING);
    		            rowList.add(row.getCell(j).getStringCellValue());
    		        }else {
    		        	rowList.add(getCellValueToString(row.getCell(j)));
    		        }
    			}catch(Exception e) {
    				rowList.add(getCellValueToString(row.getCell(j)));
    			}
    		}
    		list.add(rowList);
    	}
    	return list;
    }
    

    这样是一般的处理过程,这样处理有个不好的地方就是拓展性不强,在后续调用List<List>数据时需知道在第几列,最致命的是表格添加字段或删除字段后,所有序号都得修改,所以需要解决这一问题。

    问题的解决

    本文新建工具类,采用反射技术动态的提取类方法

    public class ArUtils<T> {
    	
    	private String[] ldcode = {"Id","Name", "A","B","C","D","E","F",
    	                           "AtpDeviceNo2","AtpDeviceNo16","Tpproperty1","Tpproperty2",
    	                           "Tpproperty3","Tpproperty4","Tpproperty5","Tpproperty6","Tpproperty7",
    	                           "Remarks"};
    	
    	private String id;
    	
    	private String name;
    	
    	private String a;
    	
    	private String b;
    

    配置各私有属性的get,set方法。

    /**
     * 
     * 读取指定sheet 页指定行<T>数据
     * 
     * @param sheetIx 指定 sheet 页,从 0 开始
     * @param start   指定开始行,从 0 开始
     * @param end     指定结束行,从 0 开始
     * @return
     * @throws Exception
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public List<List<T>> readGeneric(int sheetIx, int start, int end, T t) throws Exception {
    	Sheet sheet = workbook.getSheetAt(sheetIx);
    	List<List<T>> list = new ArrayList<List<T>>();
    
    	if (end > getRowCount(sheetIx)) {
    		end = getRowCount(sheetIx);
    	}
    
    	for (int i = start; i <= end; i++) {
    		List<T> rowList = new ArrayList<T>();
    		Row row = sheet.getRow(i);
    		List rowdata = getRowdata(row);
    		Class clazz = t.getClass();
    		Object fa= clazz.newInstance();
    		Method method = t.getClass().getMethod("getLdcode", new Class[]{});
    		Object[] ldcode = (String[])method.invoke(fa, new Object[]{});
    		
    		for(int j = 0; j < rowdata.size(); j++) {
    			method = t.getClass().getMethod("set"+ldcode[j], String.class);
    			method.invoke(fa, rowdata.get(j));
    		}
    		rowList.add((T) fa);
    		list.add(rowList);
    	}
    
    	return list;
    }
    

    首先反射获取string[]数组,数组中存储着各个私有属性,再调用个各属性的set方法,将一行数据存储进工具类的实例,这样就完成了键值对存储,之后调用时直接使用工具类的get方法就好了。

    展开全文
  • 注解反射导出Excel自定义中文表头,数据库查出数据,亲测可用
  • 1、可以生成动态表头,单级,多级都支持,尤其是树形表头(整体思路按照树形结构数据来遍历); 2、数据可配置,支持动态填写数据(一个List结构的数据); 3、读取Excel数据; 设计思路:需要一个含有树形结构的...
  • java POI 首先读取模板,修改添加数据,表头是动态的, 要写一个公共类,请教下大神。 /** * @param path 模板路径 * @param esheet 表 * @param dataList 数据 * @return 结果集 * @throws IOException */ @...
  • easypoi导出动态表头excel

    千次阅读 2018-09-01 17:43:32
    &lt;dependency&gt; &lt;groupId&gt;cn.afterturn&lt;/groupId&gt; &lt;artifactId&gt;easypoi-base&lt;/artifactId&gt; &lt;version&gt;3.2.0&...
  • 主要介绍了解决iview多表头动态更改列元素发生的错误的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 效果图 @Override public void export(Map<String, Object> params, HttpServletResponse response){ //数据 List<SupplierEvaluationEntity> dataList = supplierEvaluationDao.... //表头 L
  • C#将excel导入到list,按照excel表头字段,动态生成json数据,不用实体类接收,返回数据给前端,使用js进行序列化 /// <summary> /// 将excel导入到list /// </summary> /// <param name="fs"&...
  • easyexcel 动态导出复杂表头 例子 带cellRange
  • https://www.cnblogs.com/oukele/p/11444234.html
  • } /** * description: 动态生成excel 列 * create by heyanfeng at 2019-05-29 18:02 * @param ef * @param entities */ public static void dynamicNewAddExcel(List ef, List entities) { //单元格的excel 表头 ...
  • java导出excel复合表头简单实例

    热门讨论 2014-05-10 13:11:32
    本资源实现了Excel的简单导出实例,同时也实现了导出Excel复合表头的简单实例,适合一些需要用到导出Excel技术的初学者。
  • excel固定表头很简单,只需要视图-冻结窗格-冻结首行,冻结首列与之类似 那么如何使前两行保持在最前端,也就是冻结前两行,如果按照步骤选中前两行,点击冻结窗格,会自动冻结+1行,也就是第三行,这种情况无法...
  • 导出Excel包含的功能: 1.多表头导出最多支持到三行,表头格式说明 相邻父列头之间用'#'分隔,父列头与子列头用空格(' ')分隔,相邻子列头用逗号分隔(',') 两行:序号#分公司#组别#本日成功签约单数 预警,续约,流失,...
  • poi导出excel动态表头并合并

    千次阅读 2019-12-27 11:31:35
    实现图,全场总电位第一级,其他 例行政部为第二层,若没有第三层的第二级如V线总电和污水处理站则合并两列,第三级 例生活区,此上数据为动态数据,根据不同用户不同数据动态变化表头 DEMO代码: package ...
  • 4.操作完上面的步骤,就已经顺利完成了用WPS把Excel表头设置成固定不动的所有的操作流程了。我们下拉表格后就可以发现需要锁定的表头不再移动了。 5.如果想要锁定了的话,可以点击一下“视图...
  • 封装好的共同excel方法,只需要传表头,表里的数据,就会自动生成excel,亲测好用,可以直接用浏览器访问http://localhost:8089/demo/excel/export, 内配置了swagger 但是生成中文excel可能有问题
  • asp.net 导入excel时,处理合并表头、复杂表头、多行表头 1.解决复杂表头Excel导入。可以解决任何复杂的表头。 2.导入时,显示请稍后。。。提醒框,完毕后会自动隐藏 3.全面扫描Excel数据,将所有异常详细信息写入...
  • 根据POI封装Excel的导出()说明代码 说明 之前知道有easy-poi这个封装好的包。在使用poi的过程中,慢慢的根据实际业务封装的。...通过注解方式,生成Excel,支持动态表头。 代码 代码从接口调用开始说明 poi版本 ...
  • HSSFWorkbook xssfWorkbook = new HSSFWorkbook(); //创建工作表对象 Sheet sheet = xssfWorkbook.createSheet(); //创建工作表 HSSFCellStyle columnTopStyle = this.getColumnTopStyle(xssfWorkbook);...
  • 前言:我们的需求要将报表导出excel,并且支持动态表头,我们的表头层级大致入下表格 前期调研的时候使用的easyPOI的ExcelExportEntity类构造的表头,发现这种方式只能支持两级表头; 也尝试了使用阿里的...
  • C#自定义滚动表格,表头固定,表体从下往上动态平滑滚动,类似于电影字幕动画效果,使用GDI绘图实现,可以作为动态显示屏公式信息使用。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,209
精华内容 2,483
关键字:

excel如何固定表头不动