poi生成word文档,word表格,将echar报表生成到word



项目中用到生成word报表,报表中有表格的合并 、页眉、表格中会有报表图片。然后查找了网上的资料,利用echar生成柱状图,然后已base64串的方式发给后台,在后台解析成字节数组 ,利用poi生成到word文档中。



先来张效果图:




java word 直方图表 java生成word图表_echar图片生成到word




项目的主要代码:



pom.xml  主要需要引入


<dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>3.15</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>3.15</version>
    </dependency>
  </dependencies>





java代码:



EchartsController.java





package com.lyq.web;

import com.lyq.util.ExportWordUtil;
import org.apache.commons.io.FileUtils;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import sun.misc.BASE64Decoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;

/**
 * 
*    
* 创建人:lyq
* 创建时间:2017-9-13 下午12:49:52
* 修改备注:   
* @version    
*
 */
@Controller
@RequestMapping("/echarts")
public class EchartsController {

	private static final Logger logger = LoggerFactory.getLogger(EchartsController.class);

	@RequestMapping(value="/viewEcharts")
	@ResponseBody
	public Map<String, Object> echartsMap(HttpServletRequest request, HttpServletResponse response) {
		
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("category", new String[]{"70年代人数","80年代人数","90年代人数","00年代人数"});
		map.put("child", new int[] {10000,20000,30000,40000});
		map.put("old", new int[] {30000,25000,20000,15000});
		map.put("man", new int[]{1000000,1500000,1550000,1600000});
		return map;
	} 
	
	@RequestMapping("/goEchart")
	public String goEchart(HttpServletRequest request, HttpServletResponse response) {
		return "/echart";
	}

	/**
	 * 报警分析报表下载
	 */
	@RequestMapping("/exportReport")
	@ResponseBody
	public Map<String,String> exportReport(HttpServletResponse response, HttpServletRequest request, String picBase64Info1) {
		Map<String,String> map = new HashMap();
		try {
			byte[] base64Info1 = decodeBase64(picBase64Info1);
			XWPFDocument xdoc = new ExportWordUtil().export(base64Info1);

			Calendar c = Calendar.getInstance();
			String fileName = "生成分析报告" + c.get(Calendar.YEAR) + to2String(String.valueOf((c.get(Calendar.MONTH) + 1)))
					+ c.get(Calendar.DAY_OF_MONTH) + c.get(Calendar.HOUR_OF_DAY) + c.get(Calendar.MILLISECOND) + ".docx";
			//获取存放路径
			String classPath = FileUtils.class.getClassLoader().getResource("/").getPath();
			String os_name = System.getProperties().get("os.name").toString().toLowerCase();
			if (os_name.indexOf("windows") != -1) {
				classPath = classPath.substring(1, classPath.indexOf("/WEB-INF/classes")) + "/upload/";
			} else if (os_name.indexOf("linux") != -1) {
				classPath = FileUtils.class.getProtectionDomain().getCodeSource().getLocation().getPath();
				classPath = "/" + classPath.substring(1, classPath.indexOf("/WEB-INF/")) + "/upload/";
			}
			logger.info("==============report================" + classPath + fileName);
			FileOutputStream fos = new FileOutputStream(classPath + fileName);
			xdoc.write(fos);
			fos.close();

			map.put("ret", "/upload/" + fileName);
			return map;
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			map.put("ret", "faild");
			return map;
		}
	}


	/**
	 * 解析base64,返回图片所在路径
	 *
	 * @param base64Info
	 * @return
	 */
	private byte[] decodeBase64(String base64Info) {
		if (StringUtils.isEmpty(base64Info)) {
			return null;
		}
		BASE64Decoder decoder = new BASE64Decoder();
		if (!base64Info.contains("base64,"))
			return null;
		String[] arr = base64Info.split("base64,");
		// 数据中:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABI4AAAEsCAYAAAClh/jbAAA
		// ... 在"base64,"之后的才是图片信息
		try {
			return decoder.decodeBuffer(arr[1]);
		} catch (IOException e) {
			logger.info(e.getMessage(), e);
			return null;
		}
	}

