diff --git a/hzims-service/operational/pom.xml b/hzims-service/operational/pom.xml
index 8ed6b02..8e5a5fd 100644
--- a/hzims-service/operational/pom.xml
+++ b/hzims-service/operational/pom.xml
@@ -92,6 +92,22 @@
cn.afterturn
easypoi-base
+
+
+ org.apache.poi
+ ooxml-schemas
+ 1.4
+
+
+ org.jfree
+ jcommon
+ 1.0.24
+
+
+ org.jfree
+ jfreechart
+ 1.5.0
+
cn.afterturn
easypoi-annotation
@@ -226,7 +242,6 @@
-
diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/main/controller/AreaMonthReportController.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/main/controller/AreaMonthReportController.java
index 40733fc..a5973f1 100644
--- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/main/controller/AreaMonthReportController.java
+++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/main/controller/AreaMonthReportController.java
@@ -1,11 +1,14 @@
package com.hnac.hzims.operational.main.controller;
+import cn.afterturn.easypoi.entity.ImageEntity;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.hnac.hzims.common.logs.annotation.OperationAnnotation;
import com.hnac.hzims.common.logs.enums.BusinessType;
import com.hnac.hzims.common.logs.enums.OperatorType;
import com.hnac.hzims.operational.main.service.IAreaMonthReportService;
import com.hnac.hzims.operational.main.vo.AreaMonthReportVo;
+import com.hnac.hzims.operational.util.JFreeUtil;
+import com.hnac.hzims.operational.util.WordUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
@@ -21,7 +24,9 @@ import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotNull;
+import java.util.ArrayList;
import java.util.Date;
+import java.util.HashMap;
import java.util.List;
@RestController
@@ -31,36 +36,82 @@ import java.util.List;
@Slf4j
public class AreaMonthReportController extends BladeController {
- @NotNull
- private final IAreaMonthReportService service;
+ @NotNull
+ private final IAreaMonthReportService service;
- @ApiLog
- @ApiOperationSupport(order = 1)
- @ApiOperation("生成区域月报")
- @GetMapping("/loadMonthReport")
- public R loadMonthReport() {
- service.loadMonthReport(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"),1);
- return R.success("success");
- }
+ @ApiLog
+ @ApiOperationSupport(order = 1)
+ @ApiOperation("生成区域月报")
+ @GetMapping("/loadMonthReport")
+ public R loadMonthReport() {
+ service.loadMonthReport(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"), 1);
+ return R.success("success");
+ }
- @ApiLog
- @ApiOperationSupport(order = 2)
- @ApiOperation("获取区域月报")
- @GetMapping("/getAreaMonthReport")
- @OperationAnnotation(
- moduleName = "生产月报",
- title = "水电生产运行月报",operatorType = OperatorType.MOBILE,businessType = BusinessType.GENCODE,
- action = "获取区域月报")
- public R> getAreaMonthReport(@ApiParam(value = "日期-年月", required = true) String date) {
- return service.getReport(date);
- }
+ @ApiLog
+ @ApiOperationSupport(order = 2)
+ @ApiOperation("获取区域月报")
+ @GetMapping("/getAreaMonthReport")
+ @OperationAnnotation(
+ moduleName = "生产月报",
+ title = "水电生产运行月报", operatorType = OperatorType.MOBILE, businessType = BusinessType.GENCODE,
+ action = "获取区域月报")
+ public R> getAreaMonthReport(@ApiParam(value = "日期-年月", required = true) String date) {
+ return service.getReport(date);
+ }
- @ApiLog
- @ApiOperationSupport(order = 3)
- @ApiOperation("导出区域月报")
- @GetMapping("/exportAreaMonthReport")
- public R exportAreaMonthReport(HttpServletResponse response,@ApiParam(value = "日期-年月", required = true) String date) {
- return service.export(response,date);
- }
+ @ApiLog
+ @ApiOperationSupport(order = 3)
+ @ApiOperation("导出区域月报")
+ @GetMapping("/exportAreaMonthReport")
+ public R exportAreaMonthReport(HttpServletResponse response, @ApiParam(value = "日期-年月", required = true) String date) {
+ return service.export(response, date);
+ }
+
+ @ApiLog
+ @ApiOperationSupport(order = 3)
+ @ApiOperation("测试导出模板相关数据")
+ @GetMapping("/exportAreaMonthReport3333")
+ public R exportAreaMonthReport333(HttpServletResponse response, @ApiParam(value = "日期-年月", required = true) String date) {
+ HashMap map = new HashMap<>(4);
+
+ //模拟饼状图数据
+ HashMap datas = new HashMap<>(3);
+ datas.put("华自", 10);
+ datas.put("华自二号", 20);
+ datas.put("华自三号", 40);
+ ImageEntity imageEntity = JFreeUtil.pieChart("测试", datas, 300, 200);
+ map.put("picture", imageEntity);
+ //模拟柱状图图数据
+ String[] monthArray = {"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月"};
+ double[] value = {20, 30, 25, 50, 40, 25, 50, 40};
+ ImageEntity lineEntity = JFreeUtil.lineChart("测试111", monthArray, value,300, 200);
+ map.put("lineEntity", lineEntity);
+
+ //模拟其它普通数据
+ map.put("username", "张三");
+ map.put("date", "2019-10-10");
+ map.put("desc", "测试");
+ map.put("boo", true);
+
+ //模拟表格数据
+ ArrayList> list = new ArrayList<>(2);
+ HashMap temp = new HashMap<>(3);
+ temp.put("sn", "1");
+ temp.put("name", "第一个人");
+ temp.put("age", "23");
+ list.add(temp);
+ temp = new HashMap<>(3);
+ temp.put("sn", "2");
+ temp.put("name", "第二个人");
+ temp.put("age", "24");
+ list.add(temp);
+ map.put("personlist", list);
+// //todo
+// map.put("personlist", list);
+ //word模板相对路径、word生成路径、word生成的文件名称、数据源
+ WordUtils.exportWord("template/demo2.docx", "F:/", "生成文件.docx", map);
+ return R.success("测试成功");
+ }
}
diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/JFreeUtil.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/JFreeUtil.java
new file mode 100644
index 0000000..a6b7fa9
--- /dev/null
+++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/JFreeUtil.java
@@ -0,0 +1,712 @@
+package com.hnac.hzims.operational.util;
+
+import cn.afterturn.easypoi.entity.ImageEntity;
+import cn.hutool.core.lang.Assert;
+import lombok.extern.slf4j.Slf4j;
+import org.jfree.chart.ChartFactory;
+import org.jfree.chart.ChartUtils;
+import org.jfree.chart.JFreeChart;
+import org.jfree.chart.StandardChartTheme;
+import org.jfree.chart.axis.CategoryAxis;
+import org.jfree.chart.axis.NumberAxis;
+import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
+import org.jfree.chart.plot.CategoryPlot;
+import org.jfree.chart.plot.PiePlot;
+import org.jfree.chart.renderer.category.BarRenderer;
+import org.jfree.chart.renderer.category.CategoryItemRenderer;
+import org.jfree.chart.renderer.category.LineAndShapeRenderer;
+import org.jfree.data.category.DefaultCategoryDataset;
+import org.jfree.data.general.DefaultPieDataset;
+
+import java.awt.*;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Map;
+
+@Slf4j
+public class JFreeUtil {
+
+ private static String tempImgPath = "D:\\tempJfree.jpeg";
+ private static String tempImgPath2 = "D:\\tempJfree2.jpeg";
+
+ /**
+ * 将图片转化为字节数组
+ *
+ * @return 字节数组
+ */
+ private static byte[] imgToByte(String tempImgPath) {
+ File file = new File(tempImgPath);
+ byte[] buffer = null;
+ try {
+ FileInputStream fis = new FileInputStream(file);
+ ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
+ byte[] b = new byte[1000];
+ int n;
+ while ((n = fis.read(b)) != -1) {
+ bos.write(b, 0, n);
+ }
+ fis.close();
+ bos.close();
+ buffer = bos.toByteArray();
+ } catch (IOException e) {
+ log.error(e.getMessage());
+ }
+ //删除临时文件
+ file.delete();
+ return buffer;
+ }
+
+ public static ImageEntity pieChart(String title, Map datas, int width, int height) {
+
+ //创建主题样式
+ StandardChartTheme standardChartTheme = new StandardChartTheme("CN");
+ //设置标题字体
+ standardChartTheme.setExtraLargeFont(new Font("宋体", Font.BOLD, 20));
+ //设置图例的字体
+ standardChartTheme.setRegularFont(new Font("宋体", Font.PLAIN, 15));
+ //设置轴向的字体
+ standardChartTheme.setLargeFont(new Font("宋体", Font.PLAIN, 15));
+ //设置主题样式
+ ChartFactory.setChartTheme(standardChartTheme);
+
+ //根据jfree生成一个本地饼状图
+ DefaultPieDataset pds = new DefaultPieDataset();
+ datas.forEach(pds::setValue);
+ //图标标题、数据集合、是否显示图例标识、是否显示tooltips、是否支持超链接
+ JFreeChart chart = ChartFactory.createPieChart(title, pds, true, false, false);
+ //设置抗锯齿
+ chart.setTextAntiAlias(false);
+ PiePlot plot = (PiePlot) chart.getPlot();
+ plot.setNoDataMessage("暂无数据");
+ //忽略无值的分类
+ plot.setIgnoreNullValues(true);
+ plot.setBackgroundAlpha(0f);
+ //设置标签阴影颜色
+ plot.setShadowPaint(new Color(255, 255, 255));
+ //设置标签生成器(默认{0})
+ plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}({1})/{2}"));
+ try {
+ ChartUtils.saveChartAsJPEG(new File(tempImgPath), chart, width, height);
+ } catch (IOException e1) {
+ log.error("生成饼状图失败!");
+ }
+ ImageEntity imageEntity = new ImageEntity(imgToByte(tempImgPath), width, height);
+ Assert.notNull(imageEntity.getData(), "生成饼状图对象失败!");
+ return imageEntity;
+ }
+// public static ImageEntity lineChart(String title, Map datas, int width, int height) {
+//
+// //创建主题样式
+// StandardChartTheme standardChartTheme = new StandardChartTheme("CN");
+// //设置标题字体
+// standardChartTheme.setExtraLargeFont(new Font("宋体", Font.BOLD, 20));
+// //设置图例的字体
+// standardChartTheme.setRegularFont(new Font("宋体", Font.PLAIN, 15));
+// //设置轴向的字体
+// standardChartTheme.setLargeFont(new Font("宋体", Font.PLAIN, 15));
+// //设置主题样式
+// ChartFactory.setChartTheme(standardChartTheme);
+//
+// //根据jfree生成一个本地饼状图
+// DefaultPieDataset pds = new DefaultPieDataset();
+// datas.forEach(pds::setValue);
+// LineAndShapeRenderer pdsLine = new LineAndShapeRenderer();
+// datas.forEach(pdsLine::setValue);
+// //图标标题、数据集合、是否显示图例标识、是否显示tooltips、是否支持超链接
+// JFreeChart chart = ChartFactory.createPieChart(title, pds, true, false, false);
+// JFreeChart chart2 = ChartFactory.createLineChart(title, pdsLine, true, false, false);
+// //设置抗锯齿
+// chart.setTextAntiAlias(false);
+// PiePlot plot = (PiePlot) chart.getPlot();
+// plot.setNoDataMessage("暂无数据");
+// //忽略无值的分类
+// plot.setIgnoreNullValues(true);
+// plot.setBackgroundAlpha(0f);
+// //设置标签阴影颜色
+// plot.setShadowPaint(new Color(255,255,255));
+// //设置标签生成器(默认{0})
+// plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}({1})/{2}"));
+// try {
+// ChartUtils.saveChartAsJPEG(new File(tempImgPath), chart, width, height);
+// } catch (IOException e1) {
+// log.error("生成饼状图失败!");
+// }
+// ImageEntity imageEntity = new ImageEntity(imgToByte(), width, height);
+// Assert.notNull(imageEntity.getData(),"生成饼状图对象失败!");
+// return imageEntity;
+// }
+
+ public static ImageEntity lineChart( String title,String[] monthArray,double[] value,int width, int height) {
+ // 创建数据
+ DefaultCategoryDataset dataset = new DefaultCategoryDataset();
+ dataset.addValue(1.0, "A", "Ⅰ");
+ dataset.addValue(3.0, "A", "Ⅱ");
+ dataset.addValue(5.0, "A", "Ⅲ");
+ dataset.addValue(5.0, "A", "Ⅳ");
+ dataset.addValue(5.0, "B", "Ⅰ");
+ dataset.addValue(6.0, "B", "Ⅱ");
+ dataset.addValue(10.0, "B", "Ⅲ");
+ dataset.addValue(4.0, "B", "Ⅳ");
+
+ // 创建CategoryPlot对象
+ CategoryPlot plot = new CategoryPlot();
+
+ // 添加第一个数据集并渲染为line
+ CategoryItemRenderer lineRenderer = new LineAndShapeRenderer();
+ plot.setDataset(0, dataset);
+ plot.setRenderer(0, lineRenderer);
+
+ // 添加第二个数据集并渲染为线条bar
+ CategoryItemRenderer baRenderer = new BarRenderer();
+ plot.setDataset(1, dataset);
+ plot.setRenderer(1, baRenderer);
+
+ // 设置坐标轴
+ plot.setDomainAxis(new CategoryAxis("Time"));
+ plot.setRangeAxis(new NumberAxis("Value"));
+
+ // 创建JFreeChart对象
+ JFreeChart chart = new JFreeChart(plot);
+
+ try {
+ ChartUtils.saveChartAsJPEG(new File(tempImgPath2), chart, width, height);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ ImageEntity imageEntity = new ImageEntity(imgToByte(tempImgPath2), width, height);
+ Assert.notNull(imageEntity.getData(),"生成饼状图对象失败!");
+ return imageEntity;
+ }
+// public static ImageEntity lineChart( String title,String[] monthArray,double[] value,int width, int height) {
+// //如果不使用Font,中文将显示不出来
+// Font font = new Font("新宋体", Font.BOLD, 15);
+// // 创建数据
+// Map> datas = new HashMap>();
+// for (int i = 0; i < monthArray.length; i++) {
+// Map map = new HashMap();
+// map.put("故障数量", value[i]);
+// datas.put(monthArray[i], map);
+// }
+// JFreeChart chart = createLineChart(title, datas, "月份", "故障次数(次)", font);
+// try {
+// ChartUtils.saveChartAsJPEG(new File(tempImgPath), chart, 800, 600);
+// } catch (IOException e) {
+// e.printStackTrace();
+// }
+// ImageEntity imageEntity = new ImageEntity(imgToByte(), 800, 600);
+// Assert.notNull(imageEntity.getData(),"生成饼状图对象失败!");
+// return imageEntity;
+// }
+//
+// public static JFreeChart createLineChart(String title, Map> data, String type, String unit, Font font) {
+// try {
+// DefaultCategoryDataset ds = new DefaultCategoryDataset();
+// Set>> set1 = data.entrySet();
+// Iterator iterator1 = set1.iterator();
+// Iterator iterator2;
+// HashMap map;
+// Set> set2;
+// Map.Entry entry1;
+// Map.Entry entry2;
+// while (iterator1.hasNext()) {
+// entry1 = (Map.Entry) iterator1.next();
+// map = (HashMap) entry1.getValue();
+// set2 = map.entrySet();
+// iterator2 = set2.iterator();
+// while (iterator2.hasNext()) {
+// entry2 = (Map.Entry) iterator2.next();
+// ds.setValue(Double.parseDouble(entry2.getValue().toString()), entry2.getKey().toString(), entry1.getKey().toString());
+// }
+// }
+//
+// //创建折线图,折线图分水平显示和垂直显示两种
+// // //2D折线图
+// JFreeChart chart = ChartFactory.createLineChart(title, type, unit, ds, PlotOrientation.VERTICAL, true, true, true);
+// // //3D折线图
+//// JFreeChart chart2 = ChartFactory.createLineChart3D(title, type, unit, ds, PlotOrientation.VERTICAL, true, true, false);
+//
+// //设置整个图片的标题字体
+// chart.getTitle().setFont(font);
+//
+// //设置提示条字体
+// font = new Font("宋体", Font.BOLD, 15);
+// chart.getLegend().setItemFont(font);
+//
+// //得到绘图区
+// CategoryPlot plot = (CategoryPlot) chart.getPlot();
+// //得到绘图区的域轴(横轴),设置标签的字体
+// plot.getDomainAxis().setLabelFont(font);
+//
+// // 设置背景透明度
+// plot.setBackgroundAlpha(0.1f);
+// // 设置网格横线颜色
+// plot.setRangeGridlinePaint(Color.gray);
+// // 设置网格横线大小
+// plot.setDomainGridlineStroke(new BasicStroke(0.2F));
+// plot.setRangeGridlineStroke(new BasicStroke(0.2F));
+//
+// //设置横轴标签项字体
+// plot.getDomainAxis().setTickLabelFont(font);
+//
+// // 生成折线图上的数字
+// //绘图区域(红色矩形框的部分)
+// LineAndShapeRenderer lineAndShapeRenderer = (LineAndShapeRenderer) plot.getRenderer();
+// lineAndShapeRenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
+// //设置图表上的数字可见
+// lineAndShapeRenderer.setBaseItemLabelsVisible(true);
+// //设置图表上的数字字体
+// lineAndShapeRenderer.setBaseItemLabelFont(new Font("宋体", Font.BOLD, 15));
+//
+// //设置折线图拐角上的正方形
+// //创建一个正方形
+// Rectangle shape = new Rectangle(4, 4);
+// lineAndShapeRenderer.setSeriesShape(0, shape);
+// //设置拐角上图形可见
+// lineAndShapeRenderer.setSeriesShapesVisible(0, true);
+//
+// /*// 获取显示线条的对象
+// LineAndShapeRenderer lasp = (LineAndShapeRenderer) plot.getRenderer();
+// // 设置拐点是否可见/是否显示拐点
+// lasp.setBaseShapesVisible(true);
+// // 设置拐点不同用不同的形状
+// lasp.setDrawOutlines(true);
+// // 设置线条是否被显示填充颜色
+// lasp.setUseFillPaint(true);
+// // 设置拐点颜色
+// lasp.setBaseFillPaint(Color.blue);//蓝色*/
+// //设置范围轴(纵轴)字体
+// font = new Font("宋体", Font.BOLD, 18);
+// plot.getRangeAxis().setLabelFont(font);
+//// plot.setForegroundAlpha(1.0f);
+// return chart;
+// } catch (Exception e) {
+// e.printStackTrace();
+// return null;
+// }
+// }
+//
+// /**
+// * 生成折线图
+// * 1.解析数据
+// * 2.迭代数据,产出图片数据流,并添加到List
+// *
+// * @throws IOException
+// */
+// public ArrayList createLineAndShapeChart(double[][] data, String[] rowKeys, String[] columnKeys, ChartEntity entity) throws IOException {
+// ArrayList list = new ArrayList();
+// byte[] bytes = new byte[]{};
+// // 解析数据
+// Map map = this.parseDataForBarPage(data, rowKeys, columnKeys);
+// int pageNum = Integer.parseInt("" + map.get("pageNum"));
+// // 迭代,产生图片数据流
+// for (int i = 0; i < pageNum; i++) {
+// bytes = createSingleLineAndShapeChart((double[][]) (map.get("data" + i)), (String[]) (map.get("rowKeys" + i)),
+// (String[]) (map.get("columnKeys" + i)), entity);
+// list.add(bytes);
+// }
+// return list;
+// }
+//
+// /**
+// * 生成单个折线图数据流
+// *
+// * @param data
+// * @param rowKeys
+// * @param columnKeys
+// * @param entity
+// * @return
+// * @throws IOException
+// */
+// public byte[] createSingleLineAndShapeChart(double[][] data, String[] rowKeys, String[] columnKeys, ChartEntity entity) throws IOException {
+// CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
+// JFreeChart chart = createTimeXYChar(dataset, entity);
+// byte[] bytes = this.createImage(chart, entity);
+// return bytes;
+// }
+//
+//
+// /**
+// * 生成柱状图
+// * 1.解析数据
+// * 2.迭代数据,产出图片数据流,并添加到List
+// *
+// * @param data 数据
+// * @param rowKeys 行
+// * @param columnKeys 列
+// * @param entity 图片配置对象
+// * @return 包含多个图片数据流的List
+// * @throws IOException
+// */
+// public ArrayList createStackedBarChart(double[][] data, String[] rowKeys, String[] columnKeys, ChartEntity entity) throws IOException {
+// // 解析数据
+// ArrayList list = new ArrayList();
+// byte[] bytes = new byte[]{};
+// Map map = this.parseDataForBarPage(data, rowKeys, columnKeys);
+// int pageNum = Integer.parseInt("" + map.get("pageNum"));
+// // 迭代数据,产出图片数据流,并添加到List
+// for (int i = 0; i < pageNum; i++) {
+// bytes = createSingleStackedBarChart((double[][]) (map.get("data" + i)), (String[]) (map.get("rowKeys" + i)),
+// (String[]) (map.get("columnKeys" + i)), entity);
+// list.add(bytes);
+// }
+// return list;
+// }
+//
+// /**
+// * 解析生成柱状图分页数据
+// *
+// * @param data
+// * @param rowKeys
+// * @param columnKeys
+// * @return
+// */
+// private Map parseDataForBarPage(double[][] data, String[] rowKeys, String[] columnKeys) {
+// Map map = new HashMap();
+//
+// double[][] pageData = null;
+// String[] pageColumn = null;
+//
+// int sumColumnNum = columnKeys.length; // 总列数
+// int indexNum = Config.getInt("image.export.pagesize", 10);// 分页的列数
+// int pageNum = sumColumnNum % indexNum == 0 ? sumColumnNum / indexNum : sumColumnNum / indexNum + 1; // 分页数
+// int rowNum = rowKeys.length;
+//
+// // log.debug("data.length="+data.length+"sumColumnNum="+sumColumnNum+" indexNum="+indexNum+" pageNum="+pageNum+" rowNum="+rowNum+" ");
+//
+// // 解析传递过来的数据
+// for (int i = 0; i < pageNum; i++) {
+// int columnNum = (sumColumnNum - i * indexNum) / indexNum > 0 ? indexNum : (sumColumnNum - i * indexNum) % indexNum;//当前页列数
+// pageData = new double[rowNum][columnNum];
+// // 取数据值
+// for (int j = 0; j < rowNum; j++) {
+// pageColumn = new String[columnNum];
+// for (int k = 0; k < columnNum; k++) {
+// pageData[j][k] = data[j][k + i * indexNum]; // 数据
+// }
+// }
+// // 取列值
+// for (int j = 0; j < columnNum; j++) {
+// pageColumn[j] = columnKeys[j + i * indexNum]; // 列
+// }
+// // 保存数据并返回
+// map.put("data" + i, pageData);
+// map.put("rowKeys" + i, rowKeys);
+// map.put("columnKeys" + i, pageColumn);
+// }
+// // 保存分页数
+// map.put("pageNum", pageNum);
+// return map;
+// }
+//
+// /**
+// * 解析生成折线图分页数据
+// *
+// * @param data
+// * @param rowKeys
+// * @param columnKeys
+// * @return
+// */
+// private Map parseDataForLinePage(double[][] data, String[] rowKeys, String[] columnKeys) {
+// Map map = new HashMap();
+//
+// double[][] pageData = null;
+// String[] pageColumn = null;
+//
+// int sumColumnNum = columnKeys.length; // 总列数
+// int indexNum = Config.getInt("image.export.pagesize", 10);// 分页的列数
+// int pageNum = sumColumnNum % indexNum == 0 ? sumColumnNum / indexNum : sumColumnNum / indexNum + 1; // 分页数
+// int rowNum = rowKeys.length;
+//
+// // log.debug("data.length="+data.length+"sumColumnNum="+sumColumnNum+" indexNum="+indexNum+" pageNum="+pageNum+" rowNum="+rowNum+" ");
+//
+// // 解析传递过来的数据
+// for (int i = 0; i < pageNum; i++) {
+// int columnNum = (sumColumnNum - i * indexNum) / indexNum > 0 ? indexNum : (sumColumnNum - i * indexNum) % indexNum;//当前页列数
+// pageData = new double[rowNum][columnNum];
+// // 取数据值
+// for (int j = 0; j < rowNum; j++) {
+// pageColumn = new String[columnNum];
+// for (int k = 0; k < columnNum; k++) {
+// pageData[j][k] = data[j][k + i * indexNum]; // 数据
+// }
+// }
+// // 取列值
+// for (int j = 0; j < columnNum; j++) {
+// pageColumn[j] = columnKeys[j + i * indexNum]; // 列
+// }
+// // 保存数据并返回
+// map.put("data" + i, pageData);
+// map.put("rowKeys" + i, rowKeys);
+// map.put("columnKeys" + i, pageColumn);
+// }
+// // 保存分页数
+// map.put("pageNum", pageNum);
+// return map;
+// }
+//
+// /**
+// * 生成单个堆栈柱状图
+// *
+// * @return 图片数据流
+// * @throws IOException
+// */
+// public byte[] createSingleStackedBarChart(double[][] data, String[] rowKeys, String[] columnKeys, ChartEntity entity) throws IOException {
+// CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
+// JFreeChart chart = createStackedBarChart(dataset, entity);
+// byte[] bytes = this.createImage(chart, entity);
+// return bytes;
+// }
+//
+// // 柱状图,折线图 数据集
+// private CategoryDataset getBarData(double[][] data, String[] rowKeys,
+// String[] columnKeys) {
+// return DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
+//
+// }
+//
+// /**
+// * 判断文件夹是否存在,如果不存在则新建
+// *
+// * @param chartPath
+// */
+// private void isChartPathExist(String chartPath) {
+// File file = new File(chartPath);
+// if (!file.exists()) {
+// file.mkdirs();
+// }
+// }
+//
+// /**
+// * 折线图
+// */
+// private JFreeChart createTimeXYChar(CategoryDataset xyDataset, ChartEntity entity) {
+//
+// JFreeChart chart = ChartFactory.createLineChart(
+// entity.getTitle(),
+// entity.getXname(),
+// entity.getYname(),
+// xyDataset,
+// PlotOrientation.VERTICAL,
+// true,
+// true,
+// false);
+//
+// chart.setTextAntiAlias(false);
+// chart.setBackgroundPaint(Color.WHITE);
+//
+// CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
+// // 没有数据时显示
+// this.configNoData(chart, "没有查询到数据 !");
+//
+// // x轴 // 分类轴网格是否可见
+// categoryplot.setDomainGridlinesVisible(true);
+// // y轴 //数据轴网格是否可见
+// categoryplot.setRangeGridlinesVisible(true);
+//
+// categoryplot.setRangeGridlinePaint(Color.WHITE);// 虚线色彩
+//
+// categoryplot.setDomainGridlinePaint(Color.WHITE);// 虚线色彩
+//
+// categoryplot.setBackgroundPaint(Color.lightGray);
+//
+//
+// // 配置字体
+// this.configFont(chart);
+//
+// // x轴设置
+// CategoryAxis domainAxis = categoryplot.getDomainAxis();
+//
+// // 设置距离图片左端距离
+// domainAxis.setLowerMargin(0.0);
+// // 设置距离图片右端距离
+// domainAxis.setUpperMargin(0.0);
+// domainAxis.setTickLabelPaint(Color.BLUE);
+// domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横轴上的label斜显示
+//
+// NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
+// numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
+// numberaxis.setAutoRangeIncludesZero(true);
+//
+// // 获得renderer 注意这里是下嗍造型到lineandshaperenderer!!
+// LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot.getRenderer();
+// lineandshaperenderer.setBaseShapesVisible(true); // series 点(即数据点)可见
+// lineandshaperenderer.setBaseLinesVisible(true); // series 点(即数据点)间有连线可见
+//
+// // 显示折点数据
+// lineandshaperenderer.setBaseItemLabelGenerator(new
+// StandardCategoryItemLabelGenerator());
+// lineandshaperenderer.setBaseItemLabelsVisible(true);
+//
+// return chart;
+// }
+//
+// /**
+// * 堆栈柱状图
+// */
+// private JFreeChart createStackedBarChart(CategoryDataset dataset, ChartEntity entity) {
+//
+// JFreeChart chart = ChartFactory.createStackedBarChart3D(
+// entity.getTitle(),
+// entity.getXname(),
+// entity.getYname(),
+// dataset,
+// PlotOrientation.VERTICAL,
+// true,
+// false,
+// false);
+//
+// // 没有数据配置
+// this.configNoData(chart, "没有查询到数据 !");
+//
+// // 配置字体
+// this.configFont(chart);
+//
+// // 配置 Renderer
+// this.configBarRenderer(chart);
+//
+// // 其他配置
+// this.configOtherForBar(chart);
+//
+// return chart;
+// }
+//
+// /**
+// * 配置字体
+// *
+// * @param chart JFreeChart 对象
+// */
+// private void configFont(JFreeChart chart) {
+// // 配置字体
+// Font xfont = new Font("宋体", Font.PLAIN, 12);// X轴
+// Font yfont = new Font("宋体", Font.PLAIN, 12);// Y轴
+// Font kfont = new Font("宋体", Font.PLAIN, 12);// 底部
+// Font titleFont = new Font("隶书", Font.BOLD, 25); // 图片标题
+// CategoryPlot plot = chart.getCategoryPlot();// 图形的绘制结构对象
+//
+// // 图片标题
+// chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont));
+//
+// // 底部
+// chart.getLegend().setItemFont(kfont);
+//
+// // X 轴
+// CategoryAxis domainAxis = plot.getDomainAxis();
+// domainAxis.setLabelFont(xfont);// 轴标题
+// domainAxis.setTickLabelFont(xfont);// 轴数值
+// domainAxis.setTickLabelPaint(Color.BLUE); // 字体颜色
+// domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横轴上的label斜显示
+//
+// // Y 轴
+// ValueAxis rangeAxis = plot.getRangeAxis();
+// rangeAxis.setLabelFont(yfont);
+// rangeAxis.setLabelPaint(Color.BLUE); // 字体颜色
+// rangeAxis.setTickLabelFont(yfont);
+//
+// }
+//
+// /**
+// * 配置柱状图
+// *
+// * @param chart
+// */
+// private void configBarRenderer(JFreeChart chart) {
+//
+// CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
+// // 自定义显示柱子上的总值
+// ExtendedStackedBarRenderer extendedstackedbarrenderer = new ExtendedStackedBarRenderer();
+// extendedstackedbarrenderer.setBaseItemLabelsVisible(true);
+// extendedstackedbarrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
+// extendedstackedbarrenderer.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
+// categoryplot.setRenderer(extendedstackedbarrenderer);
+//
+// BarRenderer barrenderer = (BarRenderer) categoryplot.getRenderer();
+// barrenderer.setDrawBarOutline(false);
+// barrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
+// barrenderer.setBaseItemLabelsVisible(true);
+// barrenderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER));
+// barrenderer.setBaseNegativeItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER));
+//
+// // 柱子显示数值
+// // barrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}",new DecimalFormat("0.0%")));
+// // barrenderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
+// barrenderer.setItemLabelFont(new Font("Arial Unicode MS", Font.PLAIN, 9));
+// barrenderer.setItemLabelsVisible(true);
+//
+// // 如果数值没有显示空间,设置显示格式
+// // ItemLabelPosition itemLabelPositionFallback=new ItemLabelPosition(
+// // ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_LEFT,
+// // TextAnchor.HALF_ASCENT_LEFT,0D);
+// // barrenderer.setPositiveItemLabelPositionFallback(itemLabelPositionFallback);
+// // barrenderer.setNegativeItemLabelPositionFallback(itemLabelPositionFallback);
+//
+// categoryplot.setRenderer(barrenderer);
+// }
+//
+// /**
+// * 配置没有数据时的显示信息
+// *
+// * @param chart
+// */
+// private void configNoData(JFreeChart chart, String message) {
+// CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
+// // 没有数据时的显示
+// categoryplot.setNoDataMessage(message);
+// categoryplot.setNoDataMessageFont(new Font("黑体", Font.BOLD, 25));
+// }
+//
+// /**
+// * 其他配置
+// *
+// * @param chart
+// */
+// private void configOtherForBar(JFreeChart chart) {
+//
+// chart.setTextAntiAlias(false); // 图例字体清晰
+//
+// chart.setBackgroundPaint(Color.WHITE); // 背景颜色
+//
+// CategoryPlot plot = chart.getCategoryPlot();// 图形的绘制结构对象
+// NumberAxis numberaxis = (NumberAxis) plot.getRangeAxis();
+// numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
+// numberaxis.setAutoRangeIncludesZero(true);
+// }
+//
+// /**
+// * 创建图片的数据流
+// *
+// * @param chart
+// * @param entity 图片配置对象
+// * @return 图片数据流
+// * @throws IOException
+// */
+// private byte[] createImage(JFreeChart chart, ChartEntity entity) throws IOException {
+// return ChartUtilities.encodeAsPNG(chart.createBufferedImage(entity.getWidth(), entity.getHeight()));
+// }
+//
+// /**
+// * 创建图片文件到硬盘
+// *
+// * @param chart
+// * @param entity
+// * @throws IOException
+// */
+// private void createImageFile(JFreeChart chart, ChartEntity entity) throws IOException {
+// FileOutputStream fos_jpg = null;
+// try {
+// isChartPathExist(tempImgPath);
+// String chartName = tempImgPath + entity.getFileName();
+// fos_jpg = new FileOutputStream(chartName);
+// ChartUtilities.writeChartAsJPEG(fos_jpg, chart, entity.getWidth(), entity.getHeight());
+// } catch (Exception e) {
+// e.printStackTrace();
+// } finally {
+// try {
+// fos_jpg.close();
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+// }
+// }
+}
diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/WordUtils.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/WordUtils.java
index 2e17bfb..306ab29 100644
--- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/WordUtils.java
+++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/WordUtils.java
@@ -1,12 +1,19 @@
package com.hnac.hzims.operational.util;
+
+import cn.afterturn.easypoi.word.WordExportUtil;
+import cn.hutool.core.lang.Assert;
import com.hnac.hzims.operational.util.pojo.HttpResponse;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
+import java.util.Map;
/**
* world文档工具类
@@ -39,4 +46,41 @@ public abstract class WordUtils {
fileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".doc");
}
+
+ /**
+ * 导出word
+ * 第一步生成替换后的word文件,只支持docx
+ * 第二步下载生成的文件
+ * 第三步删除生成的临时文件
+ * 模版变量中变量格式:{{foo}}
+ *
+ * @param templatePath word模板地址
+ * @param temDir 生成临时文件存放地址
+ * @param fileName 文件名
+ * @param params 替换的参数
+ */
+ public static void exportWord(String templatePath, String temDir, String fileName, Map params) {
+ Assert.notNull(templatePath, "模板路径不能为空");
+ Assert.notNull(temDir, "临时文件路径不能为空");
+ Assert.notNull(fileName, "导出文件名不能为空");
+ Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式");
+ if (!temDir.endsWith("/")) {
+ temDir = temDir + File.separator;
+ }
+ File dir = new File(temDir);
+ if (!dir.exists()) {
+ dir.mkdirs();
+ }
+ try {
+ XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);
+ String tmpPath = temDir + fileName;
+ FileOutputStream fos = new FileOutputStream(tmpPath);
+ doc.write(fos);
+ fos.flush();
+ fos.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
}