Export DhtmlxGrid to PDF in Java

简介:

将DhtmlxGrid数据导出到pdf这是很常见的需求,dhtmlx官网提供了php和java版本的例子,你可以去官网查看这篇文章《Grid-to-Excel, Grid-to-PDF Available for Java》,你可以从以下地址下载导出程序源码: Export to Excel Export to PDF 当然,还有一个示例工程: .zip archive with an example

XML2PDF和XML2Excel工程内代码很相似,XML2PDF内部使用了PDFjet.jar导出PDF,而XML2Excel使用JXL导出Excel。 需要说明的是,还需要引入dhtmlxgrid_export.js文件,该文件是导出grid的js源码,主要用于将表格数据,包括表头、样式等,序列化为xml字符串,然后模拟一个Form表单提交数据。

将上面三个工程导入到一个工程然后打开sample.html页面,效果如下:

点击Get as PDF按钮,你会发现会打开一个新的窗口,然后页面什么都没有,而eclipse控制台报空指针异常。异常的主要原因在于下段代码:。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance ();
DocumentBuilder db = dbf.newDocumentBuilder();
Document dom = null;
try {
     dom = db.parse(new InputSource(new StringReader(xml)));
}catch(SAXException se) {
     se.printStackTrace();
}catch(IOException ioe) { 
     ioe.printStackTrace();
}
root = dom.getDocumentElement();

上面的代码,DocumentBuilder解析xml字符串后dom对象内并没有数据。 为了能够看到DhtmlxGrid导出pdf的效果,决定将上面的代码用dom4j改写,于是有了下面的代码:

public class PDFXMLParser {
	Element root;
	PDFColumn[][] columns;
	PDFRow[] rows;
	double[] widths;
	private Boolean header = false;
	private Boolean footer = false;
	private String profile = "gray";
	private double[] orientation = null;

	public void setXML(String xml) {
		SAXReader saxReader = new SAXReader();

		Document document = null;
		try {
			document = saxReader.read(new ByteArrayInputStream(xml.getBytes()));
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		root = document.getRootElement();

		if ((root.attributeValue("header") != null)
				&& (root.attributeValue("header").equalsIgnoreCase("true") == true)) {
			header = true;
		}
		String footer_string = root.attributeValue("footer");
		if ((footer_string != null)
				&& (footer_string.equalsIgnoreCase("true") == true)) {
			footer = true;
		}
		String profile_string = root.attributeValue("profile");
		if (profile_string != null) {
			profile = profile_string;
		}

		String orientation_string = root.attributeValue("orientation");
		if (orientation_string != null) {
			if (orientation_string.equalsIgnoreCase("landscape")) {
				orientation = A4.LANDSCAPE;
			} else {
				orientation = A4.PORTRAIT;
			}
		} else {
			orientation = Letter.PORTRAIT;
		}
	}

	public PDFColumn[][] getColumnsInfo() {
		PDFColumn[] colLine = null;
		List n1 = root.element("head").elements("columns");
		if ((n1 != null) && (n1.size() > 0)) {
			columns = new PDFColumn[n1.size()][];
			for (int i = 0; i < n1.size(); i++) {
				Element cols = (Element) n1.get(i);
				List n2 = cols.elements("column");
				if ((n2 != null) && (n2.size() > 0)) {
					colLine = new PDFColumn[n2.size()];
					for (int j = 0; j < n2.size(); j++) {
						Element col_xml = (Element) n2.get(j);
						PDFColumn col = new PDFColumn();
						col.parse(col_xml);
						colLine[j] = col;
					}
				}
				columns[i] = colLine;
			}
		}
		createWidthsArray();
		optimizeColumns();
		return columns;
	}
        public PDFRow[] getGridContent() {
		List nodes = root.elements("row");
		if ((nodes != null) && (nodes.size() > 0)) {
			rows = new PDFRow[nodes.size()];
			for (int i = 0; i < nodes.size(); i++) {
				rows[i] = new PDFRow();
				rows[i].parse((Element) nodes.get(i));
			}
		}
		return rows;

	}

       *****
}

还需要修改PDFRow类的parse方法和PDFColumn的parse方法。

public class PDFRow {

	private String[] cells;