	private String to2String(String str) {
		if (str.length() > 2) {
			str = str.substring(0, 2);
		} else {
			str = "0" + str;
		}
		return str;
	}
}



ExportWordUtil.java
/**
 * 
 */
package com.lyq.util;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.imageio.stream.FileImageInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.math.BigInteger;
import java.text.DecimalFormat;

/**
 * 导出Excel公共方法
 * 
 * @author lyq
 */
public class ExportWordUtil {
	
	private static final Logger logger = LoggerFactory.getLogger(ExportWordUtil.class);

	/**
	 * 导出word
	 * @param base64Info1		报表图片数据
	 * @return
	 */
	public XWPFDocument export(byte[] base64Info1) {
		try {
			CustomXWPFDocument xdoc = new CustomXWPFDocument();
			// 创建页眉
			createCtp(xdoc);

			// 标题
			createTitle(xdoc);

			XWPFTable dTable = xdoc.createTable(4, 3);
			createBaseInfoTable(dTable, xdoc, "未来科技", "谢谢侬",	"1024", "生成报表201709120056251");
			// 标题一、未来科技数据统计分析
			createTitle(xdoc, "一、	未来科技数据统计分析");

			// 报表数据分析
			XWPFTable dataReportTable = xdoc.createTable(4, 2);
			createDataReportTable(dataReportTable, xdoc, base64Info1);

			return xdoc;
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			throw new RuntimeException("生成文件失败");
		}
	}

	/**
	 * 在cell 里面插入图片
	 * @param xdoc
	 * @param paragraph
	 * @param imageByte
	 */
	private void createPic(CustomXWPFDocument xdoc, XWPFParagraph paragraph, byte[] imageByte) {
		try {
			xdoc.addPictureData(imageByte, XWPFDocument.PICTURE_TYPE_JPEG);
		} catch (InvalidFormatException e) {
			e.printStackTrace();
		}
		xdoc.createPicture(paragraph, xdoc.getAllPictures().size() - 1, 300, 200, "    ");
	}

	// 图片到byte数组
	public byte[] image2byte(String path) {
		byte[] data = null;
		FileImageInputStream input = null;
		try {
			input = new FileImageInputStream(new File(path));
			ByteArrayOutputStream output = new ByteArrayOutputStream();
			byte[] buf = new byte[1024];
			int numBytesRead = 0;
			while ((numBytesRead = input.read(buf)) != -1) {
				output.write(buf, 0, numBytesRead);
			}
			data = output.toByteArray();
			output.close();
			input.close();
		} catch (FileNotFoundException ex1) {
			ex1.printStackTrace();
		} catch (IOException ex1) {
			ex1.printStackTrace();
		}
		return data;
	}

	/**
	 * 创建标题
	 */
	private void createTitle(CustomXWPFDocument xdoc) {
		// 标题
		XWPFParagraph titleMes = xdoc.createParagraph();
		titleMes.setAlignment(ParagraphAlignment.CENTER);
		XWPFRun r1 = titleMes.createRun();
		r1.setBold(true);
		r1.setFontFamily("华文仿宋");
		r1.setText("未来科技平台统计分析报告");// 活动名称
		r1.setFontSize(18);
		r1.setColor("333333");
		r1.setBold(true);
	}

