use std::time::Instant;
use umya_spreadsheet::Worksheet;
use xlsx_group_write::prelude::*;
#[derive(XlsxGroupWriteQuicker)]
#[xlsx_group_write(
line_writer_simple = "line_index-1:number,&self.name,&self.tel,&self.dep",
group_maker = "&self.dep",
template_simple = "序号,姓名,手机,部门",
output_file_name_simple = "/tmp/test"
)]
struct MySimpleData {
pub name: String,
pub tel: String,
pub dep: String,
}
impl MySimpleData {
pub fn new(name: &str, tel: &str, dep: &str) -> Self {
Self {
name: name.into(),
tel: tel.into(),
dep: dep.into(),
}
}
}
#[test]
fn test_simple() {
let data = vec![
MySimpleData::new("张三", "185xxxx2228", "网金部"),
MySimpleData::new("李四", "185xxxx2229", "运管部"),
MySimpleData::new("王二", "185xxxx2230", "网金部"),
];
let resp = MySimpleData::write2xlsx_all(&data);
println!("resp:{resp:#?}");
}
#[derive(XlsxGroupWriteQuicker)]
#[xlsx_group_write(
line_writer_simple = "line_index-1:number,&self.name,&self.tel,&self.dep",
group_maker = "&self.dep",
template_advance = "/home/feiy/Desktop/temp.xlsx,4",
custom_info_adder = "Self::add_custom_info",
output_file_name_simple = "/tmp/test",
output_file_name_add_date = "true"
)]
struct MySimpleDataWithTemplate {
pub name: String,
pub tel: String,
pub dep: String,
}
impl MySimpleDataWithTemplate {
pub fn new(name: &str, tel: &str, dep: &str) -> Self {
Self {
name: name.into(),
tel: tel.into(),
dep: dep.into(),
}
}
fn add_custom_info(sheet: &mut Worksheet, group_id: &str) {
sheet
.get_cell_mut((&1, &2))
.set_value_string(&format!("{group_id},报表日期:2023年4月20日"));
}
}
#[test]
fn test_simple_with_template() {
let data = vec![
MySimpleDataWithTemplate::new("张三", "185xxxx2228", "网金部"),
MySimpleDataWithTemplate::new("李四", "185xxxx2229", "运管部"),
MySimpleDataWithTemplate::new("王二", "185xxxx2230", "网金部"),
];
let resp = MySimpleDataWithTemplate::write2xlsx_all(&data);
println!("resp:{resp:#?}");
}
#[derive(XlsxGroupWriteQuicker)]
#[xlsx_group_write(
line_writer_simple = "line_index-1:number,&self.name,&self.tel,&self.dep",
group_maker = "&self.dep",
template_getter = "Self::get_cur_template",
custom_info_adder = "Self::add_custom_info",
output_file_name_simple = "/tmp/test",
output_file_name_add_date = "true"
)]
struct MySimpleDataWithTemplateGetter {
pub name: String,
pub tel: String,
pub dep: String,
}
impl MySimpleDataWithTemplateGetter {
pub fn new(name: &str, tel: &str, dep: &str) -> Self {
Self {
name: name.into(),
tel: tel.into(),
dep: dep.into(),
}
}
fn get_cur_template() -> XlsxInitTemplet {
XlsxInitTemplet::new_advance("/home/feiy/Desktop/template.xlsx", 3)
}
fn add_custom_info(sheet: &mut Worksheet, group_id: &str) {
sheet
.get_cell_mut((&1, &2))
.set_value_string(&format!("{group_id},报表日期:2023年4月20日"));
}
}
#[test]
fn test_simple_with_template_getter() {
let data = vec![
MySimpleDataWithTemplateGetter::new("张三", "185xxxx2228", "网金部"),
MySimpleDataWithTemplateGetter::new("李四", "185xxxx2229", "运管部"),
MySimpleDataWithTemplateGetter::new("王二", "185xxxx2230", "网金部"),
];
let resp = MySimpleDataWithTemplateGetter::write2xlsx_all(&data);
println!("resp:{resp:#?}");
}
#[derive(XlsxGroupWriteQuicker)]
#[xlsx_group_write(
line_writer_advance = "Self::write_xlsx_line",
group_maker = "&self.dep",
template_simple = "序号,姓名,手机,部门",
output_file_name_simple = "/tmp/test"
)]
struct MyAdvanceData {
pub name: String,
pub tel: String,
pub dep: String,
}
impl MyAdvanceData {
pub fn new(name: &str, tel: &str, dep: &str) -> Self {
Self {
name: name.into(),
tel: tel.into(),
dep: dep.into(),
}
}
fn write_xlsx_line(
line_data: &MyAdvanceData,
sheet: &mut Worksheet,
line_index: u32,
) -> Option<XlsxLineAdvanceWriterResult> {
XlsxWriterTool::set_excel_cell_value_number(sheet, 1, line_index, line_index - 1);
XlsxWriterTool::set_excel_cell_value_str(
sheet,
2,
line_index,
&format!("ad-{}", &line_data.name),
);
XlsxWriterTool::set_excel_cell_value_str(sheet, 3, line_index, &line_data.tel);
XlsxWriterTool::set_excel_cell_value_str(sheet, 4, line_index, &line_data.dep);
None
}
}
#[test]
fn test_advance_write() {
let data = vec![
MyAdvanceData::new("张三", "185xxxx2228", "网金部"),
MyAdvanceData::new("李四", "185xxxx2229", "运管部"),
MyAdvanceData::new("王二", "185xxxx2230", "网金部"),
];
let resp = MyAdvanceData::write2xlsx_all(&data);
println!("resp:{resp:#?}");
}
#[derive(XlsxGroupWriteQuicker)]
#[xlsx_group_write(
line_writer_simple = "line_index-1:number,&self.name,&self.tel,&self.dep",
group_maker = "&self.dep",
template_simple = "序号,姓名,手机,部门",
output_file_name_advance = "Self::get_output_file_name_advance"
)]
struct MyFileNameData {
pub name: String,
pub tel: String,
pub dep: String,
}
impl MyFileNameData {
pub fn new(name: &str, tel: &str, dep: &str) -> Self {
Self {
name: name.into(),
tel: tel.into(),
dep: dep.into(),
}
}
#[allow(dead_code)]
fn get_output_file_name_advance(group_id: &str) -> String {
format!("/tmp/f-{group_id}.xlsx")
}
}
#[test]
fn test_advance_file_name() {
let data = vec![
MyFileNameData::new("张三", "185xxxx2228", "网金部"),
MyFileNameData::new("李四", "185xxxx2229", "运管部"),
MyFileNameData::new("王二", "185xxxx2230", "网金部"),
];
let resp = MyFileNameData::write2xlsx_all(&data);
println!("resp:{resp:#?}");
}
#[derive(XlsxGroupWriteQuicker)]
#[xlsx_group_write(
line_writer_simple = "line_index-1:number,&self.name,&self.tel,&self.dep",
group_maker = "&self.dep",
template_simple = "序号,姓名,手机,部门",
output_file_name_simple = "/tmp/test"
)]
struct MyStrData<'a> {
pub name: &'a str,
pub tel: &'a str,
pub dep: &'a str,
}
impl<'a> MyStrData<'a> {
pub fn new(name: &'a str, tel: &'a str, dep: &'a str) -> Self {
Self { name, tel, dep }
}
}
#[test]
fn test_str_data() {
let data = vec![
MyStrData::new("张三", "185xxxx2228", "网金部"),
MyStrData::new("李四", "185xxxx2229", "运管部"),
MyStrData::new("王二", "185xxxx2230", "网金部"),
];
let resp = MyStrData::write2xlsx_all(&data);
println!("resp:{resp:#?}");
}
#[derive(XlsxGroupWriteQuicker)]
#[xlsx_group_write(
line_writer_advance_with_extra_arg = "Self::write_xlsx_line",
group_maker = "&self.dep",
template_getter = "Self::get_cur_template",
extra_arg_type = "String",
custom_info_adder = "Self::add_custom_info",
output_file_name_advance = "Self::get_output_file_name_advance"
)]
struct MySimpleDataWithExtraArg {
pub name: String,
pub tel: String,
pub dep: String,
}
impl MySimpleDataWithExtraArg {
pub fn new(name: &str, tel: &str, dep: &str) -> Self {
Self {
name: name.into(),
tel: tel.into(),
dep: dep.into(),
}
}
fn write_xlsx_line(
line_data: &MySimpleDataWithExtraArg,
sheet: &mut Worksheet,
line_index: u32,
extra_arg: Option<&String>,
) -> Option<XlsxLineAdvanceWriterResult> {
XlsxWriterTool::set_excel_cell_value_number(sheet, 1, line_index, line_index - 1);
XlsxWriterTool::set_excel_cell_value_str(
sheet,
2,
line_index,
&format!("ad-{}", &line_data.name),
);
XlsxWriterTool::set_excel_cell_value_str(sheet, 3, line_index, &line_data.tel);
XlsxWriterTool::set_excel_cell_value_str(sheet, 4, line_index, &line_data.dep);
if let Some(extra_arg) = extra_arg {
XlsxWriterTool::set_excel_cell_value_str(sheet, 5, line_index, extra_arg);
}
None
}
fn get_cur_template() -> XlsxInitTemplet {
XlsxInitTemplet::new_advance("/home/feiy/Desktop/template.xlsx", 3)
}
fn add_custom_info(sheet: &mut Worksheet, group_id: &str, org_name: Option<&String>) {
if let Some(org_name) = org_name {
sheet
.get_cell_mut((&1, &5))
.set_value_string(&format!("{org_name} {group_id},报表日期:2023年4月20日"));
} else {
sheet
.get_cell_mut((&1, &5))
.set_value_string(&format!("{group_id},报表日期:2023年4月20日"));
}
}
#[allow(dead_code)]
fn get_output_file_name_advance(group_id: &str, org_name: Option<&String>) -> String {
if let Some(org_name) = org_name {
format!("/tmp/f-{org_name}-{group_id}.xlsx")
} else {
format!("/tmp/f-{group_id}.xlsx")
}
}
}
#[test]
fn test_simple_with_extra_arg() {
let data = vec![
MySimpleDataWithExtraArg::new("张三", "185xxxx2228", "网金部"),
MySimpleDataWithExtraArg::new("李四", "185xxxx2229", "运管部"),
MySimpleDataWithExtraArg::new("王二", "185xxxx2230", "网金部"),
];
let resp = MySimpleDataWithExtraArg::write2xlsx_merge_only_with_extra_arg(
&data,
Some(String::from("个性化参数")),
);
println!("resp:{resp:#?}");
}