ICE.ICE|

韩憨

园龄:4年7个月粉丝:42关注:47

easypoi4.3.0 word模板导出第一列非循环语句时导出为空解决方法

参考

https://blog.csdn.net/cheng137666/article/details/111279476

源码测试

 输出后

 数据无法循环

如何修改源码看自己怎么方便怎么来

比如1.下载源码自己打包再引入; 2.放到自己的私有服; 3.替换(最简单)。

 

 第一列非循环语句时导出为空解决方法

修改2个文件

debug查看到ParseWord07类中的parseThisTable方法,源码如下:

 

 

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

替换源码文件,在最上面找到包,这边需要替换2个文件

 

 在本地新建包,然后复制这2个文件到各自的包里面

如下:

 然后再修改需要更改的代码

ParseWord07类中 第 199行 方法 替换为下面的

/**
* 解析这个表格
*
* @param table
* @param map
* @author JueYue
* 2013-11-17
*/
private void parseThisTable(XWPFTable table, Map<String, Object> map) throws Exception {
XWPFTableRow row;
List<XWPFTableCell> cells;
Object listobj;
for (int i = 0; i < table.getNumberOfRows(); i++) {
row = table.getRow(i);
cells = row.getTableCells();
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 {
ExcelMapParse.parseNextRowAndAddRow(table, i, (List) listobj, col);
i = i + ((List) listobj).size() - 1;
}

}
}

 ExcelMapParse 类中 第144 方法替换为下面的

 /**
* 解析下一行,并且生成更多的行
*
* @param table
* @param index
* @param list
*/
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);
}

重启项目,再次测试

 结果

 大功告成

本文作者:韩憨

本文链接:https://www.cnblogs.com/hanby/p/16013973.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   韩憨  阅读(2159)  评论(0编辑  收藏  举报
//看板娘

剑桥

点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 隔离 (Studio Live Duet) 陈凯咏,林家谦
  2. 2 明知做戏 吴雨霏
  3. 3 残酷游戏 卫兰
  4. 4 你,好不好? 周兴哲
  5. 5 我可以 蔡旻佑
  6. 6 云烟成雨 房东的猫
  7. 7 说散就散 JC 陈咏桐
  8. 8 我配不上你 夏天Alex
  9. 9 不再联系 夏天Alex
  10. 10 等我先说 夏天Alex
  11. 11 我知道他爱你 夏天Alex
  12. 12 多想在平庸的生活拥抱你 隔壁老樊
  13. 13 这一生关于你的风景 隔壁老樊
  14. 14 我曾 隔壁老樊
  15. 15 关于孤独我想说的话 隔壁老樊
  16. 16 过客 周思涵
  17. 17 备爱 周思涵
  18. 18 嚣张 en
  19. 19 海口 后弦
你,好不好? - 周兴哲
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 周兴哲/吴易纬

作曲 : 周兴哲

编曲:陈建骐

是不是 还那么爱迟到

熬夜工作又睡不好

等你完成你的目标

要戒掉逞强的嗜好

都怪我

把自尊放太高

没有把你照顾好

骄傲是脆弱的外表

最怕我的心你不要

能不能继续对我哭

对我笑对我好

继续让我为你想

为你疯陪你老

你好不好好想知道

别急着把回忆都丢掉

我只需要你在身边

陪我吵陪我闹

用好的我

把过去坏的我都换掉

好想听到你坚决说爱我

可惜回不去那一秒

你 好不好

天知道我快要受不了

后悔 钻进心里烧

拥抱 再多一次就好

你要的我都做得到

能不能继续对我哭

对我笑 对我好

继续让我为你想

为你疯 陪你老

给你的好还要不要

答案我却不敢揭晓

我只需要你在身边

陪我吵 陪我闹

别用离开教我

失去的人最重要

别说 你曾经爱过我

让我们回到那一秒

你好不好

能不能继续对我哭

对我笑 对我好

继续让我为你想

为你疯 陪你老

你好不好 我好想知道

别急着把我的爱丢掉

我只需要你在身边

陪我吵 陪我闹

别用离开教我

失去的人最重要

别说 你曾经爱过我

让我们回到那一秒

你 好不好?