- 前段时间写了一篇使用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
// 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 还没有写完.这里先写一篇博客.