Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
00331594 committed Apr 7, 2024
2 parents eef78e0 + 7a87708 commit 0568104
Show file tree
Hide file tree
Showing 24 changed files with 272 additions and 21 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ homepage = "https://github.com/MortalreminderPT/edit-xlsx"
repository = "https://github.com/MortalreminderPT/edit-xlsx"
keywords = ["excel", "xlsx", "writer", "editor"]
readme = "README.md"
version = "0.3.5"
version = "0.3.6"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
Expand Down
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ fn main() -> WorkbookResult<()> {
// Change the font style
let bold = red.set_bold();
worksheet.write_with_format("D1", "red bold text", &bold)?;
// Change font
let font = Format::default().set_font("华文行楷");
worksheet.write_with_format("E1", "你好", &font)?;
// adjust the text align
let left_top = Format::default().set_align(FormatAlignType::Left).set_align(FormatAlignType::Top);
worksheet.write_with_format("A2", "left top", &left_top)?;
Expand Down
8 changes: 8 additions & 0 deletions examples/comments.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
use edit_xlsx::{Workbook, WorkbookResult};

fn main() -> WorkbookResult<()> {
let mut workbook = Workbook::from_path("examples/comments_test.xlsx")?;
let worksheet = workbook.get_worksheet(1)?;
workbook.save_as("examples/comments_test_saved.xlsx")?;
Ok(())
}
13 changes: 0 additions & 13 deletions examples/demo.rs

This file was deleted.

3 changes: 3 additions & 0 deletions examples/hello_world.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ fn main() -> WorkbookResult<()> {
// Change the font style
let bold = red.set_bold();
worksheet.write_with_format("D1", "red bold text", &bold)?;
// Change font
let font = Format::default().set_font("华文行楷");
worksheet.write_with_format("E1", "你好", &font)?;
// adjust the text align
let left_top = Format::default().set_align(FormatAlignType::Left).set_align(FormatAlignType::Top);
worksheet.write_with_format("A2", "left top", &left_top)?;
Expand Down
Binary file modified resources/new.xlsx
Binary file not shown.
5 changes: 5 additions & 0 deletions src/api/format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,11 @@ impl<'a> Format<'a> {
self
}

pub fn set_font(mut self, font_name: &'a str) -> Self {
self.font.name = font_name;
self
}

pub fn set_border<'b: 'a>(mut self, format_border_type: FormatBorderType) -> Self {
let mut format_border = FormatBorderElement::default();
format_border.border_type = format_border_type;
Expand Down
2 changes: 2 additions & 0 deletions src/api/format/font.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ pub struct FormatFont<'a> {
pub(crate) underline: bool,
pub(crate) size: f64,
pub(crate) color: FormatColor<'a>,
pub(crate) name: &'a str,
}

impl Default for FormatFont<'_> {
Expand All @@ -16,6 +17,7 @@ impl Default for FormatFont<'_> {
underline: false,
size: 11.0,
color: Default::default(),
name: "Calibri",
}
}
}
10 changes: 10 additions & 0 deletions src/api/worksheet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ use crate::api::worksheet::write::Write;
use crate::file::XlsxFileType;
use crate::result::WorkSheetResult;
use crate::xml::drawings::Drawings;
use crate::xml::drawings::vml_drawing::VmlDrawing;
use crate::xml::metadata::Metadata;
use crate::xml::relationships::Relationships;
use crate::xml::worksheet::WorkSheet as XmlWorkSheet;
Expand All @@ -37,6 +38,7 @@ pub struct WorkSheet {
style_sheet: Rc<RefCell<StyleSheet>>,
content_types: Rc<RefCell<xml::content_types::ContentTypes>>,
medias: Rc<RefCell<xml::medias::Medias>>,
vml_drawing: Option<VmlDrawing>,
drawings: Option<Drawings>,
drawings_rel: Option<Relationships>,
metadata: Rc<RefCell<Metadata>>,
Expand All @@ -59,6 +61,9 @@ impl WorkSheet {
self.drawings.as_ref().unwrap().save(&file_path, self.id);
self.drawings_rel.as_ref().unwrap().save(&file_path, XlsxFileType::DrawingRels(self.id));
}
if let Some(id) = self.worksheet_rel.get_vml_drawing_rid() {
self.vml_drawing.as_ref().unwrap().save(&file_path, id);
}
Ok(())
}
}
Expand Down Expand Up @@ -260,6 +265,10 @@ impl WorkSheet {
Some(drawings_id) => (Drawings::from_path(&tmp_path, drawings_id).ok(), Relationships::from_path(&tmp_path, XlsxFileType::DrawingRels(drawings_id)).ok()),
None => (None, None)
};
let vml_drawing = match worksheet_rel.get_vml_drawing_rid() {
Some(vml_drawing_id) => VmlDrawing::from_path(&tmp_path, vml_drawing_id).ok(),
None => None
};
WorkSheet {
id: sheet_id,
name: String::from(name),
Expand All @@ -272,6 +281,7 @@ impl WorkSheet {
style_sheet,
content_types,
medias,
vml_drawing,
drawings,
drawings_rel,
metadata,
Expand Down
12 changes: 9 additions & 3 deletions src/file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ pub enum XlsxFileType {
Medias(String),
Drawings(u32),
DrawingRels(u32),
VmlDrawings(u32),
Comments(u32),
MetaData,
CoreProperties,
AppProperties,
Expand Down Expand Up @@ -89,14 +91,16 @@ impl XlsxFileWriter {
impl XlsxFileType {
fn get_dir(&self) -> &str {
match self {
XlsxFileType::WorkbookFile | XlsxFileType::SharedStringFile | XlsxFileType::StylesFile | XlsxFileType::MetaData => "./xl",
// XlsxFileType::SheetFile(_) => "./xl/worksheets",
XlsxFileType::WorkbookFile | XlsxFileType::SharedStringFile
| XlsxFileType::StylesFile | XlsxFileType::MetaData
| XlsxFileType::Comments(_) => "./xl",

XlsxFileType::SheetFile(_) => "./xl",
XlsxFileType::WorkbookRels => "./xl/_rels",
XlsxFileType::WorksheetRels(_) => "./xl/worksheets/_rels",
XlsxFileType::ContentTypes => ".",
XlsxFileType::Medias(_) => "./xl/media",
XlsxFileType::Drawings(_) => "./xl/drawings",
XlsxFileType::Drawings(_) | XlsxFileType::VmlDrawings(_) => "./xl/drawings",
XlsxFileType::DrawingRels(_) => "./xl/drawings/_rels",
XlsxFileType::CoreProperties | XlsxFileType::AppProperties => "./docProps",
}
Expand All @@ -113,10 +117,12 @@ impl XlsxFileType {
XlsxFileType::ContentTypes => "[Content_Types].xml".to_string(),
XlsxFileType::Medias(name) => format!("{name}"),
XlsxFileType::Drawings(id) => format!("drawing{id}.xml"),
XlsxFileType::VmlDrawings(id) => format!("vmlDrawing{id}.vml"),
XlsxFileType::DrawingRels(id) => format!("drawing{id}.xml.rels"),
XlsxFileType::MetaData => "metadata.xml".to_string(),
XlsxFileType::CoreProperties => "core.xml".to_string(),
XlsxFileType::AppProperties => "app.xml".to_string(),
XlsxFileType::Comments(id) => format!("comments{id}.xml"),
}
}
pub(crate) fn get_path<P: AsRef<Path>>(&self, base_path: P) -> PathBuf {
Expand Down
1 change: 1 addition & 0 deletions src/xml.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ pub(crate) mod metadata;
pub(crate) mod extension;
pub(crate) mod core_properties;
pub(crate) mod app_properties;
mod namespaces;
2 changes: 2 additions & 0 deletions src/xml/drawings.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
pub(crate) mod vml_drawing;

use std::io;
use std::path::Path;
use quick_xml::{de, se};
Expand Down
40 changes: 40 additions & 0 deletions src/xml/drawings/vml_drawing.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
use std::io;
use std::path::Path;
use quick_xml::{de, se};
use serde::{Deserialize, Serialize};
use crate::file::{XlsxFileReader, XlsxFileType, XlsxFileWriter};
use crate::xml::namespaces::office as o;
use crate::xml::namespaces::vml as v;

#[derive(Debug, Deserialize, Serialize)]
pub(crate) struct VmlDrawing {
#[serde(rename(serialize = "@xmlns:v", deserialize = "@xmlns:v"))]
xmlns_v: String,
#[serde(rename(serialize = "@xmlns:o", deserialize = "@xmlns:o"))]
xmlns_o: String,
#[serde(rename(serialize = "@xmlns:x", deserialize = "@xmlns:x"))]
xmlns_x: String,
#[serde(rename(serialize = "o:shapelayout", deserialize = "shapelayout"))]
shapelayout: o::ShapeLayout,
#[serde(rename(serialize = "v:shapetype", deserialize = "shapetype"))]
shapetype: v::ShapeType,
#[serde(rename(serialize = "v:shape", deserialize = "shape"))]
shape: v::Shape,
}

impl VmlDrawing {
pub(crate) fn from_path<P: AsRef<Path>>(file_path: P, drawing_id: u32) -> io::Result<VmlDrawing> {
let mut file = XlsxFileReader::from_path(file_path, XlsxFileType::VmlDrawings(drawing_id))?;
let mut xml = String::new();
file.read_to_string(&mut xml).unwrap();
let drawing: VmlDrawing = de::from_str(&xml).unwrap();
Ok(drawing)
}

pub(crate) fn save<P: AsRef<Path>>(&self, file_path: P, drawing_id: u32) {
let xml = se::to_string_with_root("xml", &self).unwrap();
// let xml = format!("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n{}", xml);
let mut file = XlsxFileWriter::from_path(file_path, XlsxFileType::VmlDrawings(drawing_id)).unwrap();
file.write_all(xml.as_ref()).unwrap();
}
}
4 changes: 4 additions & 0 deletions src/xml/namespaces.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
pub(crate) mod excel;
pub(crate) mod vml;
pub(crate) mod office;
mod xdr;
51 changes: 51 additions & 0 deletions src/xml/namespaces/excel.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
use serde::{Deserialize, Serialize};

///
/// xmlns:x="urn:schemas-microsoft-com:office:excel"
///

#[derive(Debug, Deserialize, Serialize)]
#[serde(rename(serialize = "x:ClientData", deserialize = "ClientData"))]
pub(crate) struct ClientData {
#[serde(rename(serialize = "@ObjectType", deserialize = "@ObjectType"))]
object_type: String,
#[serde(rename(serialize = "x:MoveWithCells", deserialize = "MoveWithCells"))]
move_with_cells: MoveWithCells,
#[serde(rename(serialize = "x:SizeWithCells", deserialize = "SizeWithCells"))]
size_with_cells: SizeWithCells,
#[serde(rename(serialize = "x:Anchor", deserialize = "Anchor"))]
anchor: Anchor,
#[serde(rename(serialize = "x:Row", deserialize = "Row"))]
row: Row,
#[serde(rename(serialize = "x:Column", deserialize = "Column"))]
column: Column,
}

#[derive(Debug, Deserialize, Serialize)]
struct MoveWithCells {}

#[derive(Debug, Deserialize, Serialize)]
struct SizeWithCells {
}

#[derive(Debug, Deserialize, Serialize)]
struct Anchor {
#[serde(rename = "$value")]
value: String,// Vec<u32>,
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(rename(serialize = "x:AutoFill", deserialize = "AutoFill"))]
struct AutoFill {
#[serde(rename = "$value")]
value: bool,
}
#[derive(Debug, Deserialize, Serialize)]
struct Row {
#[serde(rename = "$value")]
value: u32,
}
#[derive(Debug, Deserialize, Serialize)]
struct Column {
#[serde(rename = "$value")]
value: u32,
}
19 changes: 19 additions & 0 deletions src/xml/namespaces/office.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
use serde::{Deserialize, Serialize};

#[derive(Debug, Deserialize, Serialize)]
// #[serde(rename(serialize = "o:shapelayout", deserialize = "shapelayout"))]
pub(crate) struct ShapeLayout {
#[serde(rename(serialize = "@v:ext", deserialize = "@ext"))]
v_ext: String,
#[serde(rename(serialize = "o:idmap", deserialize = "idmap"))]
id_map: IdMap,
}

#[derive(Debug, Deserialize, Serialize)]
// #[serde(rename(serialize = "o:idmap", deserialize = "idmap"))]
struct IdMap {
#[serde(rename(serialize = "@v:ext", deserialize = "@ext"))]
v_ext: String,
#[serde(rename = "@data")]
data: u32,
}
Loading

0 comments on commit 0568104

Please sign in to comment.