POI操作WORD图表组合图
组合图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/daa8926e42e547b43a3f83589ab36396.png)
需要引入的maven包
<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>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
public static void chart(ProjectTargetEntity projectTargetEntity, XWPFDocument document) throws IOException, InvalidFormatException {
String pdfFilePath = "templates/chart.docx";
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(pdfFilePath);
assert inputStream != null;
XWPFDocument doc = new XWPFDocument(inputStream);
List<FrequencyKPIValuesEntity> frequencyKPIValuesList = projectTargetEntity.getFrequencyKPIValuesList();
for (FrequencyKPIValuesEntity frequencyKPIValuesEntity : frequencyKPIValuesList) {
if (EmptyUtil.isFieldEmpty(frequencyKPIValuesEntity.getCurrentKPITargetValue())) {
frequencyKPIValuesEntity.setCurrentKPITargetValue("0");
}
if (EmptyUtil.isFieldEmpty(frequencyKPIValuesEntity.getCurrentKPIActualValue())) {
frequencyKPIValuesEntity.setCurrentKPIActualValue("0");
}
if (EmptyUtil.isFieldEmpty(frequencyKPIValuesEntity.getCurrentAchievingRate())) {
frequencyKPIValuesEntity.setCurrentAchievingRate("0");
}
}
replaceAll(doc, frequencyKPIValuesList);
XWPFChart chart = doc.getCharts().get(0);
CTChart ctChart = chart.getCTChart();
CTPlotArea plotArea = ctChart.getPlotArea();
XWPFChart chart2 = document.createChart(16 * Units.EMU_PER_CENTIMETER, 10 * Units.EMU_PER_CENTIMETER);
chart2.setWorkbook(chart.getWorkbook());
chart2.getCTChart().setPlotArea(plotArea);
chart2.getCTChart().setLegend(ctChart.getLegend());
doc.close();
}
public static void replaceAll(XWPFDocument doc, List<FrequencyKPIValuesEntity> frequencyKPIValuesList) throws FileNotFoundException {
doCharts(doc, frequencyKPIValuesList);
}
public static void doCharts(XWPFDocument doc, List<FrequencyKPIValuesEntity> frequencyKPIValuesList) throws FileNotFoundException {
List<String> titleArr = new ArrayList<String>();
titleArr.add("title");
titleArr.add("达成率");
titleArr.add("目标值");
titleArr.add("实际值");
List<String> fldNameArr = new ArrayList<String>();
fldNameArr.add("item1");
fldNameArr.add("item2");
fldNameArr.add("item3");
fldNameArr.add("item4");
List<Map<String, String>> listItemsByType = new ArrayList<Map<String, String>>();
Map<String, String> base1 = new HashMap<String, String>();
for (int i = 0; i < frequencyKPIValuesList.size(); i++) {
if (frequencyKPIValuesList.get(i).getCurrentKPIActualValue() != null) {
base1 = new HashMap<>();
base1.put("item1", frequencyKPIValuesList.get(i).getIndexName());
String rate = frequencyKPIValuesList.get(i).getCurrentAchievingRate();
if (rate.contains("%")) {
rate = rate.replaceAll("%", "");
}
double currentAchievingRate = 0.0;
try {
currentAchievingRate = Double.parseDouble(rate);
} catch (Exception e) {
e.printStackTrace();
}
base1.put("item2", currentAchievingRate + "");
base1.put("item3", frequencyKPIValuesList.get(i).getCurrentKPITargetValue());
base1.put("item4", frequencyKPIValuesList.get(i).getCurrentKPIActualValue());
listItemsByType.add(base1);
}
}
List<POIXMLDocumentPart> chartsList = new ArrayList<POIXMLDocumentPart>();
List<POIXMLDocumentPart> relations = doc.getRelations();
for (POIXMLDocumentPart poixmlDocumentPart : relations) {
if (poixmlDocumentPart instanceof XWPFChart) {
chartsList.add(poixmlDocumentPart);
}
}
POIXMLDocumentPart poixmlDocumentPart5 = chartsList.get(0);
PoiWordTools.replaceCombinationCharts(poixmlDocumentPart5, titleArr, fldNameArr, listItemsByType);
}
public static void replaceCombinationCharts(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();
CTLegend ctLegend = ctChart.addNewLegend();
ctLegend.addNewLegendPos().setVal(STLegendPos.B);
ctLegend.addNewOverlay().setVal(false);
CTBarChart barChart = plotArea.getBarChartArray(0);
List<CTBarSer> barSerList = barChart.getSerList();
refreshExcel(chart, listItemsByType, fldNameArr, titleArr);
refreshBarStrGraphContent(barChart, barSerList, listItemsByType, fldNameArr, titleArr, 1);
CTLineChart lineChart = plotArea.getLineChartArray(0);
List<CTLineSer> lineSerList = lineChart.getSerList();
refreshExcel(chart, listItemsByType, fldNameArr, titleArr);
refreshLineStrGraphContent(lineChart, lineSerList, listItemsByType, fldNameArr, titleArr, 2);
ctChart.setPlotArea(plotArea);
}
public static boolean refreshExcel(XWPFChart chart, List<Map<String, String>> dataList, List<String> fldNameArr, List<String> titleArr) {
boolean result = true;
Workbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet1");
for (int i = 0; i < titleArr.size(); i++) {
if (sheet.getRow(0) == null) {
sheet.createRow(0).createCell(i).setCellValue(titleArr.get(i) == null ? "" : titleArr.get(i));
} else {
sheet.getRow(0).createCell(i).setCellValue(titleArr.get(i) == null ? "" : titleArr.get(i));
}
}
for (int i = 0; i < dataList.size(); i++) {
Map<String, String> baseFormMap = dataList.get(i);
for (int j = 0; j < fldNameArr.size(); j++) {
if (sheet.getRow(i + 1) == null) {
if (j == 0) {
try {
sheet.createRow(i + 1).createCell(j).setCellValue(baseFormMap.get(fldNameArr.get(j)) == null ? "" : baseFormMap.get(fldNameArr.get(j)));
} catch (Exception e) {
if (baseFormMap.get(fldNameArr.get(j)) == null) {
sheet.createRow(i + 1).createCell(j).setCellValue("");
} else {
sheet.createRow(i + 1).createCell(j).setCellValue(baseFormMap.get(fldNameArr.get(j)));
}
}
}
} else {
double value = 0d;
if (isNumeric(baseFormMap.get(fldNameArr.get(j)))) {
BigDecimal b = new BigDecimal(baseFormMap.get(fldNameArr.get(j)));
value = b.doubleValue();
}
if (value == 0) {
sheet.getRow(i + 1).createCell(j);
} else {
sheet.getRow(i + 1).createCell(j).setCellValue(value);
}
}
}
}
POIXMLDocumentPart xlsPart = chart.getRelations().get(0);
OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream();
try {
wb.write(xlsOut);
xlsOut.close();
} catch (IOException e) {
e.printStackTrace();
result = false;
} finally {
if (wb != null) {
try {
wb.close();
} catch (IOException e) {
e.printStackTrace();
result = false;
}
}
}
return result;
}
public static boolean refreshLineStrGraphContent(Object typeChart, List<?> serList, List<Map<String, String>> dataList, List<String> fldNameArr, List<String> titleArr, int position) {
boolean result = true;
for (int i = 0; i < serList.size(); i++) {
CTAxDataSource cat = null;
CTNumDataSource val = null;
CTLineSer ser = ((CTLineChart) typeChart).getSerArray(i);
ser.getTx().getStrRef().getStrCache().getPtList().get(0).setV(titleArr.get(i + position));
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 (isNumeric(dataList.get(j).get(fldNameArr.get(i + position)))) {
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;
}
public static boolean refreshBarStrGraphContent(Object typeChart, List<?> serList, List<Map<String, String>> dataList, List<String> fldNameArr, List<String> titleArr, int position) {
boolean result = true;
for (int i = 0; i < serList.size(); i++) {
CTAxDataSource cat = null;
CTNumDataSource val = null;
CTBarSer ser = ((CTBarChart) typeChart).getSerArray(i);
ser.getTx().getStrRef().getStrCache().getPtList().get(0).setV(titleArr.get(i + position));
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;
BigDecimal bigDecimal = null;
for (int j = 0; j < dataList.size(); j++) {
String value = "0";
bigDecimal = new BigDecimal(dataList.get(j).get(fldNameArr.get(i + position)));
if (bigDecimal != null) {
value = bigDecimal.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;
}