office-rs 0.1.1

A Rust library for reading and writing XML Office files
Documentation
### 1. 统一的构建器模式


```rust
// XLSX 构建器实现统一接口
pub struct XlsxBuilder {
    document: Document,
}

impl DocumentBuilder<Document> for XlsxBuilder {
    fn new() -> Self {
        Self { document: Document::new() }
    }
    
    fn save<P: AsRef<Path>>(self, path: P) -> Result<()> {
        self.document.save_as_xlsx(path)
    }
    
    fn build(self) -> Result<Document> {
        Ok(self.document)
    }
}

// 简化的样式创建
impl XlsxBuilder {
    pub fn worksheet<F>(mut self, name: &str, builder: F) -> Self
    where F: FnOnce(WorksheetBuilder) -> WorksheetBuilder
    {
        let sheet = builder(WorksheetBuilder::new(name)).build();
        self.document.add_worksheet(sheet);
        self
    }
}

// 预定义样式集合
pub struct Styles;

impl Styles {
    pub fn title() -> Style {
        Style::new()
            .font("Arial", 16.0)
            .bold()
            .color(Color::BLUE)
            .align_center()
    }
    
    pub fn header() -> Style {
        Style::new()
            .font("Arial", 12.0)
            .bold()
            .background(Color::LIGHT_GRAY)
    }
    
    pub fn number() -> Style {
        Style::new()
            .number_format("#,##0.00")
    }
}
```

### 2. 简化的工作表构建


```rust
// 工作表构建器
pub struct WorksheetBuilder {
    worksheet: Worksheet,
}

impl WorksheetBuilder {
    pub fn new(name: &str) -> Self {
        Self { worksheet: Worksheet::new(name) }
    }
    
    // 设置单元格值和样式
    pub fn cell(mut self, reference: &str, value: impl Into<CellValue>) -> CellBuilder {
        CellBuilder::new(&mut self.worksheet, reference, value.into())
    }
    
    // 设置区域数据
    pub fn range<T>(mut self, reference: &str, data: T) -> RangeBuilder
    where T: Into<RangeData>
    {
        RangeBuilder::new(&mut self.worksheet, reference, data.into())
    }
    
    // 设置行数据
    pub fn row(mut self, index: u32, data: &[impl Into<CellValue> + Clone]) -> Self {
        for (col, value) in data.iter().enumerate() {
            let cell_ref = format!("{}{}", column_letter(col), index);
            self.worksheet.set_cell(&cell_ref, value.clone().into());
        }
        self
    }
    
    pub fn build(self) -> Worksheet {
        self.worksheet
    }
}

// 单元格构建器
pub struct CellBuilder<'a> {
    worksheet: &'a mut Worksheet,
    reference: String,
    value: CellValue,
}

impl<'a> CellBuilder<'a> {
    pub fn style(self, style: Style) -> WorksheetBuilder {
        self.worksheet.set_cell_style(&self.reference, style);
        WorksheetBuilder { worksheet: std::mem::take(self.worksheet) }
    }
    
    pub fn merge_to(self, end_ref: &str) -> WorksheetBuilder {
        let range = format!("{}:{}", self.reference, end_ref);
        self.worksheet.merge_range(&range);
        WorksheetBuilder { worksheet: std::mem::take(self.worksheet) }
    }
}
```

### 4. 样式管理优化


```rust
// 预定义样式集合
pub struct StyleSet {
    title: Style,
    header: Style,
    number: Style,
    highlight: Style,
}

impl StyleSet {
    pub fn new() -> Self {
        StyleSet {
            title: Style::new().preset_title(),
            header: Style::new().preset_header(),
            number: Style::new().preset_number(),
            highlight: Style::new().preset_highlight(),
        }
    }
}
```

### 5. 错误处理改进


```rust
pub type Result<T> = std::result::Result<T, XlsxError>;

#[derive(Debug, thiserror::Error)]

pub enum XlsxError {
    #[error("单元格引用无效: {0}")]
    InvalidCellReference(String),
    #[error("样式错误: {0}")]
    StyleError(String),
    #[error("IO错误: {0}")]
    IoError(#[from] std::io::Error),
}
```

### 3. 统一的使用示例


```rust
// 简洁的Excel文档创建
fn create_sales_report() -> Result<()> {
    XlsxBuilder::new()
        .worksheet("销售报表", |sheet| sheet
            // 标题行 - 合并单元格
            .cell("A1", "2024年第一季度销售报表")
                .style(Styles::title())
                .merge_to("E1")
            
            // 表头行
            .row(2, &["产品", "单价", "数量", "销售额", "利润率"])
            
            // 数据行
            .row(3, &["产品A", 99.99, 150, "=B3*C3", "15%"])
            .row(4, &["产品B", 199.99, 80, "=B4*C4", "20%"])
            .row(5, &["产品C", 299.99, 45, "=B5*C5", "25%"])
            
            // 汇总行
            .cell("A6", "总计").style(Styles::header())
            .cell("D6", "=SUM(D3:D5)").style(Styles::number())
        )
        .save("sales_report.xlsx")
}

// 更复杂的示例 - 多工作表
fn create_complex_workbook() -> Result<()> {
    XlsxBuilder::new()
        .worksheet("销售数据", |sheet| sheet
            .row(1, &["月份", "销售额", "成本", "利润"])
            .row(2, &["1月", 10000, 6000, "=B2-C2"])
            .row(3, &["2月", 12000, 7000, "=B3-C3"])
        )
        .worksheet("图表分析", |sheet| sheet
            .cell("A1", "销售趋势分析")
                .style(Styles::title())
            .cell("A3", "数据来源: 销售数据工作表")
        )
        .save("complex_report.xlsx")
}
```

### 主要改进点:


1. **更直观的构建器模式**:使用链式调用使代码更易读和维护

2. **简化的单元格操作**:减少重复代码,提供更简洁的 API

3. **区域操作**:支持批量设置数据和样式

4. **智能类型转换**:自动处理不同类型的值转换

5. **预定义样式集**:常用样式可以预定义并复用

6. **统一的错误处理**:使用 thiserror 提供更好的错误处理体验

7. **强类型约束**:利用 Rust 的类型系统提供编译时检查

这套 API 设计注重:

- 易用性:减少样板代码
- 类型安全:充分利用 Rust 的类型系统
- 性能:批量操作支持
- 可维护性:清晰的模块化结构
- 错误处理:优雅的错误传播

通过这样的 API 设计,用户可以更直观地操作 Excel 文件,减少出错机会,提高开发效率。