1. 程式人生 > >POI中實現Excel工作薄的保護

POI中實現Excel工作薄的保護

POI只提供了sheet的保護。沒有提供工作薄的保護。

但在實現的Excel帳票輸出中,可能需要工作薄保護功能,避免使用的人手動刪除,增加sheet等。

改造POI能夠實現這個功能,但是在某些情況下資料可能會被損壞。

改造例子:

1.org/apache/poi/hssf/model/Workbook.java中追加方法。

	private ProtectRecord protectRecord = null;
    	
	private PasswordRecord password = null;
    	
	/**
	 * 設定工作薄保護。
	 * 
	 * @param protectFlag  true:保護  false:不保護
	 * @param password 密碼
	 */
	public void setProtectWorkBook(boolean protectFlag, String password) {
		// 生成ProtectRecord。
		ProtectRecord recd = getProtectRecord();
		recd.setProtect(protectFlag);

		// 設定密碼。
		if (protectFlag) {
			PasswordRecord passworRecord = getPasswordRecord();
			passworRecord.setPassword((PasswordRecord.hashPassword(password)));
		}
    }
    
	/**
	 * 生成ProtectRecord。
	 * 
	 * @return ProtectRecordオブジェクト
	 */
	public ProtectRecord getProtectRecord() {
		if (this.protectRecord == null) {
			this.protectRecord = new ProtectRecord();
			int i = 0;
			for (i = 0; i < records.size() && !(records.get(i) instanceof ProtectRecord); i++) {
			}
			records.add(i + 1, this.protectRecord);
		}
		return this.protectRecord;
	}

	/**
	 * 生成PasswordRecord。
	 * 
	 * @return PasswordRecord物件
	 */
	public PasswordRecord getPasswordRecord() {
		if (this.password == null) {
			this.password = new PasswordRecord();
			int i = 0;
			for (i = 0; i < records.size() && !(records.get(i) instanceof PasswordRecord); i++) {
			}
			records.add(i + 1, this.password);
		}
		return this.password;
	}

2.org/apache/poi/hssf/usermodel/HSSFWorkbook.java中追加呼叫介面。
    /**
     * 設定工作薄保護。
     * 
     * @param protectFlag  true:保護 false:不保護
     * @param passwaord 密碼
     */
    public void protectWorkBook(boolean protectFlag, String passwaord) {
    	this.workbook.setProtectWorkBook(protectFlag, passwaord);
    }