java 使用freemarker 导出word 和图片

  • 前段时间写了一篇使用itext导出word的博客,并且在项目也是使用itext,我大概了写了2000行左右的样子,然后被经理否决了.最后还是要使用freemarker 模板导出word

    pom 文件:

<!-- java 生成报表 -->
<dependency>
    <groupId>org.jfree</groupId>
    <artifactId>jfreechart</artifactId>
    <version>1.0.19</version>
</dependency>
<dependency>
    <groupId>org.jfree</groupId>
    <artifactId>jfreesvg</artifactId>
    <version>3.0</version>
</dependency>
<dependency>
    <groupId>org.jfree</groupId>
    <artifactId>jcommon</artifactId>
    <version>1.0.23</version>
</dependency>
    <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.20</version>
        </dependency>

导出word 的类

public class ExportDoc {
    private Configuration configuration = null;

    public ExportDoc() {
        configuration = new Configuration();
        configuration.setDefaultEncoding("UTF-8");
    }

    /**
     * 
     * @Title: create 
     * @Description: 注意dataMap里存放的数据Key值要与模板中的参数相对应 
     * @param dataMap 
     * @param response 
     * @throws Exception 
     * @return void
     * @throws
     */
    public void create(Map<String, Object> dataMap, HttpServletResponse response) throws Exception {

        // 模板放在com.canyou.template包下面,通过classpath装载
        configuration.setClassForTemplateLoading(this.getClass(), "/com/ybzt/views/docutils/ftl"); // 自己在项目中放入模板位置
        Template template = configuration.getTemplate("template.ftl");// 设置要装载的模板
        //这里产生一个随机数的的名字
        String fileName = String.valueOf(Math.random() * 10000);
        File outFile = new File(fileName.replace(".", "") + ".doc");

        if (!outFile.exists()) {
            outFile.createNewFile();
        }

        Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));
        template.process(dataMap, out);
        out.close();
(20171110号修正.今天发现一个bug 导出时在在eclipse下面有个doc 文件.经过排查发现 是 template.process(dataMap, out); 这里的问题
这里可以 传入 response.getWriter())之后的代码就不需要了.就可以直接导出
        // 导出时有界面,可选择下载路径
        response.addHeader("Content-Disposition", "attachment;filename=" + new String(outFile.getName().getBytes("utf-8"), "utf-8"));
        response.setContentType("application/msword");

        OutputStream out1 = null;
        InputStream in = null;

        try {
            in = new FileInputStream(outFile);

            out1 = response.getOutputStream();
            BufferedInputStream bis = new BufferedInputStream(in);
            BufferedOutputStream bos = new BufferedOutputStream(out1);

            byte[] buff = new byte[20480];
            int bytesRead;
            while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
                bos.write(buff, 0, bytesRead);
            }
            bis.close();
            bos.flush();
            bos.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

        finally {
            if (out1 != null)
                out1.close();
            if (in != null)
                in.close();
        }

    }

}

这里有俩个类是用来画图的

public class CreateChart {

     private static  String CHART_PATH = "";

     public CreateChart(String path){
         this.CHART_PATH = path;
     }


    private CreateChart() {
        // TODO Auto-generated constructor stub
    }


