PageOffice產品和數據庫是兩個獨立的概念,嚴格來講二者之間沒有任何本質關係。PageOffice不依賴數據庫而存在,可是數據庫和PageOffice能夠結合使用來完成某些複雜的業務邏輯。例如:PageOffice能夠將數據庫中數據的動態填充到Word或Excel文檔中,還能夠打開數據庫中的二進制流文件,也能夠將Word或者Excel整個文檔或者文檔中的一部分數據保存到數據庫中,這裏的數據庫能夠是任意數據庫,如:Sqlite,Access,SQL Server,Oracle,MySQL,DB2,Sybase等。下面咱們就PageOffice和數據庫的結合使用展開詳細論述。web
以JAVA語言,Word文檔,Sqlite數據庫爲例:sql
PageOfficeCtrl poCtrl1 = new PageOfficeCtrl(request); poCtrl1.setServerPage(request.getContextPath()+"/poserver.zz"); // 鏈接數據庫並得到數據庫中的字段值 Class.forName("org.sqlite.JDBC"); String strUrl = "jdbc:sqlite:"+ this.getServletContext().getRealPath("demodata/demo.db"); Connection conn = DriverManager.getConnection(strUrl); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select * from user where id =1」); if (rs.next()) { String name=rs.getString(「name」); String deptNum=rs.getString(「deptNum」); } rs.close(); conn.close(); // 將獲取的數據填充到word文檔只讀的數據區域中 WordDocument doc = new WordDocument(); DataRegion dataRegion1 = doc.openDataRegion("PO_userName"); dataRegion1.setValue(name); DataRegion dataRegion2 = doc.openDataRegion("PO_deptName"); dataRegion2.setValue(deptNum); // 把WordDocument對象交給PageOfficeCtrl對象處理 poCtrl1.setWriter(doc); poCtrl1.webOpen("doc/test.doc", OpenModeType.docNormalEdit, "張三");
以JAVA語言,Word文件,Sqlite數據庫爲例:
1)打開文檔的Stream.jsp頁面:數據庫
PageOfficeCtrl poCtrl1 = new PageOfficeCtrl(request); poCtrl1.setServerPage(request.getContextPath()+"/poserver.zz"); …… poCtrl1.setSaveFilePage("SaveFile.jsp?id=1"); poCtrl1.webOpen("Openstream.jsp?id=1", OpenModeType.docNormalEdit, "張三");
2)下載文檔的Openstream.jsp頁面:數組
String id = request.getParameter("id"); Class.forName("org.sqlite.JDBC"); String strUrl = "jdbc:sqlite:" + this.getServletContext().getRealPath("demodata/DataBase.db"); Connection conn = DriverManager.getConnection(strUrl); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select * from stream where id = "+ id); if (rs.next()) { //******讀取磁盤文件,輸出文件流 開始**** byte[] imageBytes = rs.getBytes("Word"); int fileSize = imageBytes.length; response.reset(); response.setContentType("application/msword"); response.setHeader("Content-Disposition","attachment; filename=down.doc"); response.setContentLength(fileSize); OutputStream outputStream = response.getOutputStream(); outputStream.write(imageBytes); outputStream.flush(); outputStream.close(); outputStream = null; //******讀取磁盤文件,輸出文件流 結束************* } rs.close(); conn.close();
注:該示例的完整代碼和詳細演示請參考Samples或者Samples4的
2、二、打開保存數據庫中的文件(以Word爲例)app
注:不推薦把Office文件保存在數據庫字段中。這樣作的結果,一是影響數據庫檢索速度,二是增長了代碼的複雜度,若是出現文件損壞的問題不容易排查問題的緣由。jsp
以JAVA語言,Word文件爲例,保存文檔的SaveFile.jsp頁面的代碼:this
FileSaver fs=new FileSaver(request,response); // 返回控件提交的文檔二進制流字節數組 byte[] bytes=fs. getFileBytes(); // 獲取文檔的純文本內容,不帶任何附加格式。 // 若是把此文本字符串保存到數據庫字段,能夠簡單利用SQL語句輕鬆實現文檔管理中的全文檢索功能。 String fileText=fs. getDocumentText(); //鏈接數據庫,將控件返回的文檔純文本或者文檔二進制流數組保存到數據庫,此處代碼略。 …… fs.close();
以JAVA語言,Word文件爲例,保存數據的SaveData.jsp頁面spa
// 使用com.zhuozhengsoft.pageoffice.wordreader包中的WordDocument類 WordDocument doc = new WordDocument(request, response); // 獲取提交的數值 DataRegion dataUserName = doc.openDataRegion("PO_userName"); DataRegion dataDeptName = doc.openDataRegion("PO_deptName"); // 鏈接數據庫,將獲取的數據區域的數據保存到數據庫,此處代碼略。 ……. doc.close();