	/**
	 * 生成页眉
	 */
	public void createCtp(CustomXWPFDocument document) {
		CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
		XWPFHeaderFooterPolicy policy = new XWPFHeaderFooterPolicy(document, sectPr);
		// 添加页眉
		CTP ctpHeader = CTP.Factory.newInstance();
		CTR ctrHeader = ctpHeader.addNewR();
		CTText ctHeader = ctrHeader.addNewT();
		String headerText = "我的报表我做主                                                                                         在我的地盘听我的";
		ctHeader.setStringValue(headerText);
		XWPFParagraph headerParagraph = new XWPFParagraph(ctpHeader, document);
		// 设置为左对齐
		headerParagraph.setAlignment(ParagraphAlignment.BOTH);
		XWPFParagraph[] parsHeader = new XWPFParagraph[1];
		parsHeader[0] = headerParagraph;
		try {
			policy.createHeader(XWPFHeaderFooterPolicy.DEFAULT, parsHeader);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 生成基础信息Table
	 *
	 * @param table
	 * @param xdoc
	 */
	public void createBaseInfoTable(XWPFTable table, CustomXWPFDocument xdoc, String dateStr, String unitName,
			String machineNum, String reportNo) {
		String bgColor = "111111";
		CTTbl ttbl = table.getCTTbl();
		CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();
		CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();
		tblWidth.setW(new BigInteger("8600"));
		tblWidth.setType(STTblWidth.AUTO); // STTblWidth.AUTO 自动长度
		mergeCellsVertically(table, 0, 0, 3);
		setCellText(xdoc, getCellHight(table, 0, 0, 2400), "基 础 信 息", bgColor, 600, 14, "仿宋");
		setCellText(xdoc, getCellHight(table, 0, 1, 600), "报告周期", bgColor, 1800, 14, "仿宋");

		setCellText(xdoc, getCellHight(table, 0, 2, 600), dateStr, bgColor, 6200, 14, "仿宋");

		setCellText(xdoc, getCellHight(table, 1, 1, 600), "单位名称", bgColor, 1800, 14, "仿宋");
		if (unitName == null)
			unitName = "";
		setCellText(xdoc, getCellHight(table, 1, 2, 600), unitName, bgColor, 6200, 14, "仿宋");

		setCellText(xdoc, getCellHight(table, 2, 1, 600), "主机数量", bgColor, 1800, 14, "仿宋");
		setCellText(xdoc, getCellHight(table, 2, 2, 600), machineNum, bgColor, 6200, 14, "仿宋");

		setCellText(xdoc, getCellHight(table, 3, 1, 600), "报告编号", bgColor, 1800, 14, "仿宋");
		setCellText(xdoc, getCellHight(table, 3, 2, 600), reportNo, bgColor, 6200, 14, "仿宋");
	}

	/**
	 * 生成标题
	 * 
	 * @param xdoc
	 * @param titleText
	 */
	public void createTitle(CustomXWPFDocument xdoc, String titleText) {
		XWPFParagraph headLine2 = xdoc.createParagraph();
		headLine2.setAlignment(ParagraphAlignment.CENTER);
		XWPFRun runHeadLine2 = headLine2.createRun();
		runHeadLine2.setText(titleText);
		runHeadLine2.setFontSize(16);
		runHeadLine2.setFontFamily("华文仿宋");
		runHeadLine2.setBold(true);
		runHeadLine2.setColor("333333");
	}



	/**
	 * 报表数据分析
	 * 
	 * @param table
	 * @param xdoc
	 */
	public void createDataReportTable(XWPFTable table, CustomXWPFDocument xdoc, byte[] base64Info1) {
		String bgColor = "111111";
		CTTbl ttbl = table.getCTTbl();
		CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();
		CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();
		tblWidth.setW(new BigInteger("8600"));
		tblWidth.setType(STTblWidth.AUTO); // STTblWidth.AUTO 自动长度
		// mergeCellsVertically(table, 0, 0, 3);
		mergeCellsHorizontal(table, 0, 0, 1);
		
		String  str = "";
		Double sss = 0.6666666666666666;
		DecimalFormat df = new DecimalFormat("0.00");

		str = "(一)报告时间内误报率"+df.format((sss * 100))+"%";

		setCellText(xdoc, getCellHight(table, 0, 0, 1200), str, bgColor, 8600, 14, "仿宋");

		setCellText(xdoc, getCellHight(table, 1, 0, 1200), "报表数据", bgColor, 4300, 14, "仿宋");
		setCellText(xdoc, getCellHight(table, 1, 1, 1200), "报表数据", bgColor, 4300, 14, "仿宋");

		// 自动报警数量环比 报表
		if(base64Info1 == null || base64Info1.length < 100){
			setCellText(xdoc, getCellHight(table, 2, 0, 1200), "暂无数据", bgColor, 4300, 14, "仿宋");
		} else {
			setCellPic(xdoc, getCellHight(table, 2, 0, 1200), base64Info1);
		}
		// 自动报警数量同比 报表
		if(base64Info1 == null || base64Info1.length < 100){
			setCellText(xdoc, getCellHight(table, 2, 1, 1200), "暂无数据", bgColor, 4300, 14, "仿宋");
		} else {
			setCellPic(xdoc, getCellHight(table, 2, 1, 1200), base64Info1);
		}
		mergeCellsHorizontal(table, 3, 0, 1);
		setCellText(xdoc, getCellHight(table, 3, 0, 1200), "数据汇总\n1:@@@@@@@@@@@@@@@@@@@@@\n2!!!!!!!!!!!!!!!!!!!!!!!!", bgColor, 4300, 14, "仿宋", ParagraphAlignment.LEFT,true);

	}

	// 设置表格高度
	private XWPFTableCell getCellHight(XWPFTable xTable, int rowNomber, int cellNumber, int hight) {
		XWPFTableRow row = null;
		row = xTable.getRow(rowNomber);
		row.setHeight(hight);
		XWPFTableCell cell = null;
		cell = row.getCell(cellNumber);
		cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
		return cell;
	}

	/**
	 * 创建图片
	 */
	private void setCellPic(CustomXWPFDocument xdoc, XWPFTableCell cell, byte[] imageByte) {
		createPic(xdoc, cell.addParagraph(), imageByte);
	}

	private void setCellText(CustomXWPFDocument xDocument, XWPFTableCell cell, String text, String bgcolor, int width,
			int fontSize, String textType) {
		setCellText(xDocument, cell, text, bgcolor, width, fontSize, textType, ParagraphAlignment.CENTER);
	}

	/**
	 * 
	 * @param xDocument
	 * @param cell
	 * @param text
	 * @param bgcolor
	 * @param width
	 */
	private void setCellText(CustomXWPFDocument xDocument, XWPFTableCell cell, String text, String bgcolor, int width,
			int fontSize, String textType, ParagraphAlignment align) {
		setCellText(xDocument, cell, text, bgcolor, width, fontSize, textType, align, false);
	}

	private void setCellText(CustomXWPFDocument xDocument, XWPFTableCell cell, String text, String bgcolor, int width,
			int fontSize, String textType, ParagraphAlignment align, boolean isBold) {
		CTTc cttc = cell.getCTTc();
		CTTcPr cellPr = cttc.addNewTcPr();
		cellPr.addNewTcW().setW(BigInteger.valueOf(width));
		XWPFParagraph pIO = cell.addParagraph();
		if (null == align) {
			pIO.setAlignment(ParagraphAlignment.CENTER);
		} else {
			pIO.setAlignment(align);
		}
		cell.removeParagraph(0);

		if (text.contains("\n")) {
			String[] myStrings = text.split("\n");
			for (int i = 0; i < myStrings.length; i++) {
				String temp = myStrings[i];
				if (isBold) {
					if (i == 0) {
						setTextStyle(pIO, textType, bgcolor, fontSize, temp, true, true);
					} else {
						setTextStyle(pIO, textType, bgcolor, fontSize, "      " + temp, true, false);
					}
				} else {
					setTextStyle(pIO, textType, bgcolor, fontSize, temp, true, false);
				}
			}
		} else {
			setTextStyle(pIO, textType, bgcolor, fontSize, text, false, false);
		}
	}

	private void setTextStyle(XWPFParagraph pIO, String textType, String bgcolor, int fontSize, String text,
			boolean isEntery, boolean isBold) {
		XWPFRun rIO = pIO.createRun();
		if (textType == null || textType.equals("")) {
			rIO.setFontFamily("微软雅黑");
		} else {
			rIO.setFontFamily(textType);
		}
		if (bgcolor == null || bgcolor.equals("")) {
			rIO.setColor("000000");
		} else {
			rIO.setColor(bgcolor);
		}
		rIO.setFontSize(fontSize);
		rIO.setText(text);
		if (isBold)
			rIO.setBold(true);
		if (isEntery)
			rIO.addBreak();
	}

	// 设置表格间的空行
	public void setEmptyRow(CustomXWPFDocument xdoc, XWPFRun r1) {
		XWPFParagraph p1 = xdoc.createParagraph();
		p1.setAlignment(ParagraphAlignment.CENTER);
		p1.setVerticalAlignment(TextAlignment.CENTER);
		r1 = p1.createRun();
	}

	// word跨列合并单元格
	public void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) {
		for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {
			XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
			if (cellIndex == fromCell) {
				// The first merged cell is set with RESTART merge value
				cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
			} else {
				// Cells which join (merge) the first one, are set with CONTINUE
				cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
			}
		}
	}

	// word跨行并单元格
	public void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
		for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
			XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
			if (rowIndex == fromRow) {
				// The first merged cell is set with RESTART merge value
				cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
			} else {
				// Cells which join (merge) the first one, are set with CONTINUE
				cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
			}
		}
	}
}
CustomXWPFDocument.java