    /**
     * 饼状图
     * 
     * @param dataset 数据集
     * @param chartTitle 图标题
     * @param charName 生成图的名字
     * @param pieKeys 分饼的名字集
     * @return
     */
    public static String createValidityComparePimChar(PieDataset dataset,
            String chartTitle, String charName, String[] pieKeys) {
        JFreeChart chart = ChartFactory.createPieChart3D(chartTitle, // chart
                // title
                dataset,// data
                true,// include legend
                true, false);

        // 使下说明标签字体清晰,去锯齿类似于
        // chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);的效果
        chart.setTextAntiAlias(false);
        // 图片背景色
        chart.setBackgroundPaint(Color.white);
        // 设置图标题的字体重新设置title
        Font font = new Font("隶书", Font.BOLD, 25);
        TextTitle title = new TextTitle(chartTitle);
        title.setFont(font);
        chart.setTitle(title);

        PiePlot3D plot = (PiePlot3D) chart.getPlot();
        // 图片中显示百分比:默认方式

        // 指定饼图轮廓线的颜色
        // plot.setBaseSectionOutlinePaint(Color.BLACK);
        // plot.setBaseSectionPaint(Color.BLACK);

        // 设置无数据时的信息
        plot.setNoDataMessage("无对应的数据,请重新查询。");

        // 设置无数据时的信息显示颜色
        plot.setNoDataMessagePaint(Color.red);

        // 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位
        plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
                "{0}={1}({2})", NumberFormat.getNumberInstance(),
                new DecimalFormat("0.00%")));
        // 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例
        plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator(
                "{0}={1}({2})"));

        plot.setLabelFont(new Font("SansSerif", Font.TRUETYPE_FONT, 12));

        // 指定图片的透明度(0.0-1.0)
        plot.setForegroundAlpha(0.65f);
        // 指定显示的饼图上圆形(false)还椭圆形(true)
        plot.setCircular(false, true);

        // 设置第一个 饼块section 的开始位置,默认是12点钟方向
        plot.setStartAngle(90);

        // // 设置分饼颜色
        plot.setSectionPaint(pieKeys[0], new Color(47, 69, 84));
        plot.setSectionPaint(pieKeys[1], new Color(213, 58, 53));

        FileOutputStream fos_jpg = null;
        try {
            // 文件夹不存在则创建
//            isChartPathExist(CHART_PATH);
//            String chartName = "D:/workspace1/happyReading/src/main/webapp/exportWord/" + charName;
            String chartName =  CHART_PATH+ charName;
//            System.out.println("charName:"+chartName);
            fos_jpg = new FileOutputStream(chartName);
            // 高宽的设置影响椭圆饼图的形状
            ChartUtilities.writeChartAsPNG(fos_jpg, chart, 500, 230);

            return chartName;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                fos_jpg.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
    /**
     * 生成分组的柱状图
     */
    public String makeBarGroupChart( DefaultCategoryDataset dataset,String chartName) {
//        double[][] data = new double[][]{
//            {672, 766, 223, 540, 126},
//            {325, 521, 210, 340, 106},
//            {332, 256, 523, 240, 526}
//        };
//        String[] rowKeys = {"苹果", "梨子", "葡萄"};
        String[] columnKeys = {"北京", "上海", "广州", "成都", "深圳"};
//        CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
        //调用柱状图
//        DefaultCategoryDataset dataset = new DefaultCategoryDataset();  
//        dataset.addValue(100, "北京", "红色经典");  
//        dataset.addValue(100, "上海", "红色经典");  
//        dataset.addValue(200, "北京", "普通读物");  
//        dataset.addValue(200, "上海", "普通读物");  
//        dataset.addValue(300, "北京", "传统文化");  
//        dataset.addValue(300, "上海", "传统文化");  
//        dataset.addValue(400, "北京", "xxxxx");  
//        dataset.addValue(400, "上海", "xxxxx");  
     String barPath =    createBarChart(dataset, "x坐标", "y坐标", "柱状图", chartName);
     return barPath;
    }

    /**
     * 柱状图
     * 
     *@param dataset 数据集
     * @param xName x轴的说明(如种类,时间等)
     * @param yName y轴的说明(如速度,时间等)
     * @param chartTitle 图标题
     * @param charName 生成图片的名字
     * @return
     */
    public String createBarChart(CategoryDataset dataset, String xName,
            String yName, String chartTitle, String charName) {
        JFreeChart chart = ChartFactory.createBarChart(chartTitle, // 图表标题
                xName, // 目录轴的显示标签
                yName, // 数值轴的显示标签
                dataset, // 数据集
                PlotOrientation.VERTICAL, // 图表方向:水平、垂直
                true, // 是否显示图例(对于简单的柱状图必须是false)
                false, // 是否生成工具
                false // 是否生成URL链接
                );
        Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
        Font titleFont = new Font("黑体", Font.BOLD, 20);    
        Font plotFont = new Font("宋体", Font.PLAIN, 16);    
        Font LegendFont = new Font("楷体", Font.PLAIN, 18);   
        TextTitle textTitle2 = chart.getTitle();  
        textTitle2.setFont(titleFont);// 为标题设置上字体  

        LegendTitle legend2 = chart.getLegend(0);  
        legend2.setItemFont(LegendFont);// 为图例说明设置字体  

        CategoryPlot categoryPlot = chart.getCategoryPlot();  
        categoryPlot.getRangeAxis().setLabelFont(plotFont);// 设置Y轴标识字体  
        categoryPlot.getDomainAxis().setLabelFont(plotFont);// 设置X轴标识字体  
        categoryPlot.getDomainAxis().setTickLabelFont(plotFont);// 设置轴标记的坐标的标记字体  
        /*
         * VALUE_TEXT_ANTIALIAS_OFF表示将文字的抗锯齿关闭,
         * 使用的关闭抗锯齿后,字体尽量选择12到14号的宋体字,这样文字最清晰好看
         */
        // chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
//        chart.setTextAntiAlias(false);
//        chart.setBackgroundPaint(Color.white);
//        // create plot
//        CategoryPlot plot = chart.getCategoryPlot();
//        // 设置横虚线可见
//        plot.setRangeGridlinesVisible(true);
//        // 虚线色彩
//        plot.setRangeGridlinePaint(Color.gray);

        // 数据轴精度
//        NumberAxis vn = (NumberAxis) plot.getRangeAxis();
        // vn.setAutoRangeIncludesZero(true);
        DecimalFormat df = new DecimalFormat("#0.00");
//        vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式
        // x轴设置

//        CategoryAxis domainAxis = plot.getDomainAxis();
//        domainAxis.setLabelFont(labelFont);// 轴标题

//        domainAxis.setTickLabelFont(labelFont);// 轴数值

        // Lable(Math.PI/3.0)度倾斜
        // domainAxis.setCategoryLabelPositions(CategoryLabelPositions
        // .createUpRotationLabelPositions(Math.PI / 3.0));

//        domainAxis.setMaximumCategoryLabelWidthRatio(0.6f);// 横轴上的 Lable 是否完整显示

        // 设置距离图片左端距离
//        domainAxis.setLowerMargin(0.1);
        // 设置距离图片右端距离
//        domainAxis.setUpperMargin(0.1);
        // 设置 columnKey 是否间隔显示
        // domainAxis.setSkipCategoryLabelsToFit(true);

//        plot.setDomainAxis(domainAxis);
        // 设置柱图背景色(注意,系统取色的时候要使用16位的模式来查看颜色编码,这样比较准确)
//        plot.setBackgroundPaint(new Color(255, 255, 204));

        // y轴设置
//        ValueAxis rangeAxis = plot.getRangeAxis();
//        rangeAxis.setLabelFont(labelFont);
//        rangeAxis.setTickLabelFont(labelFont);
//        // 设置最高的一个 Item 与图片顶端的距离
//        rangeAxis.setUpperMargin(0.15);
//        // 设置最低的一个 Item 与图片底端的距离
//        rangeAxis.setLowerMargin(0.15);
//        plot.setRangeAxis(rangeAxis);

        BarRenderer renderer = new BarRenderer();
        // 设置柱子宽度
        renderer.setMaximumBarWidth(0.05);
        // 设置柱子高度
        renderer.setMinimumBarLength(0.2);
        // 设置柱子边框颜色
        renderer.setBaseOutlinePaint(Color.BLACK);
        // 设置柱子边框可见
        renderer.setDrawBarOutline(true);

        // // 设置柱的颜色
        renderer.setSeriesPaint(0, new Color(204, 255, 255));
        renderer.setSeriesPaint(1, new Color(153, 204, 255));
        renderer.setSeriesPaint(2, new Color(51, 204, 204));

        // 设置每个地区所包含的平行柱的之间距离
        renderer.setItemMargin(0.0);

        // 显示每个柱的数值,并修改该数值的字体属性
        renderer.setIncludeBaseInRange(true);
        renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        renderer.setBaseItemLabelsVisible(true);

//        plot.setRenderer(renderer);
        // 设置柱的透明度
//        plot.setForegroundAlpha(1.0f);

        FileOutputStream fos_jpg = null;
        try {
//            isChartPathExist(CHART_PATH);
            String chartName = CHART_PATH + charName;
            fos_jpg = new FileOutputStream(chartName);
            ChartUtilities.writeChartAsPNG(fos_jpg, chart, 800, 450, true, 10);
            return chartName;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                fos_jpg.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }


    // 柱状图,折线图 数据集
    public 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("");
        String absolutePath = file.getAbsolutePath();
        String path =absolutePath+"/chart";
        if (!file.exists()) {
            file.mkdirs();
        // log.info("CHART_PATH="+CHART_PATH+"create.");
        }
    }

       /**
     * 生成饼状图
     */
    public static String makePieChart(String pieName,String[] keys,double[] data) {
//        double[] data = {20, 80};
//        String[] keys = {"未参与人数", "参与人数"};

        String createPath = createValidityComparePimChar(getDataPieSetByUtil(data, keys), "饼状图",
                pieName, keys);
//        System.out.println("创建的路劲:"+createPath);
        return createPath;
    }


    // 饼状图 数据集
    public static PieDataset getDataPieSetByUtil(double[] data,
            String[] datadescription) {

        if (data != null && datadescription != null) {
            if (data.length == datadescription.length) {
                DefaultPieDataset dataset = new DefaultPieDataset();
                for (int i = 0; i < data.length; i++) {
                    dataset.setValue(datadescription[i], data[i]);
                }
                return dataset;
            }

        }

        return null;
    }

    /**
     * 传入图片路径 将其转换成base64
     * 
     */
    public static String getImageStr(String imgPath) {
        String imgFile = imgPath;
        InputStream in = null;
        byte[] data = null;
        try {
            in = new FileInputStream(imgFile);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(data);
    }
    /*
     * 雷达图
     */
    public String createPolarChart(String chartTitle,
            CategoryDataset categorydataset, String charName) {
        SpiderWebPlot dataset = new TickMarkSpiderWebPlot(categorydataset);

        JFreeChart chart = new JFreeChart(chartTitle, new Font("宋体",
                Font.PLAIN, 15), dataset, false);

        chart.setTextAntiAlias(false);
        chart.setBackgroundPaint(Color.WHITE);
        // 设置图标题的字体重新设置title
        Font font = new Font("宋体", 10, 15);
        Font titleFont = new Font("黑体", Font.PLAIN, 20); // 图片标题
        chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont));

        chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,
                RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
        chart.setBackgroundPaint(Color.white);
        TickMarkSpiderWebPlot pieplot = (TickMarkSpiderWebPlot) chart.getPlot();
        pieplot.setBackgroundPaint(Color.white);

        // 设定背景透明度(0-1.0之间)
        pieplot.setBackgroundAlpha(0.6f);

        // 设定前景透明度(0-1.0之间)
        pieplot.setForegroundAlpha(0.8f);
        LegendTitle legendtitle = new LegendTitle(dataset);
        legendtitle.setPosition(RectangleEdge.BOTTOM);
        chart.addSubtitle(legendtitle);

        // 设置图片中item部分中文乱码
        chart.getLegend().setItemFont(font);

        FileOutputStream fos_jpg = null;
        try {
               String chartName = CHART_PATH + charName;
            fos_jpg = new FileOutputStream(chartName);

            // 将报表保存为png文件
            ChartUtilities.writeChartAsPNG(fos_jpg, chart, 800, 600);

            return chartName;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                fos_jpg.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        //  Auto-generated method stub
        CreateChart pm = new CreateChart();
//      pm.getPath();
        // 生成饼状图
//        pm.makePieChart("1.png");


//      pm.getPath();
        // 生成单组柱状图
//        pm.makeBarChart();
//        // 生成多组柱状图
//        pm.makeBarGroupChart();
//        // 生成堆积柱状图
//        pm.makeStackedBarChart();
//        // 生成折线图
//        pm.makeLineAndShapeChart();
    }
}

