篩選
篩選功能允許使用者對電子表格中的資料進行篩選,以便快速查詢和分析特定資訊。它支援多種篩選條件和操作,幫助使用者更高效地處理資料。
篩選與排序學習計畫
先篩選關注的記錄,再按學習進度排序。透過記錄 ID 觀察同一筆資料的位置。
| 記錄 ID | 課程 | 學習進度 |
|---|---|---|
| 1 | Sheets | 86% |
| 2 | Docs | 100% |
| 3 | Slides | 64% |
| 4 | Bases | 92% |
| 5 | Boards | 48% |
| 6 | PDFs | 78% |
可見記錄: 6 / 6
篩選隱藏不符合條件的記錄,排序改變記錄順序。取消篩選後仍可看到全部記錄。
外掛模式
安裝
pnpm add @univerjs/sheets-filter @univerjs/sheets-filter-uinpm install @univerjs/sheets-filter @univerjs/sheets-filter-uiyarn add @univerjs/sheets-filter @univerjs/sheets-filter-uibun add @univerjs/sheets-filter @univerjs/sheets-filter-ui使用
import { LocaleType, mergeLocales, Univer } from '@univerjs/core'import { UniverSheetsFilterPlugin } from '@univerjs/sheets-filter'import { UniverSheetsFilterUIPlugin } from '@univerjs/sheets-filter-ui'import SheetsFilterUIZhTW from '@univerjs/sheets-filter-ui/locale/zh-TW'import '@univerjs/sheets-filter-ui/lib/index.css'import '@univerjs/sheets-filter/facade'const univer = new Univer({ locale: LocaleType.ZH_TW, locales: { [LocaleType.ZH_TW]: mergeLocales( SheetsFilterUIZhTW, ), },})univer.registerPlugin(UniverSheetsFilterPlugin)univer.registerPlugin(UniverSheetsFilterUIPlugin)外掛與配置
interface IUniverSheetsFilterConfig { /** * 是否在篩選面板中顯示篩選器同步開關。 * 這個配置可以在協作場景中使用,允許使用者選擇是否啟用篩選器同步。 * 如果設定為 defaultValue 物件,則會顯示篩選器同步開關,其初始狀態將由 defaultValue 屬性決定。 * @default false */ enableSyncSwitch?: boolean | { defaultValue: boolean }}行動裝置支援
先設定行動版編輯器。在本頁外掛模式的初始化程式碼中,將下列桌面版註冊替換為同一套件匯出的行動版外掛,並在開啟文件前完成。保留模型外掛、樣式、語言套件與 Facade 匯入,請勿同時註冊兩個版本。
| 套件 | 桌面版註冊 | 行動版註冊 |
|---|---|---|
@univerjs/sheets-filter-ui | UniverSheetsFilterUIPlugin | UniverSheetsFilterMobileUIPlugin |
預設模式
安裝
pnpm add @univerjs/preset-sheets-filternpm install @univerjs/preset-sheets-filteryarn add @univerjs/preset-sheets-filterbun add @univerjs/preset-sheets-filter使用
import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core'import UniverPresetSheetsCoreZhTW from '@univerjs/preset-sheets-core/locales/zh-TW'import { UniverSheetsFilterPreset } from '@univerjs/preset-sheets-filter'import UniverPresetSheetsFilterZhTW from '@univerjs/preset-sheets-filter/locales/zh-TW'import { createUniver, LocaleType, mergeLocales } from '@univerjs/presets'import '@univerjs/preset-sheets-core/lib/index.css'import '@univerjs/preset-sheets-filter/lib/index.css'const { univerAPI } = createUniver({ locale: LocaleType.ZH_TW, locales: { [LocaleType.ZH_TW]: mergeLocales( UniverPresetSheetsCoreZhTW, UniverPresetSheetsFilterZhTW, ), }, presets: [ UniverSheetsCorePreset(), UniverSheetsFilterPreset(), ],})預設與配置
interface IUniverSheetsFilterPresetConfig { /** * 是否在篩選面板中顯示篩選器同步開關。 * 這個配置可以在協作場景中使用,允許使用者選擇是否啟用篩選器同步。 * 如果設定為 defaultValue 物件,則會顯示篩選器同步開關,其初始狀態將由 defaultValue 屬性決定。 * @default false */ enableSyncSwitch?: boolean | { defaultValue: boolean }}Facade API
完整 Facade API 型別定義,請檢視 FacadeAPI。
引入
外掛模式提示
僅外掛模式需要手動引入 Facade 套件。預設模式已內建對應的 Facade 套件,無需額外引入。
import '@univerjs/sheets-filter/facade'獲取篩選器
返回一個 FFilter 物件,若 sheet 沒有篩選器,則返回 null。
FWorksheet物件上的getFilter()FRange物件上的getFilter()
const fWorkbook = univerAPI.getActiveWorkbook()// 從 FWorksheet 獲取篩選器const fWorksheet = fWorkbook.getActiveSheet()const fFilter = fWorksheet.getFilter()fFilter?.getRange().getA1Notation()// 從 FRange 獲取篩選器const fRange = fWorksheet.getRange('A1:D14')const fFilter2 = fRange.getFilter()fFilter2?.getRange().getA1Notation()建立篩選器
建立一個 FFilter 物件,若 sheet 已經有篩選器,則返回 null。
FRange物件上的createFilter()
const fWorkbook = univerAPI.getActiveWorkbook()const fWorksheet = fWorkbook.getActiveSheet()const fRange = fWorksheet.getRange('A1:D14')let fFilter = fRange.createFilter()// 如果工作表已經有篩選器,則移除它並建立一個新的篩選器。if (!fFilter) { fWorksheet.getFilter().remove() fFilter = fRange.createFilter()}fFilter.getRange().getA1Notation()移除篩選器
FFilter.remove() 方法移除篩選器。
const fWorkbook = univerAPI.getActiveWorkbook()const fWorksheet = fWorkbook.getActiveSheet()fWorksheet.getFilter()?.remove()獲取列過濾條件
FFilter.getColumnFilterCriteria(column) 方法返回指定列的篩選條件。
const fWorkbook = univerAPI.getActiveWorkbook()const fWorksheet = fWorkbook.getActiveSheet()// 設定 C1:F10 範圍的值const fRange = fWorksheet.getRange('C1:F10')fRange.setValues([ [1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7], [5, 6, 7, 8], [6, 7, 8, 9], [7, 8, 9, 10], [8, 9, 10, 11], [9, 10, 11, 12], [10, 11, 12, 13],])// 建立 C1:F10 範圍的篩選器let fFilter = fRange.createFilter()// 如果篩選器已經存在,則移除它並建立一個新的篩選器if (!fFilter) { fRange.getFilter().remove() fFilter = fRange.createFilter()}// 設定 C 列的篩選條件,篩選出值不是 1、5、9 的行const column = fWorksheet.getRange('C:C').getColumn()fFilter.setColumnFilterCriteria(column, { colId: 0, filters: { filters: ['1', '5', '9'], },})// 獲取 C 和 D 列的篩選條件fFilter.getColumnFilterCriteria(column) // { colId: 0, filters: { filters: ['1', '5', '9'] } }fFilter.getColumnFilterCriteria(column + 1) // undefined設定列篩選條件
FFilter.setColumnFilterCriteria(column, criteria) 方法設定指定列的篩選條件。
const fWorkbook = univerAPI.getActiveWorkbook()const fWorksheet = fWorkbook.getActiveSheet()// 設定 C1:F10 範圍的值const fRange = fWorksheet.getRange('C1:F10')fRange.setValues([ [1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7], [5, 6, 7, 8], [6, 7, 8, 9], [7, 8, 9, 10], [8, 9, 10, 11], [9, 10, 11, 12], [10, 11, 12, 13],])// 建立 C1:F10 範圍的篩選器let fFilter = fRange.createFilter()// 如果篩選器已經存在,則移除它並建立一個新的篩選器if (!fFilter) { fRange.getFilter().remove() fFilter = fRange.createFilter()}// 設定 C 列的篩選條件,篩選出值不是 1、5、9 的行const column = fWorksheet.getRange('C:C').getColumn()fFilter.setColumnFilterCriteria(column, { colId: 0, filters: { filters: ['1', '5', '9'], },})移除列篩選條件
FFilter.removeColumnFilterCriteria(column)方法移除指定列的篩選條件。FFilter.removeFilterCriteria()方法移除所有列的篩選條件。
const fWorkbook = univerAPI.getActiveWorkbook()const fWorksheet = fWorkbook.getActiveSheet()// 設定 C1:F10 範圍的值const fRange = fWorksheet.getRange('C1:F10')fRange.setValues([ [1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7], [5, 6, 7, 8], [6, 7, 8, 9], [7, 8, 9, 10], [8, 9, 10, 11], [9, 10, 11, 12], [10, 11, 12, 13],])// 建立 C1:F10 範圍的篩選器let fFilter = fRange.createFilter()// 如果篩選器已經存在,則移除它並建立一個新的篩選器if (!fFilter) { fRange.getFilter().remove() fFilter = fRange.createFilter()}// 設定 C 列的篩選條件,篩選出值不是 1、5、9 的行const column = fWorksheet.getRange('C:C').getColumn()fFilter.setColumnFilterCriteria(column, { colId: 0, filters: { filters: ['1', '5', '9'], },})// 3 秒後清除 C 列的篩選條件setTimeout(() => { fFilter.removeColumnFilterCriteria(column) // 或者使用 fFilter.removeFilterCriteria() 移除所有列的篩選條件}, 3000)獲取過濾掉的行
FFilter.getFilteredOutRows() 方法返回一個陣列,包含被篩選掉的行的索引。
const fWorkbook = univerAPI.getActiveWorkbook()const fWorksheet = fWorkbook.getActiveSheet()// 設定一些 C1:F10 範圍的值const fRange = fWorksheet.getRange('C1:F10')fRange.setValues([ [1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7], [5, 6, 7, 8], [6, 7, 8, 9], [7, 8, 9, 10], [8, 9, 10, 11], [9, 10, 11, 12], [10, 11, 12, 13],])// 建立 C1:F10 範圍的篩選器let fFilter = fRange.createFilter()// 如果篩選器已經存在,則移除它並建立一個新的篩選器if (!fFilter) { fRange.getFilter().remove() fFilter = fRange.createFilter()}// 設定 C 列的篩選條件,篩選出值不是 1、5、9 的行const column = fWorksheet.getRange('C:C').getColumn()fFilter.setColumnFilterCriteria(column, { colId: 0, filters: { filters: ['1', '5', '9'], },})// 列印被篩選掉的行fFilter.getFilteredOutRows() // [1, 2, 3, 5, 6, 7, 9]事件監聽
完整事件型別定義,請檢視 Events。
SheetRangeFiltered 事件在列過濾條件發生改變時觸發。
const disposable = univerAPI.addEvent(univerAPI.Event.SheetRangeFiltered, (params) => { const { workbook, worksheet, col, criteria } = params})// 移除事件監聽器,使用 `disposable.dispose()`SheetBeforeRangeFilter 事件在列過濾條件發生改變前觸發。
const disposable = univerAPI.addEvent(univerAPI.Event.SheetBeforeRangeFilter, (params) => { const { workbook, worksheet, col, criteria } = params // 取消篩選條件更改操作 params.cancel = true})// 移除事件監聽器,使用 `disposable.dispose()`SheetRangeFilterCleared 事件在清除篩選條件時觸發。
const disposable = univerAPI.addEvent(univerAPI.Event.SheetRangeFilterCleared, (params) => { const { workbook, worksheet } = params})// 移除事件監聽器,使用 `disposable.dispose()`SheetBeforeRangeFilterClear 事件在清除篩選條件前觸發。
const disposable = univerAPI.addEvent(univerAPI.Event.SheetBeforeRangeFilterClear, (params) => { const { workbook, worksheet } = params // 取消清除篩選條件操作 params.cancel = true})// 移除事件監聽器,使用 `disposable.dispose()`你覺得這篇文檔如何?