今日教育办公系统结束。新内容有:导出数据到PDF文档、生成图表(饼图、柱图...),整体上操作比较简单。
一、创建PDF文档
我们使用iText创建PDF文档,需要到http://itextpdf.com/ 下载jar包,同时需要具有iTextAsian.jar包,它为我们提供中亚洲语言的支持。
PDF文档与昨天的Excel表格相比,它有什么特征?PDF是一种国际化标准文档,可以向文档中添加文字、表格、图片、动画、3D、脚本语言...,在实际应用中我们一般只用到文字、表格和图片。创建PDF文档只需两个操作对象:Document和PDFWriter。
下面我直接通过Java工程来说明创建PDF的过程。
package cn.itcast.cc.pdf;
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.junit.Test; import com.lowagie.text.Document; import com.lowagie.text.Element; import com.lowagie.text.Font; import com.lowagie.text.Jpeg; import com.lowagie.text.Paragraph; import com.lowagie.text.Phrase; import com.lowagie.text.pdf.BaseFont; import com.lowagie.text.pdf.ByteBuffer; import com.lowagie.text.pdf.PdfPCell; import com.lowagie.text.pdf.PdfPTable; import com.lowagie.text.pdf.PdfWriter;
public class TestPdf {
@Test public void testpdf() throws Exception { // 创建Document实例 Document doc = new Document(); // 创建书写器Writer与doc对象关联 PdfWriter.getInstance(doc, new FileOutputStream("C:/mypdf.pdf")); // ③打开文档。 // 打开文档 doc.open(); // 添加英语 doc.add(new Paragraph("Hello PDF!")); // 添加中文 BaseFont bf = BaseFont.createFont("STSong-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font font = new Font(bf,18,Font.UNDEFINED); doc.add(new Paragraph("你好PDF!", font)); // 添加表格 PdfPTable table = new PdfPTable(2); PdfPCell cell = new PdfPCell(new Phrase("性别", font)); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setColspan(2); table.addCell(cell); table.addCell(new Phrase("男", font)); table.addCell(new Phrase("女", font)); doc.add(table); // 添加图片 byte[] buf = new byte[1024]; FileInputStream fis = new FileInputStream(new File("C:/tiger.jpeg")); ByteBuffer bytebuf = new ByteBuffer(); int len = 0; while((len = fis.read(buf)) != -1){ bytebuf.append(buf, 0, len); } doc.add(new Jpeg(bytebuf.getBuffer(), 100, 100)); // 关闭文档,自动保存到文件。 doc.close(); } } |
二、创建图表
我们使用JFreeChart和Cewolf创建图表,可以创建柱状图、饼图、曲线图、甘特图等。可以用于桌面程序(Swing)和WEB应用。Cewolf是基于JFreeChart的,它使用JFreeChart的绘图引擎。Cewolf用于WEB应用,在服务器端生成图表数据发送给JSP页面,在JSP页面中使用cewolf标签即可将数据转换为图片。
在此我只编写使用JFreeChart创建饼形图和使用Cewolf创建柱形图两个示例,其他图形的创建可以参看文档。
1.JFreeChart创建饼形图
package cn.itcast.cc.jfreechart;
import java.awt.Font; import java.io.FileOutputStream; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.PiePlot; import org.jfree.data.general.DefaultPieDataset; import org.junit.Test;
public class TestJFreeChart { @Test public void test() throws Exception { // 生成PieDataset数据 DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue("日本", 10); dataset.setValue("美国", 20); dataset.setValue("中国", 70); // 创建图表 JFreeChart chart = ChartFactory.createPieChart3D("人口比例", dataset, false, false, false); // 需要设置中文字体,否则乱码。 Font font = new Font("微软雅黑", Font.PLAIN, 18); chart.getTitle().setFont(font); PiePlot plot = (PiePlot) chart.getPlot(); plot.setLabelFont(font); plot.setForegroundAlpha( 0.8f); plot.setCircular(true); // 保存图表数据到PNG图片 ChartUtilities.writeChartAsPNG(new FileOutputStream("C:/people.png"), chart, 400, 300); } } |
2.Cewolf创建柱形图
1).servlet的内容:
package cn.itcast.cc.servlet.cewolf;
import java.io.IOException; import java.util.Date; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.jfree.data.category.DefaultIntervalCategoryDataset; import de.laures.cewolf.DatasetProducer;
public class CewolfServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 生成数据 DatasetProducer categoryData = new DatasetProducer() { public Object produceDataset(Map params) {
final String[] categories = { "一季度", "二季度", "三季度", "四季度" }; final String[] seriesNames = { "研发部", "销售部", "教育部", "项目部" }; final Integer[][] startValues = new Integer[seriesNames.length][categories.length]; final Integer[][] endValues = new Integer[seriesNames.length][categories.length];
for (int series = 0; series < seriesNames.length; series++) { for (int i = 0; i < categories.length; i++) { int y = (int) (Math.random() * 10 + 1); startValues[series][i] = new Integer(y); endValues[series][i] = new Integer(y + (int) (Math.random() * 10)); } }
DefaultIntervalCategoryDataset ds = new DefaultIntervalCategoryDataset( seriesNames, categories, startValues, endValues); return ds;
}
public String getProducerId() { return "CategoryDataProducer"; }
public boolean hasExpired(Map params, Date since) { return false; }
}; // 添加到Request中 request.setAttribute("categoryData", categoryData); // 转发到test.jsp页面 request.getRequestDispatcher("testcewolf.jsp").forward(request, response);
}
}
|
2).JSP页面的内容:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="cewolf" uri="http://cewolf.sourceforge.net/taglib/cewolf.tld"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <cewolf:chart id="horizontalBarChart3D" title="年度部门薪水比率" type="horizontalBar3D" xaxislabel="季度" yaxislabel="比率"> <cewolf:data> <cewolf:producer id="categoryData" /> </cewolf:data> </cewolf:chart> <cewolf:img chartid="horizontalBarChart3D" renderer="/cewolf" width="300" height="300" /> </body> </html> |
3).WEB.xml的内容:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>cewolf</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 我们的Servlet --> <servlet> <description></description> <display-name>testcewolf</display-name> <servlet-name>testcewolf</servlet-name> <servlet-class>org.simpleit.cewolf.CewolfServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>testcewolf</servlet-name> <url-pattern>/testcewolf</url-pattern> </servlet-mapping>
<!-- cewolf的Servlet --> <servlet> <servlet-name>CewolfServlet</servlet-name> <servlet-class>de.laures.cewolf.CewolfRenderer</servlet-class> <!-- sets storage implementation --> <init-param> <param-name>storage</param-name> <param-value>de.laures.cewolf.storage.TransientSessionStorage</param-value> </init-param> <!-- sets overlib.js location relative to webapp --> <init-param> <param-name>overliburl</param-name> <param-value>/etc/overlib.js</param-value> </init-param> <!-- turn on or off debugging logging --> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
<servlet-mapping> <servlet-name>CewolfServlet</servlet-name> <url-pattern>/cewolf/*</url-pattern> </servlet-mapping>
</web-app> |
明日起就开始休年假了,为期11天。一定要安排好学习计划!