这个一个要实现雷达图的类

public class TickMarkSpiderWebPlot extends SpiderWebPlot {

    private static final long serialVersionUID = -8611817103284691477L;
    private int ticks = DEFAULT_TICKS;
    private static final int DEFAULT_TICKS = 5;
    private NumberFormat format = NumberFormat.getInstance();
    private static final double PERPENDICULAR = 90;
    private static final double TICK_SCALE = 0.015;
    private int valueLabelGap = DEFAULT_GAP;
    private static final int DEFAULT_GAP = 10;
    private static final double THRESHOLD = 15;

    public TickMarkSpiderWebPlot(CategoryDataset createCategoryDataset) {
        super(createCategoryDataset);
    }

    /**
     * 用于雷达图显示,(该项目目前未用)
     */
    @Override
    protected void drawLabel(final Graphics2D g2, final Rectangle2D plotArea, final double value, final int cat,
            final double startAngle, final double extent) {
        super.drawLabel(g2, plotArea, value, cat, startAngle, extent);
        final FontRenderContext frc = g2.getFontRenderContext();
        final double[] transformed = new double[2];
        final double[] transformer = new double[2];
        final Arc2D arc1 = new Arc2D.Double(plotArea, startAngle, 0, Arc2D.OPEN);

        for (int i = 1; i <= ticks; i++) {

            final Point2D point1 = arc1.getEndPoint();

            final double deltaX = plotArea.getCenterX();
            final double deltaY = plotArea.getCenterY();
            double labelX = point1.getX() - deltaX;
            double labelY = point1.getY() - deltaY;

            final double scale = ((double) i / (double) ticks);
            final AffineTransform tx = AffineTransform.getScaleInstance(scale, scale);
            final AffineTransform pointTrans = AffineTransform.getScaleInstance(scale + TICK_SCALE, scale + TICK_SCALE);
            transformer[0] = labelX;
            transformer[1] = labelY;
            pointTrans.transform(transformer, 0, transformed, 0, 1);
            final double pointX = transformed[0] + deltaX;
            final double pointY = transformed[1] + deltaY;
            tx.transform(transformer, 0, transformed, 0, 1);
            labelX = transformed[0] + deltaX;
            labelY = transformed[1] + deltaY;

            double rotated = (PERPENDICULAR);

            AffineTransform rotateTrans = AffineTransform.getRotateInstance(Math.toRadians(rotated), labelX, labelY);
            transformer[0] = pointX;
            transformer[1] = pointY;
            rotateTrans.transform(transformer, 0, transformed, 0, 1);
            final double x1 = transformed[0];
            final double y1 = transformed[1];

            rotated = (-PERPENDICULAR);
            rotateTrans = AffineTransform.getRotateInstance(Math.toRadians(rotated), labelX, labelY);

            rotateTrans.transform(transformer, 0, transformed, 0, 1);

            final Composite saveComposite = g2.getComposite();
            g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));

