Skip to main content

umya_spreadsheet/
lib.rs

1//! # umya-spreadsheet
2//!
3//! A pure `rust` library for reading and writing Microsoft Excel (xlsx) files.
4//!
5//! ## Example
6//!
7//! ![Result Image](https://github.com/MathNya/umya-spreadsheet/raw/master/images/sample1.png)
8//!
9//! ### Reader or New File
10//!
11//! ```rust
12//! use umya_spreadsheet::*;
13//!
14//! // Reader
15//! let path = std::path::Path::new("./tests/test_files/aaa.xlsx");
16//! let mut book = reader::xlsx::read(path).unwrap();
17//!
18//! // Lazy Reader
19//! // Delays loading of worksheets until they are needed.
20//! // Can improve performance when loading large files.
21//! let path = std::path::Path::new("./tests/test_files/aaa.xlsx");
22//! let mut book = reader::xlsx::lazy_read(path).unwrap();
23//!
24//! // New file
25//! let mut book = new_file();
26//! ```
27//!
28//! ### New Worksheet
29//!
30//! ```rust
31//! use umya_spreadsheet::*;
32//!
33//! let mut book = new_file();
34//!
35//! // New worksheet
36//! let _ = book.new_sheet("Sheet2");
37//! ```
38//!
39//! ### Copy Worksheet
40//!
41//! ```rust
42//! use umya_spreadsheet::*;
43//!
44//! let mut book = new_file();
45//!
46//! let mut clone_sheet = book.sheet(0).unwrap().clone();
47//! clone_sheet.set_name("New Sheet");
48//! let _ = book.add_sheet(clone_sheet);
49//! ```
50//!
51//! ### Change Value
52//!
53//! ```rust
54//! use umya_spreadsheet::*;
55//!
56//! let mut book = new_file();
57//! let _unused = book.new_sheet("Sheet2");
58//!
59//! // Change value using string cell address
60//! book.sheet_by_name_mut("Sheet2")
61//!     .unwrap()
62//!     .cell_mut("A1")
63//!     .set_value("TEST1");
64//! book.sheet_by_name_mut("Sheet2")
65//!     .unwrap()
66//!     .cell_mut("B2")
67//!     .set_value_number(1);
68//! book.sheet_by_name_mut("Sheet2")
69//!     .unwrap()
70//!     .cell_mut("C3")
71//!     .set_value_bool(true);
72//!
73//! // Change value using tuple cell address
74//! book.sheet_mut(1)
75//!     .unwrap()
76//!     .cell_mut((1, 1))
77//!     .set_value("TEST1");
78//! book.sheet_mut(1)
79//!     .unwrap()
80//!     .cell_mut((2, 2))
81//!     .set_value_number(1);
82//! book.sheet_mut(1)
83//!     .unwrap()
84//!     .cell_mut((3, 3))
85//!     .set_value_bool(true);
86//! ```
87//!
88//! ### Read Value
89//!
90//! ```rust
91//! use umya_spreadsheet::*;
92//!
93//! let mut book = new_file();
94//! let _unused = book.new_sheet("Sheet2");
95//! book.sheet_by_name_mut("Sheet2")
96//!     .unwrap()
97//!     .cell_mut("A1")
98//!     .set_value("TEST1");
99//!
100//! // Read value by string cell address
101//! let a1_value = book.sheet_by_name("Sheet2").unwrap().value("A1");
102//!
103//! // Read value by tuple cell address
104//! let a1_value = book.sheet(1).unwrap().value((1, 1));
105//!
106//! // Read formatted value by string cell address
107//! let a1_value = book.sheet(1).unwrap().formatted_value("A1");
108//!
109//! assert_eq!("TEST1", a1_value);
110//! ```
111//!
112//! ### Change Style
113//!
114//! More examples can be found in the [Style](crate::structs::style) module.
115//!
116//! ```rust
117//! use umya_spreadsheet::*;
118//!
119//! let mut book = new_file();
120//! let _unused = book.new_sheet("Sheet2");
121//!
122//! // Add a bottom border using string cell address
123//! book.sheet_by_name_mut("Sheet2")
124//!     .unwrap()
125//!     .style_mut("A1")
126//!     .borders_mut()
127//!     .bottom_mut()
128//!     .set_border_style(Border::BORDER_MEDIUM);
129//!
130//! // Add a bottom border using tuple cell address
131//! book.sheet_mut(1)
132//!     .unwrap()
133//!     .style_mut((1, 1))
134//!     .borders_mut()
135//!     .bottom_mut()
136//!     .set_border_style(Border::BORDER_MEDIUM);
137//! ```
138//!
139//! ### Insert or Remove Rows/Columns
140//!
141//! ![Result Image](https://github.com/MathNya/umya-spreadsheet/raw/master/images/sample2.png)
142//!
143//! ```rust
144//! use umya_spreadsheet::*;
145//!
146//! let mut book = new_file();
147//!
148//! // Insert rows
149//! book.insert_new_row("Sheet1", 2, 3);
150//!
151//! // Insert columns by column name
152//! book.insert_new_column("Sheet1", "B", 3);
153//!
154//! // Insert columns by index
155//! book.insert_new_column_by_index("Sheet1", 2, 3);
156//!
157//! // Remove rows
158//! book.remove_row("Sheet1", 6, 2);
159//!
160//! // Remove columns by column name
161//! book.remove_column("Sheet1", "F", 2);
162//!
163//! // Remove columns by index
164//! book.remove_column_by_index("Sheet1", 6, 2);
165//! ```
166//!
167//! ### Writer
168//!
169//! ```rust
170//! use umya_spreadsheet::*;
171//!
172//! let mut book = new_file();
173//! let _unused = book.new_sheet("Sheet2");
174//!
175//! // Write to a file
176//! let path = std::path::Path::new("C:/spread_test_data/ccc.xlsx");
177//! let _unused = writer::xlsx::write(&book, path);
178//! ```
179
180#![deny(
181    explicit_outlives_requirements,
182    let_underscore_drop,
183    meta_variable_misuse,
184    non_ascii_idents,
185    non_local_definitions,
186    redundant_imports,
187    redundant_lifetimes,
188    single_use_lifetimes,
189    trivial_casts,
190    trivial_numeric_casts,
191    unit_bindings,
192    unsafe_code,
193    unused_import_braces,
194    unused_lifetimes,
195    unused_macro_rules,
196    unused_qualifications,
197    variant_size_differences
198)]
199#![allow(dead_code, unused_macros)]
200#![deny(clippy::correctness, clippy::trivially_copy_pass_by_ref)]
201#![warn(
202    clippy::style,
203    clippy::complexity,
204    clippy::perf,
205    clippy::pedantic,
206    clippy::cargo,
207    clippy::suspicious
208)]
209#![allow(
210    clippy::missing_errors_doc,
211    clippy::missing_panics_doc,
212    clippy::module_name_repetitions,
213    clippy::similar_names,
214    clippy::too_many_lines,
215    clippy::struct_field_names,
216    clippy::collapsible_match
217)]
218
219extern crate chrono;
220extern crate fancy_regex;
221extern crate imagesize;
222extern crate md5;
223extern crate quick_xml;
224extern crate thousands;
225extern crate zip;
226
227extern crate aes;
228extern crate base64;
229extern crate byteorder;
230extern crate cbc;
231extern crate cfb;
232extern crate hmac;
233extern crate html_parser;
234extern crate rand;
235extern crate sha2;
236
237pub mod helper;
238pub mod reader;
239pub mod structs;
240pub mod traits;
241mod version;
242pub mod writer;
243
244#[allow(unused_imports)]
245pub use version::*;
246
247pub use self::structs::*;
248
249/// Creates a new workbook with default settings.
250///
251/// Returns a new `Workbook` instance initialized with:
252/// - Default theme
253/// - Default stylesheet
254/// - One worksheet named "Sheet1"
255/// - Active cell set to "A1"
256/// - Sheet view configured with workbook view ID 0
257///
258/// # Panics
259///
260/// Panics if unable to create a new worksheet named "Sheet1". This should never
261/// happen with default settings since it's the first worksheet in a new
262/// spreadsheet.
263#[must_use]
264pub fn new_file() -> Workbook {
265    let mut wb = Workbook::default();
266    wb.set_theme(drawing::Theme::default_value());
267    wb.set_stylesheet_default_value();
268    let worksheet = wb.new_sheet("Sheet1").unwrap();
269    worksheet.set_active_cell("A1");
270    let mut sheet_view = SheetView::default();
271    sheet_view.set_workbook_view_id(0);
272    let mut sheet_views = SheetViews::default();
273    sheet_views.add_sheet_view_list_mut(sheet_view);
274    worksheet.set_sheets_views(sheet_views);
275    wb.set_active_sheet(0);
276    wb
277}
278
279/// Creates a new empty workbook without any worksheets.
280///
281/// This function initializes a new workbook with default theme and
282/// stylesheet settings. At least one worksheet must be added before generating
283/// a valid file.
284///
285/// # Returns
286/// A new `Workbook` instance with default configuration but no worksheets.
287///
288/// # Examples
289/// ```
290/// let mut book = umya_spreadsheet::new_file_empty_worksheet();
291/// ```
292#[must_use]
293pub fn new_file_empty_worksheet() -> Workbook {
294    let mut wb = Workbook::default();
295    wb.set_theme(drawing::Theme::default_value());
296    wb.set_stylesheet_default_value();
297    wb
298}