1.导入jar包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.0</version>
</dependency>
2.准备word文件
在word文件中创建一个图表并设计好需要的样式
3.编写工具类
public static void replaceChart(POIXMLDocumentPart poixmlDocumentPart,
List<String> titleArr, List<String> fldNameArr, List<Map<String, String>> listItemsByType) {
XWPFChart chart = (XWPFChart) poixmlDocumentPart;
chart.getCTChart();
//根据属性第一列名称切换数据类型
CTChart ctChart = chart.getCTChart();
CTPlotArea plotArea = ctChart.getPlotArea();
//柱状图
//CTBarChart barChart = plotArea.getBarChartArray(0);
//List<CTBarSer> BarSerList = barChart.getSerList(); // 获取柱状图单位
//折线图
CTLineChart lineChart = plotArea.getLineChartArray(0);
List<CTLineSer> lineSerList = lineChart.getSerList(); // 获取折线图单位
//刷新柱状图
//refreshStrGraphContent(barChart, BarSerList, listItemsByType, fldNameArr, 1);
//刷新折线图
refreshGraphContent(lineChart, lineSerList, listItemsByType, fldNameArr, 1);
}
public static void refreshStrGraphContent(Object typeChart,
List<?> serList, List<Map<String, String>> dataList, List<String> fldNameArr, int position) {
//更新数据区域
for (int i = 0; i < serList.size(); i++) {
CTAxDataSource cat = null;
CTNumDataSource val = null;
//折线图
CTLineSer ser = ((CTLineChart) typeChart).getSerArray(i);
//柱状图
//CTBarSer ser = ((CTBarChart) typeChart).getSerArray(i);
cat = ser.getCat();
// 获取图表的值
val = ser.getVal();
CTStrData strData = cat.getStrRef().getStrCache();
CTNumData numData = val.getNumRef().getNumCache();
strData.setPtArray((CTStrVal[]) null);
numData.setPtArray((CTNumVal[]) null);
long idx = 0;
for (int j = 0; j < dataList.size(); j++) {
//判断获取的值是否为空
String value = "0";
if (dataList.get(j).get(fldNameArr.get(i + position)) != null) {
value = new BigDecimal(dataList.get(j).get(fldNameArr.get(i + position))).toString();
}
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);
}
}
4.写测试类进行测试效果
try {
XWPFDocument xwpfDocument = new XWPFDocument(new FileInputStream(""));
List<XWPFChart> charts = xwpfDocument.getCharts();
//获取第几个图表
XWPFChart xwpfChart = charts.get(0);
List<String> fldNameArr = new ArrayList<>();
//对应列数
fldNameArr.add("date");
fldNameArr.add("data");
List<String> titleArr = new ArrayList<>();
titleArr.add("");
ArrayList<Map<String, String>> maps = new ArrayList<>();
for (int i = 20150101; i < 20150131; i++) {
Map<String, String> map = new HashMap<>();
map.put("date",String.valueOf(i));
map.put("data", BigDecimal.valueOf(Math.random() * 10).setScale(2,BigDecimal.ROUND_HALF_UP).toString());
maps.add(map);
}
replaceChart(xwpfChart,titleArr,fldNameArr,maps);
xwpfDocument.write(new FileOutputStream(""));
} catch (IOException e) {
throw new RuntimeException(e);
}
5.总结
因有些需求中的图表需要添加各种形状和文本输入框,这种方式只能更新图表的展示,没有更新内置excel内容。因更新excel内容可能会导致模板中图表的样式丢失。如有更好的方法,请大家多多评论