diff --git a/ExcelReader.cpp b/ExcelReader.cpp new file mode 100644 index 0000000..f9a3845 --- /dev/null +++ b/ExcelReader.cpp @@ -0,0 +1,204 @@ +#include "ExcelReader.h" +#include +#include + +// 构造函数:初始化文件路径和文件类型 +ExcelReader::ExcelReader(const std::string& fileName) : fileName(fileName), isXlsx(false) { + // 判断文件类型(.xls 或 .xlsx) + if (fileName.substr(fileName.find_last_of(".") + 1) == "xlsx") { + // 如果是.xlsx文件,标记为XLSX文件 + isXlsx = true; + + // 加载.xlsx文件 + loadFile(); + } else if (fileName.substr(fileName.find_last_of(".") + 1) == "xls") { + // 如果是.xls文件,标记为XLS文件 + isXlsx = false; + + // 读取.xls文件 + readXlsFile(); + } else { + // 如果不是支持的文件类型,抛出异常 + throw std::invalid_argument("Unsupported file type!"); + } +} + +// 加载 .xlsx 文件 +void ExcelReader::loadFile() { + try { + // 加载 Excel 文件 + workbook.load(fileName); + } catch (const std::exception& e) { + // 捕获异常并打印错误信息 + std::cerr << "Error loading file: " << e.what() << std::endl; + + // 抛出异常 + throw; + } +} + +// 读取 .xls 文件 +void ExcelReader::readXlsFile() { + // 使用 libxls 库读取 .xls 文件 + xlsWorkBook* pWB = xls_open(fileName.c_str(), "UTF-8"); + if (!pWB) { + // 如果文件打开失败,打印错误信息 + std::cerr << "Failed to open .xls file." << std::endl; + // 抛出异常 + throw std::runtime_error("Failed to open .xls file."); + } + + // 假设文件处理完毕,关闭文件 + xls_close(pWB); + // 提示.xls文件读取尚未完全支持 + std::cerr << "Reading .xls file not yet supported in detail." << std::endl; +} + +// 获取所有工作表的名称 +std::vector ExcelReader::getSheetNames() const { + + // 定义存储工作表名称的向量 + std::vector sheetNames; + if (isXlsx) { + // 遍历所有工作表名称 + for (const auto& sheet : workbook.sheet_names()) { + // 将工作表名称添加到返回的向量中 + sheetNames.push_back(sheet); + } + } + + // 返回所有工作表名称 + return sheetNames; +} + +// 读取指定工作表的数据 +std::vector> ExcelReader::readSheetData(const std::string& sheetName) { + // 定义存储工作表数据的二维向量 + std::vector> data; + if (isXlsx) { + try { + + // 获取指定名称的工作表 + auto worksheet = workbook.sheet_by_title(sheetName); + // 遍历工作表的每一行 + for (auto row : worksheet.rows()) { + // 定义存储每行数据的向量 + std::vector rowData; + // 遍历行中的每个单元格 + for (auto cell : row) { + // 将单元格的值添加到当前行数据中 + rowData.push_back(cell.to_string()); + } + // 将当前行数据添加到二维向量中 + data.push_back(rowData); + } + } catch (const std::exception& e) { + // 捕获异常并打印错误信息 + std::cerr << "Error reading sheet " << sheetName << ": " << e.what() << std::endl; + // 抛出异常 + throw; + } + } + // 返回工作表的数据 + return data; +} + +// 获取指定单元格的数据类型 +std::string ExcelReader::getCellDataType(const std::string& sheetName, int row, int col) { + // 默认数据类型为"Unknown" + std::string result = "Unknown"; + if (isXlsx) { + try { + // 获取指定名称的工作表 + auto worksheet = workbook.sheet_by_title(sheetName); + // 获取指定单元格 + auto cell = worksheet.cell(xlnt::cell_reference(col, row)); + if (cell.is_string()) { + // 如果单元格是字符串类型 + result = "String"; + } else if (cell.is_number()) { + // 如果单元格是数字类型 + result = "Number"; + } else if (cell.is_date()) { + // 如果单元格是日期类型 + result = "Date"; + } + } catch (const std::exception& e) { + + // 捕获异常并打印错误信息 + std::cerr << "Error reading cell (" << row << ", " << col << "): " << e.what() << std::endl; + // 返回"Error"表示读取单元格出错 + result = "Error"; + } + } + // 返回数据类型 + return result; +} + +// 写入指定单元格的数据 +void ExcelReader::writeCellData(const std::string& sheetName, int row, int col, const std::string& value) { + if (isXlsx) { + try { + // 获取指定名称的工作表 + auto worksheet = workbook.sheet_by_title(sheetName); + // 写入单元格的数据 + worksheet.cell(xlnt::cell_reference(col, row)).value(value); + } catch (const std::exception& e) { + + // 捕获异常并打印错误信息 + std::cerr << "Error writing to cell (" << row << ", " << col << "): " << e.what() << std::endl; + } + } +} + +// 保存Excel文件 +void ExcelReader::saveToFile(const std::string& newFileName) { + if (isXlsx) { + try { + // 保存文件 + workbook.save(newFileName); + } catch (const std::exception& e) { + + // 捕获异常并打印错误信息 + std::cerr << "Error saving to file: " << e.what() << std::endl; + } + } +} + +// 设置数字格式 +void ExcelReader::setCellNumberFormat(const std::string& sheetName, int row, int col, const std::string& format) { + if (isXlsx) { + try { + // 获取指定名称的工作表 + auto worksheet = workbook.sheet_by_title(sheetName); + // 获取指定单元格 + auto cell = worksheet.cell(xlnt::cell_reference(col, row)); + xlnt::style style; + // 设置单元格数字格式 + style.number_format(format); + // 应用样式 + cell.style(style); + } catch (const std::exception& e) { + + // 捕获异常并打印错误信息 + std::cerr << "Error setting number format for cell (" << row << ", " << col << "): " << e.what() << std::endl; + } + } +} + +// 合并单元格 +void ExcelReader::mergeCells(const std::string& sheetName, int startRow, int startCol, int endRow, int endCol) { + if (isXlsx) { + try { + // 获取指定名称的工作表 + auto worksheet = workbook.sheet_by_title(sheetName); + // 合并单元格 + worksheet.merge_cells(xlnt::cell_range(xlnt::cell_reference(startCol, startRow), + xlnt::cell_reference(endCol, endRow))); + } catch (const std::exception& e) { + + // 捕获异常并打印错误信息 + std::cerr << "Error merging cells: " << e.what() << std::endl; + } + } +}