### 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 文件,减少出错机会,提高开发效率。