package com.lyq.util;

/**
 * Created by lyq on 2017/9/7.
 * POI 导出图片bug修复
 */

import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlToken;
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;

import java.io.IOException;
import java.io.InputStream;

/**
 *
 */
public class CustomXWPFDocument extends XWPFDocument {
	
    public CustomXWPFDocument(InputStream in) throws IOException {
        super(in);
    }

    public CustomXWPFDocument() {
        super();
    }

    /**
     * @param pkg
     * @throws IOException
     */
    public CustomXWPFDocument(OPCPackage pkg) throws IOException {
        super(pkg);
    }  // picAttch 图片后面追加的字符串 可以是空格
    public void createPicture(XWPFParagraph paragraph,int id, int width, int height,String picAttch) {
        final int EMU = 9525;
        width *= EMU;
        height *= EMU;
        String blipId = getAllPictures().get(id).getPackageRelationship()
                .getId();

        CTInline inline = paragraph.createRun().getCTR()
                .addNewDrawing().addNewInline();
        paragraph.createRun().setText(picAttch);
        String picXml = ""
                + "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"
                + "   <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"
                + "      <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"
                + "         <pic:nvPicPr>" + "            <pic:cNvPr id=\""
                + id
                + "\" name=\"Generated\"/>"
                + "            <pic:cNvPicPr/>"
                + "         </pic:nvPicPr>"
                + "         <pic:blipFill>"
                + "            <a:blip r:embed=\""
                + blipId
                + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"
                + "            <a:stretch>"
                + "               <a:fillRect/>"
                + "            </a:stretch>"
                + "         </pic:blipFill>"
                + "         <pic:spPr>"
                + "            <a:xfrm>"代码下载地址
                + "               <a:off x=\"0\" y=\"0\"/>"
                + "               <a:ext cx=\""
                + width
                + "\" cy=\""
                + height
                + "\"/>"
                + "            </a:xfrm>"
                + "            <a:prstGeom prst=\"rect\">"
                + "               <a:avLst/>"
                + "            </a:prstGeom>"
                + "         </pic:spPr>"
                + "      </pic:pic>"
                + "   </a:graphicData>" + "</a:graphic>";

        inline.addNewGraphic().addNewGraphicData();
        XmlToken xmlToken = null;
        try {
            xmlToken = XmlToken.Factory.parse(picXml);
        } catch (XmlException xe) {
            xe.printStackTrace();
        }
        inline.set(xmlToken);
        // graphicData.set(xmlToken);

        inline.setDistT(0);
        inline.setDistB(0);
        inline.setDistL(0);
        inline.setDistR(0);

        CTPositiveSize2D extent = inline.addNewExtent();
        extent.setCx(width);
        extent.setCy(height);

        CTNonVisualDrawingProps docPr = inline.addNewDocPr();
        docPr.setId(id);
        docPr.setName("图片" + id);
        docPr.setDescr("");
    }
}

