#include "bf.xlnt.h" void BF_Xlnt::Reset() { fanyiHistory_.clear(); } void BF_Xlnt::Set(BF_Interface* request, std::shared_ptr bfConfig) { request_ = request; bfConfig_ = bfConfig; } bool BF_Xlnt::parseXlsx(const std::string& file, std::vector& tasks, const std::string& sheetName) { xlnt::workbook wb; xlnt::worksheet ws; std::string out; try { wb.load(file); ws = wb.sheet_by_title(sheetName); for (auto& task : tasks) { for (int i = task.startRow; i <= task.endRow; i++) { for (int j = task.startCol; j <= task.endCol; j++) { gLogger->debug("=================================================="); if (Fanyi(i, j, ws, task, out) && !fanyiHistory_.count(task.from)) { fanyiHistory_[task.from] = out; } std::this_thread::sleep_for(std::chrono::milliseconds(bfConfig_->interval)); } } } } catch (const std::exception& e) { gLogger->error(e.what()); } wb.save(fmt::format("{}_out.xlsx", file)); return true; } bool BF_Xlnt::Fanyi(int i, int j, xlnt::worksheet& ws, const XlsxTask& task, std::string& out) { xlnt::cell_reference cr; if (!GetCell(i, j, ws, cr)) { gLogger->error("获取数据失败:[{}][{}]", i, j); return false; } xlnt::cell cell = ws.cell(cr); std::string text = cell.value(); BF_Util::trim(text); if (text.empty()) { gLogger->warn("数据为空,跳过:[{}][{}]", i, j); return false; } if (fanyiHistory_.count(text)) { out = fanyiHistory_[text]; gLogger->debug("使用历史数据结果:[{}][{}][{}]", i, j, text); cell.value(out); return true; } auto readyData = request_->doReady(text, task.from, task.to); if (readyData.empty()) { gLogger->warn("doReady数据为空,跳过:[{}][{}][{}]", i, j, text); return false; } auto data = fmt::format("{}{}", bfConfig_->baseUrl, readyData); std::string result = request_->getResult(data); if (!BF_Request::HandleStr(result, out)) { return false; } gLogger->info("翻译成功:[{}][{}][{}][{}]", i, j, text, out); cell.value(out); return true; } bool BF_Xlnt::GetCell(int i, int j, xlnt::worksheet& ws, xlnt::cell_reference& out) { try { auto cell = ws.cell(j, i); if (!cell.is_merged()) { out = cell.reference(); return true; } bool isFind = false; for (const auto& range : ws.merged_ranges()) { if (range.contains(cell.reference())) { out = range.top_left(); isFind = true; break; } } return isFind; } catch (const std::exception& e) { gLogger->error(e.what()); } return false; }