	public void parse(Element parent) {
		List nodes = ((Element) parent).elements("cell");
		if ((nodes != null) && (nodes.size() > 0)) {
			cells = new String[nodes.size()];
			for (int i = 0; i < nodes.size(); i++) {
				cells[i] = ((Element) nodes.get(i)).getTextTrim();
			}
		}
	}

	public String[] getCells() {
		return cells;
	}
}

public class PDFColumn {

	public void parse(Element parent) {
		colName = parent.getText();
		String width_string = parent.attributeValue("width");
		if (width_string!=null&&width_string.length() > 0) {
			width = Integer.parseInt(width_string);
		}
		type = parent.attributeValue("type");
		align = parent.attributeValue("align");
		String colspan_string = parent.attributeValue("colspan");
		if (colspan_string!=null&&colspan_string.length() > 0) {
			colspan = Integer.parseInt(colspan_string);
		}
		String rowspan_string = parent.attributeValue("rowspan");
		if (rowspan_string!=null&&rowspan_string.length() > 0) {
			rowspan= Integer.parseInt(rowspan_string);
		}
	}
}

这样xml字符串就能正常解析了,然后使用pdfjet.jar包就可以导出pdf了,最后的效果如下:

结论:

  • 1.导出pdf和导出Excel代码差不多,这里不做说明。
  • 2.使用上面的工具,可以将dhtmlxgrid的数据导出到pdf,并且导出的pdf还保持了grid表格的样式(包括颜色、多表头、表头合并、复选框等等),这点很不错。
  • 3.导出的pdf为多页显示,每页有表头
  • 4.导出后的pdf页面可以直接打印,当然如果在代码上做点处理,可以直接将pdf保存为一个文件,让用户下载。
目录
相关文章
|
2月前
|
Java
java Itext创建pdf
java Itext创建pdf
30 0
|
4月前
|
消息中间件 缓存 NoSQL
GitHub上标星75k+超牛的《Java面试突击版》,分享PDF离线版
不论是校招还是社招都避免不了各种面试。笔试,如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的,我这个有章可循‘说的意思只是说应对技术面试是可以提前准备。
|
2月前
|
Java Linux 数据安全/隐私保护
Java【代码 16】将word、excel文件转换为pdf格式和将pdf文档转换为image格式工具类分享(Gitee源码)aspose转换中文乱码问题处理
【2月更文挑战第3天】Java 将word、excel文件转换为pdf格式和将pdf文档转换为image格式工具类分享(Gitee源码)aspose转换中文乱码问题处理
96 0
|
2月前
|
Java 程序员 数据安全/隐私保护
分享一个word转pdf的工具类Aspose[java]
分享一个word转pdf的工具类Aspose[java]
41 0
|
3月前
|
Java
Java PDF 相关 1、拷贝多个PDF到一个PDF,并且文件大小变小,文本等信息保留
1、合并多个PDF,并且文件变小,后面添加的文本信息保留
26 0
|
3月前
|
安全 NoSQL Java
从安卓转到Java开发,我吃透了这份pdf,终于4面拿下美团offer
先说说个人情况吧,坐标广州,16年从一所普通二本大学毕业,毕业后在一家小公司干android开发,年薪在15w左右。转Java的契机是认识到了一个朋友,做Java后台的,经常跟他聊相关的内容,经过慎重考虑及个人的发展规划,所以就决定转型了。
|
4月前
|
JavaScript Java 数据安全/隐私保护
我把Github上最牛b的Java教程和实战项目整合成了一个PDF文档
大家都知道 Github 是一个程序员福地,这里有各种厉害的开源框架、软件或者教程。这些东西对于我们学习和进步有着莫大的进步,所以我有了这个将 Github 上非常棒的 Java 开源项目整理下来的想法。觉得不错的话,欢迎小伙伴们去star一波。
|
4月前
|
Java
Java 读取 Excel 模板,将数据填入Excel表格,后转换为PDF文件(实用)
Java 读取 Excel 模板,将数据填入Excel表格,后转换为PDF文件(实用)
98 0
|
4月前
|
Java Maven 数据安全/隐私保护
Java 将 Excel 转换为 PDF 文件
Java 将 Excel 转换为 PDF 文件
93 0
|
4月前
|
架构师 Java 数据库
阿里架构师花近十年时间整理出来的Java核心知识pdf(Java岗)
由于细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容! 整理了一份Java核心知识点。覆盖了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。

热门文章

最新文章