• 前段时间写了一篇使用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();
(2017年11月10号修正.今天发现一个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// titledataset,// datatrue,// include legendtrue, false);// 使下说明标签字体清晰,去锯齿类似于// chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);的效果chart.setTextAntiAlias(false);// 图片背景色chart.setBackgroundPaint(Color.white);// 设置图标题的字体重新设置titleFont 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);// 设置图标题的字体重新设置titleFont 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 stubCreateChart 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);}/*** 用于雷达图显示,(该项目目前未用)*/@Overrideprotected 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 群
————————-*

java 使用freemarker 导出word 和图片相关推荐

  1. Java使用freemarker导出word试卷

    使用了freemarker模板填充占位符的方式来生成word文档,支持跨平台. Java导出Word的五种方式 制作Word模板 将制作好的Word模板.docx另存为.xml格式,修改xml文件的内 ...

  2. java使用freemarker导出word标题失效问题

    java使用freemarker导出word标题失效问题 如图,导出格式错误切目录不可折叠 另存为xml发现 六级标题变成了其他级别:<w:pStyle w:val="60" ...

  3. java freemarker导出word 带图片,文件导出后图片无法使用office正常打开

    问题记录:java freemark导出word 带图片,文件导出后图片无法使用office正常打开,解决之! 现象:wps打开正常,office如下 修改点: 图片${image1}标签前后保证无空 ...

  4. JAVA使用FreeMarker导出Word工具类

    <!--freemarker word export--><dependency><groupId>org.freemarker</groupId>&l ...

  5. java通过freemarker导出word文档带图片并且循环

    转载请标明出处: https://blog.csdn.net/weixin_41965979/article/details/80969287 本文出自付付讶的博客 1:所需jar包:freemark ...

  6. Java用freemarker导出word

    概述 最近一个项目要导出word文档,折腾老半天,发现还是用freemarker的模板来搞比较方便省事,现总结一下关键步骤,供大家参考,这里是一个简单的试卷生成例子. 详细 代码下载:http://w ...

  7. Java用Freemarker导出word 内容换行

    最近一个项目要导出word文档,折腾老半天,发现还是用freemarker的模板来搞比较方便省事,现总结一下关键步骤,供大家参考,这里是一个简单的试卷生成例子. 一.模板的制作 先用Word做一个模板 ...

  8. 使用springboot和freemarker导出word带图片

    1.首先,要有一个模板word文件(.doc)  里面的样式要先调整好,需要放图片的地方加一个图片 占位  文字内容也要加一些内容占位 2.然后把word转成.ftl格式文件  很贱单  先把word ...

  9. freeMarker导出word带图片

    1.maven导入需要的jar包 <!-- 引入freeMarker的依赖包. --><dependency><groupId>org.springframewor ...

最新文章

  1. 信息与计算机科学专业自荐书,信息与计算科学专业的自荐信
  2. SAP CRM呼叫中心里Case ID的生成逻辑
  3. bootloader启动流程分析
  4. 游戏外挂是怎么炼成的
  5. C++中两个类中互相包含对方对象的指针问题
  6. 监管码服务器维修,云风的 BLOG
  7. python小白从哪来开始-写给小白的工程师入门 - 从 Python 开始
  8. mysql+分页脚本_MySql实现分页查询的SQL
  9. loadrunner具体实例教你如何进行结果分析
  10. 在 Docker 中使用 mysql 的一些技巧 1
  11. sip协议详解_WebRTC SDP 详解和剖析
  12. 织梦CMS采集织梦模板程序通用
  13. 十大管理概念(背诵)
  14. html书写表单laber,laber(labelhood是什么意思)
  15. python绘制指数函数图像及性质_python实现画出e指数函数的图像
  16. Centi和HandCash共同开发支付握手协议
  17. FOC:在MCU上检验Clark和Park坐标变换是否正确
  18. 牛客网 A-吐泡泡 栈的模拟
  19. 微信小程序的轮播图宽高
  20. 使用Keil uVision5进行开发的必备知识

热门文章

  1. 爱思助手安卓能用吗_手机资讯:【爱思助手】iOS8.4.1清理垃圾教程
  2. R中绘制以特定数值为对称的colorbar
  3. 计算机理线标准图,主机箱背部走线技巧 组装电脑走背线与理线教程(4)
  4. 【运维面试】k8s的日志你们是如何收集与管理的?
  5. 微信退款服务器系统失败怎么办,做微信退款,但时不时会退款失败,各位帮忙看看...
  6. fedora xface 更改系统语言
  7. 电子商务思维导图精品荟萃:电子商务思维导图大全
  8. docker运行容器命令中-it是什么意思
  9. 大数据基础--大数据深入了解
  10. 计算机网络5-详述链路层:封装成帧、透明传输、差错控制、链路层协议(SR GBN ALOHA CSMA PPP HDLC)、滑动窗口