# Changelogs
### [0.4.21] - 2026.07.25
#### Added
* add `CellValue::Formula` variant to support formula cell values
* add public function `resolve_formula` for resolving `${...}` template expressions in formula strings:
- `$r` refers to the current row number (1-based)
- `$c` refers to the current column letter (e.g., column 5 → `"E"`)
- `col(N)` evaluates an expression and converts it to a column letter
- `col(sheet!header)` lookups support header-name-based column resolution via the `headercols` parameter
- arithmetic expressions with `+`, `-`, and parentheses are supported inside `${...}`
* `IntoExcelData` implementation for `CellValue` now handles the `Formula` variant — template expressions are automatically resolved and written as Excel formulas (both with and without custom format)
* add `"/"` to the list of values treated as empty (alongside `""`, `" "`, `"-"`, `"--"`, `"#N/A"`)
#### Changed
* `FromCellValue` implementations for all types now return an error for `CellValue::Formula` (formula cells are not supported for reading)
* examples now use `required-features = ["xlsxwriter"]` in `Cargo.toml` instead of `#[cfg(feature = "xlsxwriter")]` guards in source code
* `simple_batch_writer` example now demonstrates formula writing
#### Fixed
* properly set `required-features` for xlsxwriter-dependent examples in `Cargo.toml`
### [0.4.20] - 2026.07.09
#### Changed
* when `regex:` prefix is used, the entire value is treated as a single regex pattern (no pipe-splitting) to avoid conflict with regex alternation operator `|`
* internal field types changed from `Vec<Regex>` to `Option<Regex>` since only one regex is allowed per column
### [0.4.19] - 2026.07.08
#### Added
* support regex matching for `skip_until`, `skip_matched`, `catch_matched`, `read_before` and `header_check` — use `regex:` prefix in condition values to enable regex pattern matching alongside exact string matching
* add `regex` crate as a dependency
#### Changed
* `with_skip_until`, `with_skip_matched`, `with_catch_matched`, `with_read_before` and `with_header_check` now return `Result<()>` instead of `()` (regex compilation may fail)
### [0.4.18] - 2026.05.28
#### Added
* add function `with_catch_matched` for Worksheet
### [0.4.17] - 2026.05.17
#### Fixed
* Fixed issue where some xlsx files could not locate their corresponding sheet XML files correctly
### [0.4.16] - 2025.09.26
#### Added
* add function `get_header_row_with_empty_mark` for Worksheet
### [0.4.15] - 2025.09.06
#### Fixed
* unable to recognize html encoded string
### [0.4.13] - 2025.09.06
#### Added
* support to check header row
#### Fixed
* unable to recognize header row in cached sheet
### [0.4.12] - 2025.09.05
#### Added
* support to skip matched row(s) by all cell or any cell
### [0.4.10] - 2025.09.05
#### Fixed
* header row may be skiped when read xlsx file
### [0.4.9] - 2025.09.05
#### Added
* support to skip matched row(s) when read xlsx file
### [0.4.8] - 2025.08.10
#### Fixed
* Ubable to read inlineStr
#### Changed
* public use zip
### [0.4.7] - 2025.08.09
#### Fixed
* Ubable to read data if workbook.xml.rels use full path
* Improper omission of lifetime parameters
#### Changed
* public use rust_xlsxwriter
* Update dependency zip、rust_xlsxwriter to the latest version
### [0.4.2] - 2025.02.15
#### Changed
* public use chrono
### [0.4.1] - 2025.02.06
#### Changed
* the xlsxwriter feature keeps memory usage to a minimum when writing writing large files
### [0.3.5] - 2025.01.18
#### Changed
* rewrite xlsxwriter feature and allow to get raw Worksheet
### [0.3.3] - 2025.01.12
#### Changed
* update dependency zip to the latest version
### [0.3.2] - 2024.11.25
#### Added
* support to check whether the sheet is empty
### [0.3.1] - 2024.11.24
#### Fixed
* when retrieving numbers from CellValue(stored as string), comma separators will be recognized correctly.
### [0.3.0] - 2024.11.15
#### Changed
* when retrieving non String data from CellValue, return None for '', '-', '-', '#N/A'
### [0.2.3] - 2024.11.10
#### Added
* add with_capture_vals and get_captured_vals to XlsxSheet
### [0.2.2] - 2024.11.9
#### Added
* add data type Timesecond(seconds since midnight)
### [0.2.1] - 2024.11.9
#### Fixed
* unable to read data if skip_until is an empty hashmap
### [0.2.0] - 2024.11.5
#### Added
* support to read partial rows based on conditions
### [0.1.14] - 2024.6.1
#### Added
* add trait IntoCellValue and implement NaiveDate, NaiveDateTime, NaiveTime, Date32, Timestamp for it
### [0.1.13] - 2024.6.1
#### Changed
* update dependency rust_xlsxwriter to the latest version
### [0.1.12] - 2024.6.1
#### Added
* write row(s) by column name instead of position
### [0.1.11] - 2024.5.11
#### Fixed
* not full fetaures documnet
### [0.1.9] - 2024.5.5
#### Added
* add feature full and documnet full fetaures
### [0.1.8] - 2024.5.3
#### Added
* support xlsxwriter to append one row
### [0.1.7] - 2024.4.27
#### Added
* support to iter cached sheet by batches
#### Fixed
* column_range return the first and last column number
### [0.1.5] - 2024.4.26
#### Added
* support read all data into memory when sheet created(fearure `cached` should be enabled)
#### Fixed
* unable to read the size of sheet
### [0.1.4] - 2024.4.15
#### Added
* get cell value as timestamp
#### Changed
* Optimaze date&time recognition algorithm for better performance
### [0.1.3] - 2024.4.14
#### Fixed
* unable to use feature xlsxwriter
### [0.1.2] - 2024.4.13
#### Added
* get cell value as datetime and time
#### Changed
* output error message in English
### [0.1.1] - 2024.4.13
#### Added
* simple writer example
### [0.1.0] - 2023.4.13
#### Added
* first release