Java导出pdf/word
 2018-03-05 19:39:47   666   0   

本文最后更新于天前,文中介绍内容及环境可能已不适用.请谨慎参考.

这几天接到个任务,需要将web呈现的表格数据导出为文档,包括pdf和word文档,

并且在显示界面没有呈现图表的情况下,导出文档可选包含相关联的柱状/线图/饼图图形.

研究了2天。搜索了些资料,算是解决了,记录一下.

主要使用FreeMarker / JFreeChart 实现功能.

一.图表生成,柱图/线图:

使用JFreeChart,后台生成对应的渲染图片。

线/bar

DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
			for (ItemData line : itemList) {
				dataSet.addValue(line.getYvalue(), line.getGroupName(),
						line.getXvalue());
			}

....
if (type == CType.LINE)
			lineChartObject = ChartFactory.createLineChart(title, xLabel, // 横轴
					yLabel, // 纵轴
					dataSet, // 获得数据集
					PlotOrientation.VERTICAL,// 图标方向垂直
					true, // 显示图例
					false, // 不用生成工具
					false // 不用生成URL地址
					);
		else if (type == CType.BAR)
			lineChartObject = ChartFactory.createBarChart(title, xLabel, // 横轴
					yLabel, // 纵轴
					dataSet, // 获得数据集
					PlotOrientation.VERTICAL,// 图标方向垂直
					true, // 显示图例
					false, // 不用生成工具
					false // 不用生成URL地址
					);

DefaultPieDataset dpd = new DefaultPieDataset(); // 建立一个默认的饼图
		for (int i = 0; i < itemList.size(); i++) {
			dpd.setValue(itemList.get(i).getXvalue(), itemList.get(i).getYvalue()); // 输入数据
		}
...
	JFreeChart chart = ChartFactory.createPieChart(title,
				getPieDataset(itemList), true, true, false);

生成图片:

	ChartUtilities.saveChartAsJPEG(lineChart, lineChartObject, getWidth(),
				getHeight());

	ChartUtilities.writeChartAsJPEG(os, chart, getWidth(), getHeight());

JFreeChart通用类-下载

猛击下载

 

 

二.pdf生成

先通过FreeMarker生成html模板文件,然后通过itext生成pdf文件.

private void convertToPDF(PdfWriter writer, Document document,
			String htmlString) {
		// 获取字体路径
		String fontPath = getFontPath();
		document.open();
		InputStream css= XMLWorkerHelper.class.getResourceAsStream("/default.css");
		
		
		String path = FreeMarkerUtil.class.getClassLoader().getResource("")
				.getPath();
		
		try {
			//大部分css样式写在.ftl中才有用
			String cssPath = path + "/templates/pdf.css";
			InputStream css2=new FileInputStream(cssPath);
			
			
			XMLWorkerHelper.getInstance().parseXHtml(writer, document,
					new ByteArrayInputStream(htmlString.getBytes()),
					css2,
					Charset.forName("UTF-8"),
					new XMLWorkerFontProvider(fontPath));
		} catch (IOException e) {
			e.printStackTrace();
			throw new PDFException("PDF文件生成异常", e);
		} finally {
			document.close();
		}

	}

 

word生成

这个更简单点、将普通的word文件模板保存为xml文件、编辑xml文件,将需要替换的部分修改为FreeMarder标记、另存xml文件为ftl模板。

其中需要注意的是图片需要保存为base64位格式。

如下为doc保存为xml,修改后的ftl文件.替换表格字段

...图片数据替换(base64格式)
 <pkg:part pkg:name="/word/media/image1.jpeg" pkg:contentType="image/jpeg">
        <pkg:binaryData>${picUrl}</pkg:binaryData>
    </pkg:part>

....

表格属性替换 
<#list tb.head.items as  headitem>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="1696" w:type="dxa"/>
                                    <w:vAlign w:val="top"/>
                                </w:tcPr>
                                <w:p>
                                    <w:pPr>
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia" w:eastAsia="宋体"/>
                                            <w:vertAlign w:val="baseline"/>
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN"/>
                                        </w:rPr>
                                    </w:pPr>
                                    <w:r>
                                        <w:rPr>
                                            <w:rFonts w:hint="eastAsia"/>
                                            <w:vertAlign w:val="baseline"/>
                                            <w:lang w:val="en-US" w:eastAsia="zh-CN"/>
                                        </w:rPr>
                                        <w:t>${headitem.name}</w:t>
                                    </w:r>
                                </w:p>
                            </w:tc>
                            </#list>

直接使用FreeMarker替换为doc文件即可.

public String exportToDoc(Object data, String PathName,
			String fileTemplateName, String outName) {

		setSaveFilePath(PathName + outName);

		// String templatePath=getPDFTemplatePath(fileName);
		// String templateFileName=getTemplateName(templatePath);
		// String templateFilePath=getTemplatePath(templatePath);
		if (StringUtils.isEmpty(PathName)) {
			throw new FreeMarkerException("templatePath can not be empty!");
		}
		try {
			Configuration config = new Configuration(
					Configuration.VERSION_2_3_25);
			config.setDefaultEncoding("UTF-8");

			String path = FreeMarkerUtil.class.getClassLoader().getResource("")
					.getPath();
			String TemplatePath = path + "/templates/";

			config.setDirectoryForTemplateLoading(new File(TemplatePath));
			config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
			config.setLogTemplateExceptions(false);
			Template template = config.getTemplate(fileTemplateName);
			StringWriter writer = new StringWriter();

			if (StringUtils.isEmpty(saveFilePath)) {
				saveFilePath = getDefaultSavePath(outName);
			}
			FileOutputStream fos = new FileOutputStream(saveFilePath);

			Writer out = new BufferedWriter(
					new OutputStreamWriter(fos, "utf-8"), 10240);
			template.process(data, out);
			writer.flush();
			// String html = writer.toString();
			return saveFilePath;
		} catch (Exception ex) {
			throw new FreeMarkerException("FreeMarkerUtil process fail", ex);
		}
	}

 

 


 2019-01-14 20:57:37 
 1

  本文基于CC BY-NC-ND 4.0 许可协议发布,作者:野生的喵喵 固定链接: 【Java导出pdf/word】 转载请注明



发表新的评论
{{s_uid}}   , 欢迎回来.
您的称呼(*必填):
您的邮箱地址(*必填,您的邮箱地址不会公开,仅作为有回复后的消息通知手段):
您的站点地址(选填):
留言:

∑( ° △ °|||)︴

(๑•̀ㅂ•́)و✧
<( ̄) ̄)>
[]~( ̄▽ ̄)~*
( ̄ˇ ̄)
[]~( ̄▽ ̄)~*
( ̄ˇ ̄)
╮( ̄▽ ̄)╭
( ̄ε(# ̄)
(⊙ˍ⊙)
( ̄▽ ̄)~*
∑( ° △ °|||)︴

文章分类

可能喜欢 

KxのBook@Copyright 2017- All Rights Reserved
Designed and themed by 野生的喵喵   1624093   44999