本文参考地址:https://blog.csdn.net/wangxiaoyingWXY/article/details/95377533
本文参考地址:https://blog.csdn.net/u014427811/article/details/100771314#comments
感谢大佬们的详解
1、目前遇到的问题是当修改文档内的图表,导出的文档微软office打不开,wps却可以。我得是因为添加图例出问题了所以打不开。
建议定位出问题的地方,比如我定位到更换图表打不开之后定位到了具体是图例出了问题。记录一下也给大家一个参考。
------------------------------------------------------------追加解决方式------------------------------------------------------------------------------
定位到是刷新内置excel有问题,我直接注释掉了。图表能显示 word也可以用微软打开了。。。
之后精确定位是增加柱状图图例出了问题。但是据说poi4没有word对柱状图图例的操作,最后解决办法只能预先写好图例。
另外刷新柱状图页面数据建议下面这个
/**
* 刷新柱状图数据方法
*
* @param typeChart
* @param serList
* @param dataList
* @param fldNameArr
* @param position
* @return
*/
public static boolean refreshBarStrGraphContent(Object typeChart,
List<?> serList, List<Map<String, String>> dataList, List<String> fldNameArr, int position) {
boolean result = true;
//更新数据区域
for (int i = 0; i < serList.size(); i++) {
//CTSerTx tx=null;
CTAxDataSource cat = null;
CTNumDataSource val = null;
CTBarSer ser = ((CTBarChart) typeChart).getSerArray(i);
//tx= ser.getTx();
// Category Axis Data
cat = ser.getCat();
// 获取图表的值
val = ser.getVal();
// strData.set
CTStrData strData = cat.getStrRef().getStrCache();
CTNumData numData = val.getNumRef().getNumCache();
strData.setPtArray((CTStrVal[]) null); // unset old axis text
numData.setPtArray((CTNumVal[]) null); // unset old values
// set model
long idx = 0;
for (int j = 0; j < dataList.size(); j++) {
//判断获取的值是否为空
String value = "0";
if (new BigDecimal(dataList.get(j).get(fldNameArr.get(i + position))) != null) {
value = new BigDecimal(dataList.get(j).get(fldNameArr.get(i + position))).toString();
}
if (!"0".equals(value)) {
CTNumVal numVal = numData.addNewPt();//序列值
numVal.setIdx(idx);
numVal.setV(value);
}
CTStrVal sVal = strData.addNewPt();//序列名称
sVal.setIdx(idx);
sVal.setV(dataList.get(j).get(fldNameArr.get(0)));
idx++;
}
numData.getPtCount().setVal(idx);
strData.getPtCount().setVal(idx);
//赋值横坐标数据区域
String axisDataRange = new CellRangeAddress(1, dataList.size(), 0, 0)
.formatAsString("Sheet1", true);
cat.getStrRef().setF(axisDataRange);
//数据区域
String numDataRange = new CellRangeAddress(1, dataList.size(), i + position, i + position)
.formatAsString("Sheet1", true);
val.getNumRef().setF(numDataRange);
}
return result;
}
2、之前遇到有的字段可以替换有的不行
解决方式是每个需要替换的字段及标识符号需要重头到尾手动写出来,不能复制粘贴!!!!主要是因为里面字段识别符号和你需要替换的单词分开了。最新思路是自己将替换自己识别字段组合起来,这样就比较正常了。不像原版替换比较魔性没有规律。
关于文档内容无法替换建议参考