Performance Guide"

From Documentation
Line 38: Line 38:
 
When notifying a change, remember to choose an affected range, not just those cells you modify. The following cases explain the reasons:
 
When notifying a change, remember to choose an affected range, not just those cells you modify. The following cases explain the reasons:
 
* Change a cell referenced by a formula in another cell.
 
* Change a cell referenced by a formula in another cell.
If you change a cell, all those cells that contain a formula referencing the cell should also require an update.
+
: If you change a cell, all those cells that contain a formula referencing the cell should also require an update.
 
* Insertion / deletion of cells / rows / columns.
 
* Insertion / deletion of cells / rows / columns.
If you insert a column, all columns after the inserted column also require an update.
+
: If you insert a column, all columns after the inserted column also require an update.
 +
 
  
 
If the affected cells are too distributed, you can consider notifying the whole sheet. But this might make a sheet blank for a moment because it will re-render the whole sheet.
 
If the affected cells are too distributed, you can consider notifying the whole sheet. But this might make a sheet blank for a moment because it will re-render the whole sheet.
Line 47: Line 48:
 
<source lang='java'>
 
<source lang='java'>
 
Ranges.range(ss.getSelectedSheet()).notifyChange();
 
Ranges.range(ss.getSelectedSheet()).notifyChange();
 +
</source>
 +
 +
 +
If rendering a whole sheet is too slow, you can also consider to notify the currently cached area.
 +
<source lang='java'>
 +
Spreadsheet ss;
 +
...
 +
ss.notifyLoadedAreaChange();
 
</source>
 
</source>
  

Revision as of 04:39, 4 February 2016



Refresh UI Update Manually

When calling Range setter method, zk spreadsheet will automatically check cell dependencies, update the dependent cells and refresh the spreadsheet UI of the range. However, in following cases, developers might not want such "automation" and like to control the evaluation and update by themselves:

  • Change a lot of cells in a batch.

If we don't disable auto refresh in such case, the zk spreadsheet will generate a lot of small AU response to a browser which slows down browser rendering speed.

  • initialize a book upon a data source (e.g. a database) before zk spreadsheet renders itself.

Sometimes we need to load the data from a database to initialize a sheet before zk spreadsheet renders in a browser. Disable the auto refresh can eliminate Spreadsheet's unnecessary internal calculations for rendering.

In order to manually control UI update, we have to:

  1. disable auto-refresh with setAutoRefresh(false)
  2. notify changed area with notifyChange()
	private void loadData() {
		Sheet sheet = ss.getSelectedSheet();
		for (int column  = 0 ; column < COLUMN_SIZE ; column++){
			for (int row = 0 ; row < ROW_SIZE ; row++ ){
				Range range = Ranges.range(sheet, row, column);
				range.setAutoRefresh(false);
				range.getCellData().setEditText(row+", "+column);
				CellOperationUtil.applyFontColor(range, "#0099FF");
				CellOperationUtil.applyAlignment(range, Alignment.CENTER);
			}
		}
		Ranges.range(ss.getSelectedSheet(), 0, 0, ROW_SIZE, COLUMN_SIZE).notifyChange();
                ...
	}
  • line 6: disable the auto-refresh before changing cells (calling setter)
  • line 12: notify changed range of cells


Notify Affected Range

When notifying a change, remember to choose an affected range, not just those cells you modify. The following cases explain the reasons:

  • Change a cell referenced by a formula in another cell.
If you change a cell, all those cells that contain a formula referencing the cell should also require an update.
  • Insertion / deletion of cells / rows / columns.
If you insert a column, all columns after the inserted column also require an update.


If the affected cells are too distributed, you can consider notifying the whole sheet. But this might make a sheet blank for a moment because it will re-render the whole sheet.

Notify the whole sheet

Ranges.range(ss.getSelectedSheet()).notifyChange();


If rendering a whole sheet is too slow, you can also consider to notify the currently cached area.

Spreadsheet ss;
...
ss.notifyLoadedAreaChange();

Ignore Height Calculation

since 3.8.3

If your application doesn't allow users to do any operation that needs a row height calculation e.g. enable / disable wrap text, change a font size, then you can set the attribute ignoreAutoHeight to true. This will improve client-side rendering speed much because it avoids time-consuming cell's height calculating for each row.

<!-- default is false -->
<spreadsheet  ignoreAutoHeight="true"/>




All source code listed in this book is at Github.


Last Update : 2016/02/04

Copyright © Potix Corporation. This article is licensed under GNU Free Documentation License.