解析、創建Excel文件的開源庫OpenXLSX介紹

? ? ? OpenXLSX是一個C++庫,用于讀取、寫入、創建和修改.xlsx格式的Microsoft Excel文件,源碼地址:https://github.com/troldal/OpenXLSX ,License為BSD-3-Clause,可在Windows、Linux、MaCOS平臺上使用。最新發布版本為v0.3.2,發布版本已嚴重過時,使用master分支編譯源碼

? ? ? 1. OpenXLSX依賴的第三方庫:PugiXML、Zippy和Boost.Nowide,這些庫均為頭文件,已包含在代碼庫中,無需單獨下載和構建。

? ? ? 2. OpenXLSX的重點是速度,而不是內存占用。

? ? ? 3. OpenXLSX使用CMake作為構建系統,OpenXLSX可以生成動態庫或靜態庫,默認為靜態庫。

? ? ? 4. OpenXLSX中的所有字符串操作和使用都使用C++ std::string,它與編碼無關,但可以用于UTF-8編碼。此外,Excel內部使用UTF-8編碼。

? ? ? Windows10上通過CMake編譯源碼,shell腳本內容如下:build.sh存放在OpenXLSX根目錄下

#! /bin/bashif [ $HOSTTYPE != "x86_64" ]; thenecho_error "only support x86_64 architecture: current architecture: $HOSTTYPE"
fiif [[ "$OSTYPE" != "msys" ]] && [[ "$OSTYPE" != "cygwin" ]]; thenecho_error "unsupported platform: $OSTYPE"exit -1
firesult_judgment()
{rc=$?if [[ ${rc} != 0 ]]; thenecho -e "\033[0;31mError: there are some errors in the above operation, please check: ${rc}\033[0m"exit ${rc}fi
}echo_error()
{echo -e "\033[0;31mError: $1\033[0m"
}if [ $# != 1 ]; thenecho_error "requires a parameter: Release or Debug\n  For example: $0 Debug"exit -1
fiif [ $1 != "Release"  ] && [ $1 != "Debug" ]; thenecho_error "the parameter can only be Release or Debug"exit -1
fimkdir -p build && cd buildcmake \-G"Visual Studio 17 2022" -A x64 \-DCMAKE_BUILD_TYPE=$1 \-DCMAKE_CONFIGURATION_TYPES=$1 \-DCMAKE_INSTALL_PREFIX=../install/$1 \..
result_judgmentcmake --build . --target install --config $1
result_judgment
cd ../mkdir -p install/$1/include/external
cp -a OpenXLSX/external/pugixml install/$1/include/externalecho -e "\033[0;32mbuild completed\033[0m"

? ? ? 1. Debug庫,執行:./build.sh Debug

? ? ? 2. Release庫,執行:./build.sh Release

? ? ? 3. :因為在XLXmlParser.hpp中include了<external/pugixml/pugixml.hpp>,因此需要將external中的pugixml目錄拷貝到install的include目錄下

? ? ? 解析excel文件的測試代碼如下:

int test_openxlsx_parse()
{constexpr char file_name[]{ "../../../testdata/測試.xlsx" };try {OpenXLSX::XLDocument doc;doc.open(gbk_to_utf8(file_name));auto workbook = doc.workbook();auto worksheet_names = workbook.worksheetNames();if (worksheet_names.size() == 0) {std::cerr << "Error: no worksheet: " << file_name << std::endl;return -1;}std::cout << "worksheet names: ";for (const auto& name : worksheet_names) {std::cout << utf8_to_gbk(name) << ", ";}std::cout << std::endl;auto worksheet_name = worksheet_names[0];auto worksheet = workbook.worksheet(worksheet_name);if (worksheet.rowCount() == 0) {std::cerr << "Error: excel table is empty: " << file_name << std::endl;return -1;}auto range = worksheet.range();auto rows = range.numRows();auto cols = range.numColumns();std::cout << "file name: " << file_name << ", work sheet name: " << utf8_to_gbk(worksheet_name) << ", rows: " << rows << ", cols: " << cols << std::endl;std::string str{};for (auto row = 1; row <= rows; ++row) {for (auto col = 1; col <= cols; ++col) {auto cell = worksheet.cell(row, col);if (cell.value().type() == OpenXLSX::XLValueType::String) {str = cell.value().get<std::string>();std::cout << utf8_to_gbk(str) << "\t";}else if (cell.value().type() == OpenXLSX::XLValueType::Integer) {std::cout << cell.value().get<int64_t>() << "\t";}else if (cell.value().type() == OpenXLSX::XLValueType::Float) {std::cout << cell.value().get<float>() << "\t";}}std::cout << std::endl;}const std::vector<std::string> header_row{ "代碼", "-200大", "序號", "庫存(T)", "名稱" };for (auto col = 1; col <= cols; ++col) {auto cell = worksheet.cell(1, col);for (auto i = 0; i < header_row.size(); ++i) {if (cell.value().type() == OpenXLSX::XLValueType::String) {if (utf8_to_gbk(cell.value().get<std::string>()) == header_row[i]) {std::cout << "第 " << col << " 列表示:" << header_row[i] << std::endl;break;}}}}doc.close();}catch (const std::exception& e) {std::cerr << "Error: " << e.what() << std::endl;return -1;}return 0;
}

? ? ? excel文件測試.xlsx內容如下:

? ? ? 執行結果如下圖所示:

? ? ? 創建excel文件測試代碼如下:

int test_openxlsx_create()
{constexpr char file_name[]{ "../../../testdata/創建.xlsx" };try {OpenXLSX::XLDocument doc;doc.create(gbk_to_utf8(file_name), OpenXLSX::XLForceOverwrite);auto workbook = doc.workbook();constexpr char sheet_name[]{ "信息" };workbook.addWorksheet(gbk_to_utf8(sheet_name));constexpr char default_sheet[]{ "Sheet1" };if (workbook.worksheetExists(default_sheet)) {workbook.deleteSheet(default_sheet);}const std::vector<std::string> header_row{ "序號","名稱", "代碼", "-200大",	"庫存(T)" };using info = std::tuple<int, std::string, std::string, float, float>;const std::vector<info> infos{{1, "鐵礦", "DAV382", 232.1, 10},{2, "Tiger", "234SCS", 2334, 18.5},{3, "香蕉B", "2349CX", 233.5, -192.4},{4, "Apple號", "232398", 8.48, 23} };auto worksheet = workbook.worksheet(gbk_to_utf8(sheet_name));int col = 1;for (const auto& value : header_row) {worksheet.cell(1, col).value() = gbk_to_utf8(value);++col;}auto float_to_string = [](float value) {std::ostringstream oss;oss << value;return oss.str();};int row = 2;for (const auto& [num, str1, str2, f1, f2] : infos) {worksheet.cell(row, 1).value() = num;worksheet.cell(row, 2).value() = gbk_to_utf8(str1);worksheet.cell(row, 3).value() = gbk_to_utf8(str2);worksheet.cell(row, 4).value() = f1; // 注:直接賦值f1,在excel表中顯示與原始值有差異;使用float_to_string(f1)又會導致再次解析時此數據類型為string而不是floatworksheet.cell(row, 5).value() = f2;++row;}doc.save();doc.close();}catch (const std::exception& e) {std::cerr << "Error: " << e.what() << std::endl;return -1;}return 0;
}

? ? ? 運行程序,生成的excel文件創建.xlsx內容如下:

? ? ? 輔助函數內容如下:

inline std::string gbk_to_utf8(const std::string& str)
{// gbk to wcharauto len = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, nullptr, 0);std::wstring wstr(len, 0);::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, &wstr[0], len);// wchar to utf8len = ::WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr);std::string u8str(len, 0);::WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, &u8str[0], len, nullptr, nullptr);u8str.pop_back(); // remove '\0'return u8str;
}inline std::string utf8_to_gbk(const std::string& u8str)
{// utf8 to wcharauto len = ::MultiByteToWideChar(CP_UTF8, 0, u8str.c_str(), -1, nullptr, 0);std::wstring wstr(len, 0);::MultiByteToWideChar(CP_UTF8, 0, u8str.c_str(), -1, &wstr[0], len);// wchar to gbklen = ::WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr);std::string str(len, 0);::WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, &str[0], len, nullptr, nullptr);str.pop_back(); // remove '\0' return str;
}

? ? ? :調用OpenXLSX接口時

? ? ? 1. 行、列索引從1開始

? ? ? 2. 中文文件名或excel表中帶有中文的需額外處理

? ? ? GitHub:https://github.com/fengbingchun/Messy_Test

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98677.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98677.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98677.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C++】C++11 篇二

【C】C11 篇二前言移動構造函數移動賦值運算符重載類成員變量初始化 &#xff08;缺省值出自C11強制生成默認函數的關鍵字default:禁止生成默認函數的關鍵字delete:繼承和多態中的final與override關鍵字&#xff08;出自C11可變參數模板遞歸函數方式展開參數包逗號表達式展開參…

構建Python環境的幾種工具

本文主要介紹如何構建Python環境來處理不同的工作。 1.常用的構建Python環境的工具 ①venv(內置模塊):Python 3.3 內置標準庫模塊&#xff0c;無需額外安裝。 ②virtualenv:venv的前身&#xff0c;功能更強大且支持舊版Python。 ③conda:來自 Anaconda 或 Miniconda。不僅能…

c#項目編譯時外部依賴文件的同步問題

很多場景因為資源文件太多或太大無法放到資源里面或者是依賴的dll文件&#xff0c;需要編譯時同步到bin\debug或bin\release下的&#xff0c;這里面要修改工程文件代碼實現。 比如&#xff0c;我把這個項目依賴的dll和附加文件放到ref_dll文件夾里面&#xff0c;希望編譯的時候…

數學建模常用算法-模擬退火算法

一、模擬退火算法模擬退火的靈感來源于物理中的 “退火過程”—— 將金屬加熱到高溫后&#xff0c;緩慢冷卻&#xff0c;金屬原子會在熱能作用下自由運動&#xff0c;逐漸形成能量最低的穩定結構。算法將這一過程抽象為數學模型&#xff1a;“溫度 T”&#xff1a;對應物理中的…

架構很簡單:業務架構圖

緣起業務架構是一個復雜的體系&#xff0c;如何更簡單的表達&#xff0c;并能使用起來呢&#xff1f;所謂&#xff1a;大道至簡。基于此&#xff0c;這篇文章就開始了。業務是一切架構的開始&#xff0c;如果沒有業務&#xff0c;架構又有什么作用呢&#xff1f;所以做架構首先…

【前端埋點】純前端實現 A/B Test

“純前端實現 A/B Test”&#xff0c;意思就是 沒有后端分流、也不依賴流量網關&#xff0c;那么只能靠前端邏輯來做“流量切分”。 &#x1f3af; 目標 80% 的用戶 → A 頁面20% 的用戶 → B 頁面且要保證 同一個用戶每次訪問結果一致&#xff08;否則用戶刷新頁面時 A/B 會跳…

Day22_【機器學習—集成學習(3)—Boosting—Adaboost算法】

Adaptive Boosting(自適應提升)是基于 Boosting思想實現的一種集成學習算法&#xff0c;核心思想是通過逐步提高那些被前一步分類錯誤的樣本的權重來訓練一個強分類器。一、Adaboost算法直線相當于一個弱學習器&#xff0c;正確的數據權重減小&#xff0c;錯誤的數據權重增加二…

C#語言入門詳解(18)傳值、輸出、引用、數組、具名、可選參數、擴展方法

C#語言入門詳解&#xff08;18&#xff09;傳值、輸出、引用、數組、具名、可選參數、擴展方法一、傳值參數1. 值類型2. 引用類型&#xff0c;并且創建對象3. 引用類型&#xff0c;不創建對象二、引用參數1. 值類型2. 引用類型&#xff0c;創建新對象3. 引用類型&#xff0c;不…

模型部署:(二)安卓端部署Yolov5-v6.0目標檢測項目全流程記錄

模型部署&#xff1a;&#xff08;二&#xff09;安卓端部署Yolov5-v6.0目標檢測項目全流程記錄1、下載NCNN項目2、下載基于安卓的yolov5項目3、修改相應的配置文件4、將項目打包成apk包5、部署自己訓練的yolov5模型6、相關資料下載&#xff1a;1、下載NCNN項目 # 鏈接地址 ht…

圖形基礎算法:如何將點與帶曲線邊的多邊形位置關系算法做穩定

簡介判斷點與多邊形位置關系算法是幾何算法中最基礎的算法之一&#xff0c;包括布爾運算在內的非常非常多的算法都會用到它。它的穩定是算法庫穩定的關鍵。下面我們從一個邊都是直線的多邊形開始了解射線法的原理。然后看看引入曲線后會帶來哪些問題&#xff0c;以及在實際應用…

react的filber架構

好問題 &#x1f44d; 你問的是 React Fiber 架構。這是 React 16 引入的核心機制&#xff0c;用來解決 React 在大規模更新時的性能問題。下面我給你從 背景 → Fiber 是什么 → 原理 → 優點 → 流程 來系統講。一、為什么需要 Fiber&#xff1f;在 React 15 及以前&#xff…

Lucky STUN穿透結合群暉NAS實現docker下transmission監聽端口動態更新

參考文章 LCUKY系列教程 一 「LUCKY STUN穿透」使用 cURL 自動修改 Transmission 的監聽端口 二 「LUCKY STUN穿透」使用 Webhook 自動修改 qbittorrent 的監聽端口 三 LUCKY STUN穿透在Windows上使用UPnP工具為BT客戶端自動添加內外端口號不同的映射規則 四「LUCKY STUN穿透」…

如何在Ubuntu暢玩鳴潮等游戲

本教程只包括Steam上的游戲。# 更新軟件源 sudo apt update # 安裝Steam sudo apt install steam首先&#xff0c;在Ubuntu的snap商店安裝Steam&#xff0c;啟動&#xff0c;登陸&#xff0c;下載游戲。到這里的操作都比較簡單&#xff0c;對于沒有反作弊的游戲&#xff0c;往往…

機器學習09——聚類(聚類性能度量、K均值聚類、層次聚類)

上一章&#xff1a;機器學習08——集成學習 下一章&#xff1a;機器學習10——降維與度量學習 機器學習實戰項目&#xff1a;【從 0 到 1 落地】機器學習實操項目目錄&#xff1a;覆蓋入門到進階&#xff0c;大學生就業 / 競賽必備 文章目錄一、聚類任務&#xff08;無監督學習…

解決 Docker 構建中 Python 依賴沖突的完整指南

問題背景 在基于 registry.cn-shenzhen.aliyuncs.com/all_dev/dev:invoice-base 鏡像構建 Docker 容器時,我們遇到了一個常見的 Python 依賴管理問題: ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/topics/dependency-resolution/#dealing-…

光子計算芯片實戰:Lightmatter Passage互連架構性能評測

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 摘要 隨著人工智能計算需求呈指數級增長&#xff0c;傳統電子計算…

基于樹莓派與Jetson Nano集群的實驗邊緣設備上視覺語言模型(VLMs)的性能評估與實踐探索

概述 2018年&#xff0c;TensorFlow Lite團隊的Pete Warden曾提出&#xff1a;“機器學習的未來在于微型化”。如今&#xff0c;隨著人工智能向高性能視覺強大的視覺語言模型&#xff08;Vision-language models, VLMs&#xff09;發展&#xff0c;對高性能計算資源的需求急劇…

華為Ai崗機考20250903完整真題

華為Ai崗機考20250903 華為自26屆秋招&#xff08;2025年起&#xff09;對AI崗位機考進行了改革&#xff0c;考試題型調整為20道選擇題&#xff08;15道單選(6分)5道不定項選擇(12分)&#xff09;2道編程題(150300)。 題目核心圍繞人工智能技術&#xff08;如Transformer架構…

k8s+jenkins+harbor構建Devops平臺

一、環境準備1、準備一主一從k8s機器&#xff0c;&#xff08;設備好可以一主多從也行&#xff09;2、一臺harbor倉庫機器&#xff08;dockerhub訪問不了&#xff09;二、安裝nfs服務1、在k8s機器上yum install nfs-utils -y systemctl start nfs systemctl enable nfs2、創建共…

為什么 socket.io 客戶端在瀏覽器能連上,但在 Node.js 中報錯 transport close?

網羅開發&#xff08;小紅書、快手、視頻號同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企業從事人工智能項目研發管理工作&#xff0c;平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…