echar.jsp代码:


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<head>
<link type="text/css" rel="stylesheet" media="all" href="<%=path %>/static/styles/styles.css" />
<script type="text/javascript" src="<%=path %>/js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="<%=path %>/js/echarts.min.js"></script>
</head>
<style>
	*{
		margin:0px;
		padding:0px;
	}
	#form {
		padding-top:600px;
		width:400px;
		height:500px;
	}
	#btn {
		padding:8px 20px;
		color:#fff;
		background:#141414;
		border-radius:4px;
		transition: all  1s ease;
	}
	#btn:hover{
		background:#60c;transition: all  1s ease;
		}
</style>
<body>
 <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="echart" style="height:400px;width:500px">
    	<h1>欢迎来到echart首页</h1>
    </div>
    <input type ="button" value="下载" οnclick="fn()"/>
    <!-- ECharts单文件引入 -->
</body>
<script type="text/javascript">
    var myChart ;
	 $(function(){
		//获得后台数据
		var category;//年代
		var child;//孩子
		var old;//老人
		var man;//大人
		$.ajax({
			url:'<%=path%>/echarts/viewEcharts.html',
			async:false,
			dataType: "json",
			cache: false,
			success: function(data){
				category=data.category;
				child=data.child;
				old=data.old;
				man=data.man;
                // 基于准备好的dom,初始化echarts图表
                myChart = echarts.init(document.getElementById('echart'),"echart");

                var option = {
                    tooltip: {//提示框,鼠标悬浮交互时的信息提示
                        show: true
                    },

                    toolbox:{//定义工具按钮
                        show : true,
                        feature : {
                            dataView : {show: true, readOnly: false},//数据信息按钮
                            magicType : {show: true, //显示折线、柱状图等切换按钮
                                type: ['line', 'bar','stack', 'tiled']}
                        }
                    },
                    legend: {//图例
                        data:['孩子','老人','大人']
                    },
                    xAxis : [//x轴设置
                        {
                            type : 'category',//x轴显示类别
                            data : category//年代
                        }
                    ],
                    yAxis : [//y轴设置
                        {
                            type : 'value'///y轴显示数据值
                        }
                    ],
                    series : [
                        {
                            "name":"孩子",
                            "type":"bar",
                            "data":child
                        },
                        {
                            "name":"老人",
                            "type":"bar",
                            "data":old
                        },
                        {
                            "name":"大人",
                            "type":"bar",
                            "data":man
                        }
                    ]
                };

                // 为echarts对象加载数据
                myChart.setOption(option);
			}
			})

	});

     function fn () {
         var data = {};
         data.picBase64Info1 = myChart.getDataURL();
         $.ajax({
             url:'<%=path%>/echarts/exportReport.html',
             type:"post",
             data:data,
             dataType:"json",
             success:function(data1){
                 if('faild' == data1.ret){
                     alert('下载失败请重试...');
                 }else{
                     window.location.href = '../'+data1.ret;
                 }
             }
         });
     }
    
//     function down(ec){
//         var data={};
//         var myChart = ec.init(document.getElementById('echart'),"dark");
//
//     }



</script>
</html>




主要代码如上所示,没有啥好说的,没啥难得,看看例子就能明白。