Skip to main content

easydoc_writer/style/
banded_rows.rs

1//! 斑马条纹策略(交替行颜色)。
2//!
3//! 对应 Java: `com.alibaba.excel.write.metadata.style.WriteCellStyle#tableStyle`
4
5use easydoc_core::style::Color;
6
7/// 为表格应用交替行背景色。
8#[derive(Debug, Clone)]
9pub struct BandedRowsStrategy {
10    /// Color for even-numbered rows (0, 2, 4…).
11    pub even_color: Color,
12    /// Color for odd-numbered rows (1, 3, 5…). `None` = transparent.
13    pub odd_color: Option<Color>,
14}
15
16impl Default for BandedRowsStrategy {
17    fn default() -> Self {
18        Self {
19            even_color: Color::rgb(242, 242, 242),
20            odd_color: None,
21        }
22    }
23}
24
25impl BandedRowsStrategy {
26    /// Creates a new banded rows strategy.
27    #[must_use]
28    pub fn new() -> Self {
29        Self::default()
30    }
31
32    /// Returns the background color for a given row index.
33    #[must_use]
34    pub fn color_for_row(&self, row_index: usize) -> Option<Color> {
35        if row_index.is_multiple_of(2) {
36            Some(self.even_color)
37        } else {
38            self.odd_color
39        }
40    }
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46
47    #[test]
48    fn default_strategy() {
49        let s = BandedRowsStrategy::default();
50        assert_eq!(s.even_color, Color::rgb(242, 242, 242));
51        assert!(s.odd_color.is_none());
52    }
53
54    #[test]
55    fn new_equals_default() {
56        let s = BandedRowsStrategy::new();
57        assert_eq!(s.even_color, BandedRowsStrategy::default().even_color);
58    }
59
60    #[test]
61    fn even_rows_use_even_color() {
62        let s = BandedRowsStrategy::new();
63        assert_eq!(s.color_for_row(0), Some(Color::rgb(242, 242, 242)));
64        assert_eq!(s.color_for_row(2), Some(Color::rgb(242, 242, 242)));
65        assert_eq!(s.color_for_row(4), Some(Color::rgb(242, 242, 242)));
66    }
67
68    #[test]
69    fn odd_rows_use_odd_color() {
70        let s = BandedRowsStrategy::new();
71        assert_eq!(s.color_for_row(1), None);
72        assert_eq!(s.color_for_row(3), None);
73    }
74
75    #[test]
76    fn custom_odd_color() {
77        let s = BandedRowsStrategy {
78            odd_color: Some(Color::WHITE),
79            ..Default::default()
80        };
81        assert_eq!(s.color_for_row(1), Some(Color::WHITE));
82    }
83}