#![doc = include_str!("../README.md")]
use self::data::*;
use anyhow::{anyhow, Result};
use umya_spreadsheet::Worksheet;
pub mod xlsx_util;
#[cfg(feature = "date")]
pub mod date_util;
pub mod data;
#[cfg(test)]
mod test;
pub trait XlsxGroupWrite {
const LINE_WRITER_MODEL: XlsxLineWriterModel;
#[allow(unused_variables)]
fn line_writer_simple(&self, line_index: u32) -> Vec<XlsxColValue> {
unimplemented!()
}
#[allow(unused_variables)]
fn line_writer_advance(
&self,
sheet: &mut Worksheet,
line_index: u32,
) -> Option<XlsxLineAdvanceWriterResult> {
unimplemented!()
}
fn get_template() -> XlsxInitTemplet;
fn group_make(&self) -> &str {
unimplemented!()
}
#[allow(unused_variables)]
fn get_output_file_name_advance(group_id: &str) -> String {
unimplemented!()
}
const OUTPUT_FILE_NAME_GETTER_SIMPLE: Option<OutputFileNameSimpleGetter> = None;
#[allow(unused_variables)]
fn add_custom_info_to_sheet(sheet: &mut Worksheet, group_id: &str) {
}
fn write2xlsx(
data: &[Self],
output_model: XlsxWriteModel,
#[cfg(feature = "encrypt")] password: Option<&str>,
) -> Result<Vec<XlsxGroupWriteResp>>
where
Self: Sized,
{
let mut output_xlsx_files: Vec<OutputXlsxFile> = Vec::new();
let merge_sheet_id = "合并";
let template = Self::get_template();
let merge_file_name =
if let Some(output_file_name_getter_simple) = Self::OUTPUT_FILE_NAME_GETTER_SIMPLE {
output_file_name_getter_simple.get_save_file_name(merge_sheet_id)
} else {
Self::get_output_file_name_advance(merge_sheet_id)
};
let mut merge_xlsx_file = template.init_new_xlsx(merge_sheet_id, &merge_file_name)?;
let merge_sheet = merge_xlsx_file
.excel_book
.get_sheet_mut(&0)
.map_err(|err| anyhow!(" 初始化汇总xlsx失败:{}", err))?;
Self::add_custom_info_to_sheet(merge_sheet, merge_sheet_id);
let mut cur_xlsx_file = &mut template.init_new_xlsx("nope", "will_drop").unwrap();
let mut cur_sheet = cur_xlsx_file
.excel_book
.get_sheet_mut(&0)
.map_err(|err| anyhow!("读取Nope待写入excel表格失败:{}", err))?;
for line in data {
let cur_group_id = if output_model != XlsxWriteModel::MergeOnly {
line.group_make()
} else {
"sum"
};
if output_model != XlsxWriteModel::MergeOnly {
if cur_xlsx_file.id != cur_group_id {
cur_xlsx_file = match output_xlsx_files
.iter_mut()
.find(|xlsx_file| xlsx_file.id == cur_group_id)
{
Some(xlsx_file) => xlsx_file,
None => {
let new_file_name = if let Some(output_file_name_getter_simple) =
Self::OUTPUT_FILE_NAME_GETTER_SIMPLE
{
output_file_name_getter_simple.get_save_file_name(cur_group_id)
} else {
Self::get_output_file_name_advance(cur_group_id)
};
let xlsx_file = template
.init_new_xlsx(cur_group_id, &new_file_name)
.unwrap();
output_xlsx_files.push(xlsx_file);
let last_index = output_xlsx_files.len() - 1;
output_xlsx_files.get_mut(last_index).unwrap()
}
};
cur_sheet = cur_xlsx_file
.excel_book
.get_sheet_mut(&0)
.map_err(|err| anyhow!("读取待写入excel表格失败:{}", err))?;
Self::add_custom_info_to_sheet(cur_sheet, cur_group_id);
}
match Self::LINE_WRITER_MODEL {
XlsxLineWriterModel::Advance => {
match line.line_writer_advance(cur_sheet, cur_xlsx_file.index) {
Some(XlsxLineAdvanceWriterResult::Break) => {
cur_xlsx_file.index += 1;
break;
}
Some(XlsxLineAdvanceWriterResult::Continue) => {
cur_xlsx_file.index += 1;
continue;
}
None => cur_xlsx_file.index += 1,
}
}
XlsxLineWriterModel::Simple => {
let line_data = line.line_writer_simple(cur_xlsx_file.index);
XlsxColValue::write_line_data_simple(
cur_sheet,
cur_xlsx_file.index,
&line_data,
)?;
cur_xlsx_file.index += 1;
}
}
}
if output_model != XlsxWriteModel::GroupOnly {
match Self::LINE_WRITER_MODEL {
XlsxLineWriterModel::Advance => {
match line.line_writer_advance(merge_sheet, merge_xlsx_file.index) {
Some(XlsxLineAdvanceWriterResult::Break) => {
merge_xlsx_file.index += 1;
break;
}
Some(XlsxLineAdvanceWriterResult::Continue) => {
merge_xlsx_file.index += 1;
continue;
}
None => merge_xlsx_file.index += 1,
}
}
XlsxLineWriterModel::Simple => {
let line_data = line.line_writer_simple(merge_xlsx_file.index);
XlsxColValue::write_line_data_simple(
merge_sheet,
merge_xlsx_file.index,
&line_data,
)?;
merge_xlsx_file.index += 1;
}
}
}
}
let mut output_file_name_list: Vec<XlsxGroupWriteResp> =
Vec::with_capacity(output_xlsx_files.len());
if output_model != XlsxWriteModel::MergeOnly {
for xlsx_file in &output_xlsx_files {
xlsx_file.save(
#[cfg(feature = "encrypt")]
password,
)?;
output_file_name_list.push(xlsx_file.into())
}
}
if output_model != XlsxWriteModel::GroupOnly {
merge_xlsx_file.save(
#[cfg(feature = "encrypt")]
password,
)?;
output_file_name_list.push(merge_xlsx_file.into());
}
Ok(output_file_name_list)
}
fn write2xlsx_merge_only(
data: &[Self],
#[cfg(feature = "encrypt")] password: Option<&str>,
) -> Result<Vec<XlsxGroupWriteResp>>
where
Self: Sized,
{
Self::write2xlsx(
data,
XlsxWriteModel::MergeOnly,
#[cfg(feature = "encrypt")]
password,
)
}
fn write2xlsx_group_only(
data: &[Self],
#[cfg(feature = "encrypt")] password: Option<&str>,
) -> Result<Vec<XlsxGroupWriteResp>>
where
Self: Sized,
{
Self::write2xlsx(
data,
XlsxWriteModel::GroupOnly,
#[cfg(feature = "encrypt")]
password,
)
}
fn write2xlsx_all(
data: &[Self],
#[cfg(feature = "encrypt")] password: Option<&str>,
) -> Result<Vec<XlsxGroupWriteResp>>
where
Self: Sized,
{
Self::write2xlsx(
data,
XlsxWriteModel::MergeAndGroup,
#[cfg(feature = "encrypt")]
password,
)
}
}
pub mod prelude;