            g2.draw(new Line2D.Double(transformed[0], transformed[1], x1, y1));

            if (startAngle == this.getStartAngle()) {
                final String label = format.format(((double) i / (double) ticks) * this.getMaxValue());
                final LineMetrics lm = getLabelFont().getLineMetrics(label, frc);
                final double ascent = lm.getAscent();
                if (Math.abs(labelX - plotArea.getCenterX()) < THRESHOLD) {
                    labelX += valueLabelGap;
                    labelY += ascent / (float) 2;
                } else if (Math.abs(labelY - plotArea.getCenterY()) < THRESHOLD) {
                    labelY += valueLabelGap;
                } else if (labelX >= plotArea.getCenterX()) {
                    if (labelY < plotArea.getCenterY()) {
                        labelX += valueLabelGap;
                        labelY += valueLabelGap;
                    } else {
                        labelX -= valueLabelGap;
                        labelY += valueLabelGap;
                    }
                } else {
                    if (labelY > plotArea.getCenterY()) {
                        labelX -= valueLabelGap;
                        labelY -= valueLabelGap;
                    } else {
                        labelX += valueLabelGap;
                        labelY -= valueLabelGap;
                    }
                }
                g2.setPaint(getLabelPaint());
                g2.setFont(getLabelFont());
                g2.drawString(label, (float) labelX, (float) labelY);
            }
            g2.setComposite(saveComposite);
        }
    }
}

