今日教育辦公系統結束。新內容有:導出數據到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天。一定要安排好學習計劃!