精华内容
下载资源
问答
  • Easypoi_4.2.0源码修改 word模板导出 增加表格一列非循环语句时word导出1. 写在前面2.开始寻找突破口 1. 写在前面   之前写过easypoi修改源码的文章,写的很细,但是发现基本没什么反响。这篇文章不会太详细的...

    Easypoi_4.2.0源码修改 word模板导出 增加表格第一列非循环语句时word导出

    1. 写在前面

      之前写过easypoi修改源码的文章,写的很细,但是发现基本没什么反响。这篇文章不会太详细的介绍如何定位问题,只会简单记录,最后把修改完的代码贴出来,并实现功能。

    2. 开始寻找突破口

      首先定位到问题,当word模板中存在表格的情况下,并且表格的第一列是固定,如下图中蓝框中的内容是固定,这时使用 !fe: 遍历的时候,会发现毫无效果。问题定位到了,那就一步一步来找到原因所在吧。
    在这里插入图片描述

    3. 解决问题

      首先找到代码入口。查看该方法exportWord07

    WordExportUtil.exportWord07("班级.docx", map)
    

    经过一系列的调试,定位到了ParseWord07类中的parseThisTable方法。源码如下:

        private void parseThisTable(XWPFTable table, Map<String, Object> map) throws Exception {
            for(int i = 0; i < table.getNumberOfRows(); ++i) {
                XWPFTableRow row = table.getRow(i);
                List<XWPFTableCell> cells = row.getTableCells();
                Object listobj = this.checkThisTableIsNeedIterator((XWPFTableCell)cells.get(0), map);
                if (listobj == null) {
                    this.parseThisRow(cells, map);
                } else if (listobj instanceof ExcelListEntity) {
                    (new ExcelEntityParse()).parseNextRowAndAddRow(table, i, (ExcelListEntity)listobj);
                    i = i + ((ExcelListEntity)listobj).getList().size() - 1;
                } else {
                    ExcelMapParse.parseNextRowAndAddRow(table, i, (List)listobj);
                    i = i + ((List)listobj).size() - 1;
                }
            }
    
        }
    

      我们需要改的地方就是第五行,之后替换表格内容的代码最重要的就是listobj参数。这源代码中第五行很明显,他只是根据第一列的内容来获取listobj,而我们的模板循环语句并未在第一列上,因此导致word导出时,无法替换内容。原因讲完了,下面都是动手节了。

      首先将ParseWord07类中的parseThisTable方法 修改成以下代码。

     private void parseThisTable(XWPFTable table, Map<String, Object> map) throws Exception {
            for (int i = 0; i < table.getNumberOfRows(); ++i) {
                XWPFTableRow row = table.getRow(i);
                List<XWPFTableCell> cells = row.getTableCells();
    
                //此部分为修改的源代码
                //作用 用于识别word中表格非第一列的循环语法
                Object listobj = null;
                int col = 0;
                for (XWPFTableCell cell : cells) {
                    listobj = this.checkThisTableIsNeedIterator(cell, map);
                    if (listobj != null) {
                        break;
                    }
                    col++;
                }
                if (listobj == null) {
                    this.parseThisRow(cells, map);
                } else if (listobj instanceof ExcelListEntity) {
                    (new ExcelEntityParse()).parseNextRowAndAddRow(table, i, (ExcelListEntity) listobj);
                    i = i + ((ExcelListEntity) listobj).getList().size() - 1;
                } else {
                    LcExcelMapParse.parseNextRowAndAddRow(table, i, (List) listobj, col);
                    i = i + ((List) listobj).size() - 1;
                }
            }
    
        }
    

      再找到ExcelMapParse类中的parseNextRowAndAddRow方法,修改成以下代码

    
        public static void parseNextRowAndAddRow(XWPFTable table, int index, List<Object> list, int col) throws Exception {
            XWPFTableRow currentRow = table.getRow(index);
            String[] params = parseCurrentRowGetParams(currentRow);
            String listname = params[col];
            boolean isCreate = !listname.contains("!fe:");
            listname = listname.replace("!fe:", "").replace("$fe:", "").replace("fe:", "").replace("{{", "");
            String[] keys = listname.replaceAll("\\s{1,}", " ").trim().split(" ");
            params[col] = keys[1];
            List<XWPFTableCell> tempCellList = new ArrayList();
            tempCellList.addAll(table.getRow(index).getTableCells());
    //        int cellIndex = false;
            Map<String, Object> tempMap = Maps.newHashMap();
            LOGGER.debug("start for each data list :{}", list.size());
            Iterator var11 = list.iterator();
    
            while (var11.hasNext()) {
                Object obj = var11.next();
                currentRow = isCreate ? table.insertNewTableRow(index++) : table.getRow(index++);
                tempMap.put("t", obj);
    
                //如果有合并单元格情况,会导致params越界,这里需要补齐
                String[] paramsNew = (String[]) ArrayUtils.clone(params);
                if (params.length < currentRow.getTableCells().size()) {
                    for (int i = 0; i < currentRow.getTableCells().size() - params.length; i++) {
                        paramsNew = (String[]) ArrayUtils.add(paramsNew, 0, "placeholderLc_" + i);
                    }
                }
    
                String val;
                int cellIndex;
                for (cellIndex = 0; cellIndex < currentRow.getTableCells().size(); ++cellIndex) {
                    val = PoiElUtil.eval(paramsNew[cellIndex], tempMap).toString();
                    //源代码的bug 此方法无法删除单元格中的内容
                    //currentRow.getTableCells().get(cellIndex).setText("");
                    //使用此方法清空单元格内容
                    if (!Strings.isNullOrEmpty(val)) {
                        currentRow.getTableCells().get(cellIndex).getParagraphs().forEach(p -> p.getRuns().forEach(r -> r.setText("", 0)));
                    }
                    PoiWordStyleUtil.copyCellAndSetValue(cellIndex >= tempCellList.size() ? tempCellList.get(tempCellList.size() - 1) : tempCellList.get(cellIndex)
                            , currentRow.getTableCells().get(cellIndex), val);
                }
    
                while (cellIndex < paramsNew.length) {
                    val = PoiElUtil.eval(paramsNew[cellIndex], tempMap).toString();
                    PoiWordStyleUtil.copyCellAndSetValue((XWPFTableCell) tempCellList.get(cellIndex), currentRow.createCell(), val);
                    ++cellIndex;
                }
            }
    
            table.removeRow(index);
        }
    

      至此源代码全部修改完毕,这次没有解释太多,因为估计真有遇到需要修改源代码的时候,大部分人选择的是放弃使用这个第三方类库,修改源码也确实有一定难度,所以这个基本用于记录自己解决问题的整个流程,方便以后看得时候能快速想起来。

    展开全文
  • 固定第一列 setFixedFirstColumn//1.4版本取消了 可以使用Column.setFixed 固定任意列。 20. 固定统计行 setFixedCountRow 21. 列标题上下padding setColumnTitleVerticalPadding 22. 增加列标题左右padding ...
  • reportx2.7表格控件

    2015-07-13 04:52:13
    GetSelectCell方法的参数应使用变量而不是变量值以便该方法将选择范围返回给变量、TopRow属性为当前表格可见行首行号、Sortcol()对指定进行排序、sortrow()对指定行排序、PageHeader...Text和PageFooter...Text...
  • 1,效果图(1)原始的数据只有两列,我们在最前面又插入个序号,里面的序号是自动生成的。(2)翻页后序号也会随之变化。(3)注意序号不是和数据绑定的。也就是说不管是搜索还是排序后,虽然里面数据顺序发生了变化,...

    二十五、自动添加行号

    有时我们会希望表格能自动在每行数据的前面增加行序号,这样可以更方便地查看数据。下面通过样例演示这个功能如何实现。

    1,效果图

    (1)原始的数据只有两列,我们在最前面又插入一个序号列,里面的序号是自动生成的。

    (2)翻页后序号也会随之变化。

    (3)注意序号不是和数据绑定的。也就是说不管是搜索还是排序后,虽然里面数据顺序发生了变化,但序号仍然是不变的。

    2,样例代码

    $(document).ready(function() {

    //获取表格Api对象

    var table = $('#myTable').DataTable({

    "ajax": "data.txt",

    "pageLength": 5,

    "columnDefs": [{

    "searchable": false,

    "orderable": false,

    "targets": 0 //序号列不能排序也不能搜索

    }],

    "columns": [

    { data: null},

    { data: 'name'},

    { data: 'birthday'}

    ],

    "order": [[ 1, 'asc' ]] //默认按姓名列排序

    });

    //自动给第一列设置行号

    table.on('order.dt search.dt', function () {

    table.column(0, {search:'applied', order:'applied'}).nodes().each(

    function (cell, i) {

    cell.innerHTML = i+1;

    }

    );

    }).draw();

    });

    序号姓名出生日期

    数据文件(data.txt)如下:

    {

    "data": [

    {

    "name": "张三",

    "birthday": "2015-12-31"

    },

    {

    "name": "李四",

    "birthday": "2001-11-31"

    },

    {

    "name": "王五",

    "birthday": "2011-12-31"

    },

    {

    "name": "王五",

    "birthday": "2010-01-01"

    },

    {

    "name": "赵六",

    "birthday": "2100-06-31"

    },

    {

    "name": "赵七",

    "birthday": "2011-12-31"

    },

    {

    "name": "赵八",

    "birthday": "2008-08-08"

    },

    {

    "name": "赵九",

    "birthday": "2042-04-08"

    }

    ]

    }

    展开全文
  • 增加复杂性,请将其附加最后表格列前面。 初始表: 预期表: 此任务中,我们不提供详细说明。 但是下面是一些提示,提示如何执行此任务: JavaScript文档具有使用表的方法。 开始查看表结构之前...
  • <br>列锁定,你可以指定表格最前面多少列是不允许横向滚动的。 <br>标题锁定,假如需要纵向滚动,表格标题不会被隐藏。 <br>简洁强大的列模型定义:你可以指定每一列数据来源、值类型、列宽度、列align...
  • 人力资源管理软件(完全免费)

    热门讨论 2011-03-08 11:36:20
    人力资源管理软件手工打卡界面增加一个日期时间显示;(感谢明月) 考勤出差记录体现分公司信息 考勤请假记录体现分公司信息(感谢我就是我) 考勤调休记录体现分公司信息 考勤加班记录体现分公司信息 考勤缺勤记录...
  • 这个表格有四,分别是文件后缀,文件目前编码,转换后的编码,是否转换文件内容,如果转换文件内容,那么对应的是前面所说的第二种情况,不转换文件内容对应的是第种情况。比如图2的转码规则就是对项目的jsp文件...
  • 21.8 将某行排在表格的最后 21.9 动态删除页面中的元素 21.10 克隆表格 21.11 拖动表格行改变顺序 21.12 表格操作常用方法 第22章 流行应用:AJAX和Property的应用技巧 22.1 实现关机效果的界面 22.2 关机特效(二)...
  • 400个DreamWeaver插件

    2013-03-28 15:30:13
    mxp/file菜单下增加一个新的命令,可以出最近编辑的几个文件。就好象Windows开始菜单中的“文档” mxp/现在的插件真是不得了!我恨不的给每个插件都打上5分。这个插件可以做一段Flash动画,用来演示目标文件夹下...
  • 表格编号的作法与图相同,唯一不同的是表格的题注在表格上方,且要求左对齐。 公式的编号略有不同,插入公式后,将公式单独放在个段落,版式为“嵌入式”(Word默认),光标放在公式之后,不要(注意是“不要”...
  • 这个表格有四,分别是文件后缀,文件目前编码,转换后的编码,是否转换文件内容,如果转换文件内容,那么对应的是前面所说的第二种情况,不转换文件内容对应的是第种情况。比如图2的转码规则就是对项目的jsp文件...
  • 21.8 将某行排在表格的最后 21.9 动态删除页面中的元素 21.10 克隆表格 21.11 拖动表格行改变顺序 21.12 表格操作常用方法 第22章 流行应用:AJAX和Property的应用技巧 22.1 实现关机效果的界面 22.2 关机特效(二)...
  • windows 程序设计

    2011-07-24 21:16:30
    连结程序使用该信息.EXE文件中建立表格加载程序时,Windows使用它将呼叫转换为Windows函数。 WINDOWS程序设计选项 为说明Windows程序设计的多种技术,本书提供了许多范例程序。这些程序使用C语言撰写并...
  • Linux的早起源是1991年10月5日由位芬兰的大学生Linux Torvalds (Torvalds@kruuna.helsinki.fi)写了 Linux核心程序的 0.02 版开始的,但其后的发展却几乎都 是由互联网上的 Linux社团(Linux Community)互通...
  • 这个表格有四,分别是文件后缀,文件目前编码,转换后的编码,是否转换文件内容,如果转换文件内容,那么对应的是前面所说的第二种情况,不转换文件内容对应的是第种情况。比如图2的转码规则就是对项目的jsp文件...
  • 2、打开excel或者wps表格,选取数据范围,注意列头是第一列,然后复制。 3、新建空白文本文件,粘贴,保存,更名(选项名称),改后缀(.dat)。 4、将新的文件用你常用的上传手段上传至网站数据库目录下,选项...
  •  Oracle 数据库中的SQL是当今市场上功能强大的SQL实现之,而本书全面展示了这工具的威力。如何才能让更多人有效地学习和掌握SQL呢?Karen Morton及其团队本书中提供了专业的方案:先掌握语言特性,再学习...
  • 2009达内SQL学习笔记

    2010-02-10 19:46:58
    如果想多个上进行排序,必须对每个指定DESC关键字。 升序是默认的,可不写,但降序必须写。 六、WHERE子句,选择、过滤 其后只能跟逻辑语句,返回值只有ture或false 如: select last_name,salary from s...
  •  Oracle 数据库中的SQL是当今市场上功能强大的SQL实现之,而本书全面展示了这工具的威力。如何才能让更多人有效地学习和掌握SQL呢?Karen Morton及其团队本书中提供了专业的方案:先掌握语言特性,再学习...
  • 商城默认中的用户积分和预存款兑换比率一直是比二,很多用户不知如何修改,本次更新中增加了用户积分和预存款兑换比率设置,后台可以方便的设置兑换比率,方便用户进行修改设置。 二六、帮助中心栏目无限量...
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    第1章 开发环境 1 1.1 环境设置 2 0001 如何定制工具栏 2 ...0296 如何屏幕最前面显示滚动字幕 192 0297 制作磁性窗体 193 0298 制作浮动窗口 194 0299 制作另类提示窗口 195 0300 将窗体...
  • 第1章 开发环境 1 1.1 环境设置 2 0001 如何定制工具栏 2 ...0296 如何屏幕最前面显示滚动字幕 192 0297 制作磁性窗体 193 0298 制作浮动窗口 194 0299 制作另类提示窗口 195 0300 将窗体...
  • 第1章 开发环境 1 1.1 环境设置 2 0001 如何定制工具栏 2 ...0296 如何屏幕最前面显示滚动字幕 192 0297 制作磁性窗体 193 0298 制作浮动窗口 194 0299 制作另类提示窗口 195 0300 将窗体...
  • 第1章 开发环境 1 1.1 环境设置 2 0001 如何定制工具栏 2 ...0296 如何屏幕最前面显示滚动字幕 192 0297 制作磁性窗体 193 0298 制作浮动窗口 194 0299 制作另类提示窗口 195 0300 将窗体...
  • 第1章 开发环境 1 1.1 环境设置 2 0001 如何定制工具栏 2 ...0296 如何屏幕最前面显示滚动字幕 192 0297 制作磁性窗体 193 0298 制作浮动窗口 194 0299 制作另类提示窗口 195 0300 将窗体...

空空如也

空空如也

1 2 3
收藏数 55
精华内容 22
关键字:

在表格最前面增加一列