上一小段 service

    public Map<String, Object> useFreeExportWord(HttpServletRequest request, BaseUser user, AnalyzeDto dto) {
        Map<String, Object> map = new HashMap<String, Object>();// 要填入模本的数据文件
        DecimalFormat df = new DecimalFormat("#0.00");
        // 为了防止客户以后更改需求 目前都是全校 所有时间.所以现在先设置为空:
        dto.setClasses("");
        dto.setGrade("");
        dto.setStartDate(null);
        dto.setEndDate(null);
        // 获取web 目录绝对路劲
        String realPath = request.getSession().getServletContext().getRealPath("/");
        String storePath = realPath + "exportWord/";// 存储的路劲
        CreateChart c = new CreateChart(storePath);
        // 创建一个名字一会添加到 word 里.
        String loginPieName = System.currentTimeMillis() + ".png";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy 年MM月dd 日");
        SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
        SimpleDateFormat sdfMonth = new SimpleDateFormat("MM");
        SimpleDateFormat sdfDate = new SimpleDateFormat("dd");
        // 获取数据区域.............
        Map<String, Object> loginChart = ydLoginLogService.getLoginChart(dto, user);
        YdTeacher teacher = teacherMapperDao.selectByPrimaryKey(user.getUserId());
        String schoolName = teacher.getSchoolName();
        SysUser sysUser = sysUserMapperDao.getSysUserById(teacher.getTeacherId());
        // 注册是的年
        String startYear = sdfYear.format(sysUser.getCreateTime());
        // 月
        String startMonth = sdfMonth.format(sysUser.getCreateTime());
        // 日
        String startDate = sdfDate.format(sysUser.getCreateTime());
        // 学校总人数
        int totalPerson = (int) loginChart.get("loginCount") + (int) loginChart.get("noLoginCount");
        // 登录比例
        double loginC = (int) loginChart.get("loginCount");
        String loginRate = df.format((loginC / totalPerson) * 100) + "%";
        map.put("schoolName", schoolName);
        map.put("year", sdfYear.format(new Date()));
        map.put("month", sdfMonth.format(new Date()));
        map.put("date", sdfDate.format(new Date()));

        map.put("totalCount", totalPerson);
        map.put("loginCount", loginC);
        map.put("loginRate", loginRate);

        map.put("startYear", startYear);
        map.put("startMonth", startMonth);
        map.put("startDate", startDate);
        // 第一个图片
        String[] keys = { "未参与人数", "参与人数" };
        double[] data = { (int) loginChart.get("noLoginCount"), (int) loginChart.get("loginCount") };
        // 获取这个学校的阅读本数 分数 字数
        ExportWord readCountAndWordNumberAndSocre = userBookDao
                .getReadCountAndWordNumberAndSocre(teacher.getSchoolNo());
        String pieChartPath = c.makePieChart(loginPieName, keys, data);
        map.put("image1", c.getImageStr(pieChartPath));
        // 本数平均数
        double readCount = readCountAndWordNumberAndSocre.getCount();
        String readCountFormat = df.format(readCount / totalPerson);
        // 字数平均数
        double wordNumber = readCountAndWordNumberAndSocre.getWordNumber();
        String wordNumberFormat = df.format(wordNumber / totalPerson);
        // 积分平均数
        double socre = readCountAndWordNumberAndSocre.getScore();
        String socreFormat = df.format(socre / totalPerson);

        map.put("readCount", readCount);
        map.put("readCountFormat", readCountFormat);
        map.put("wordNumber", wordNumber);
        map.put("wordNumberFormat", wordNumberFormat);
        map.put("score", socre);
        map.put("scoreFormat", socreFormat);
        // 获取一次认证和多次认证
        ExportWord manyData = userBookDao.getManyData(teacher.getSchoolNo());

        // 获取正确率
        ExportWord rorrectRate = userBookDao.getRorrectRateBySchoolNo(teacher.getSchoolNo());
        // 获取学校的书评数
        ExportWord CommnetAndAvgCount = ydBookCommentMapper.getBookCommnetAndAvgCount(teacher.getSchoolNo());
        map.put("oneRate", manyData.getOneRate());
        map.put("manyRate", manyData.getManyRate());
        // 正确率
        map.put("rorrectRate", rorrectRate.getCorrectRate());
        map.put("commentCount", CommnetAndAvgCount.getCount());
        map.put("disCommentCount", CommnetAndAvgCount.getDisCount());
        map.put("avgCommentCount", CommnetAndAvgCount.getAvgCount());

        // 获取阅读本书 按类型
        Map<String, Object> readCountGroupClassify = userBooksService.getReadCountGroupClassify(user, dto);

        String[] keys1 = { "普通读物", "红色经典", "中外读物", "传统文化" };
        double[] data1 = { (int) readCountGroupClassify.get("one"), (int) readCountGroupClassify.get("two"),
                (int) readCountGroupClassify.get("three"), (int) readCountGroupClassify.get("four") };
        String loginPieName1 = System.currentTimeMillis() + "1.png";
        String pieChartPath1 = c.makePieChart(loginPieName1, keys1, data1);
        map.put("image2", c.getImageStr(pieChartPath1));
        // 第三个表格
        // 全校学生阅读量明细表
        ReadingQualityListVo table3vo = new ReadingQualityListVo();
        Page<ReadingQualityListVo> table3List = this.getReadingQualitySchool(user, table3vo, new PageVo(0, 6));
        map.put("table3List", table3List);
        // 第4个表格
        Page<ReadingQualityListVo> table4List = this.getReadingDetailySchool(user, new ReadingQualityListVo(),
                new PageVo(0, 6));
        map.put("table4List", table4List);
        // 第三张图片雷达图
        RubricDto rubricDto = new RubricDto();
        rubricDto.setUserId(user.getUserId());
        Map<String, Object> p3 = this.getAnalyzeReportOfSchoolRubric(rubricDto);
        DefaultCategoryDataset dataset3 = new DefaultCategoryDataset();
        // 1整体感知,2形成解释,3作出评价,4提取信息,5实际运用
        dataset3.addValue(((List<Integer>) p3.get("list")).get(0), "", "整体感知");
        dataset3.addValue(((List<Integer>) p3.get("list")).get(1), "", "形成解释");
        dataset3.addValue(((List<Integer>) p3.get("list")).get(2), "", "作出评价");
        dataset3.addValue(((List<Integer>) p3.get("list")).get(3), "", "提取信息");
        dataset3.addValue(((List<Integer>) p3.get("list")).get(4), "", "实际运用");
        String chart3 = System.currentTimeMillis() + ".png";
        String chartName3 = c.createPolarChart("雷达图", dataset3, chart3);

        map.put("image3", c.getImageStr(chartName3));

        // 第4张图片 阅读积分
        Map<String, Object> map4 = hisScoreService.getReadScoreAnalyze(user, dto);
        String chart4 = System.currentTimeMillis() + ".png";
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        dataset.addValue((Number) map4.get("one"), "实际", "红色经典");
        dataset.addValue((Number) map4.get("avg"), "平均", "红色经典");
        dataset.addValue((Number) map4.get("two"), "实际", "普通读物");
        dataset.addValue((Number) map4.get("avg"), "平均", "普通读物");
        dataset.addValue((Number) map4.get("three"), "实际", "中外名著");
        dataset.addValue((Number) map4.get("avg"), "平均", "中外名著");
        dataset.addValue((Number) map4.get("four"), "实际", "传统文化");
        dataset.addValue((Number) map4.get("avg"), "平均", "传统文化");
        String makeBarGroupChart = c.makeBarGroupChart(dataset, chart4);

        map.put("image4", c.getImageStr(makeBarGroupChart));

最后使controller

@RequestMapping("/exportDoc")
    public void exportDoc(HttpServletRequest request, HttpServletResponse response
            ,AnalyzeDto dto) throws Exception{

        Map<String, Object> map = teacherService.useFreeExportWord(request,  getCurUser(), dto);

        ExportDoc exportDoc = new ExportDoc();
        exportDoc.create(map,response);
    }

要注意几点:

  • 前台访问的时候不要使用ajax 访问. 不然页面无法实现用户指定下载路劲 可以使用 form 表单提交 将页面控制住不跳转
    this.AjaxDownload = function (data, route) {
            var form=$("<form>");//定义一个form表单
            form.attr("style","display:none");
            form.attr("target","");
            form.attr("method","post");
            form.attr("action",route);
            $("body").append(form);//将表单放置在web中
            for (items in data){
                var input1=$("<input>");
                input1.attr("type","hidden");
                input1.attr("name",items);
                input1.attr("value",data[items]);
                form.append(input1);
            }
            form.submit().remove();//表单提交
        };

以上一个封装的 ajax

  • 将word 文件 存为 2003版的xml 格式的,然后更改后缀名 为 ftl 放在你要读取的位置
  • 然后将你需要的数据 比如 学校 占位 ${school} 这样你在程序里map 键名为 map.put(“school”,”小刀”);就可以了
  • 我上面写的是讲图片放到项目路劲下面,然后回去图片的base64就可以了.
  • 如果是表格 需要修改 ftl 源文件
    如下图:

这里写图片描述

  • 将一个list 放入 map 中就可以开始遍历了.
  • 如果你需要用我的代码写的时候.你只需要将service 层的代码稍微做下修改 就可以.
  • 总结: 总体来说 freemarker 模块比itext 导出word 的要方便的多. 如果你需要导出word freemarker 模块绝对是首选之一..好了..我还是码代码去吧.毕竟导出word 还没有写完.这里先写一篇博客.

*欢迎一起学习 373899683 qq 群
————————-*

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值