PageOffice與數據庫的關係

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

3.1

注:不推薦把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();
相關文章
相關標籤/搜索