Export DhtmlxGrid to PDF in Java

2011.08.11 | Comments

将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保存为一个文件,让用户下载。

原创文章,转载请注明: 转载自JavaChen Blog,作者:JavaChen
本文链接地址:http://blog.javachen.com/2011/08/11/export-dhtmlxgrid-to-pdf-in-java.html
本文基于署名2.5中国大陆许可协议发布,欢迎转载、演绎或用于商业目的,但是必须保留本文署名和文章链接。 如您有任何疑问或者授权方面的协商,请邮件联系我。