Qt寫入excel

1.tableView導出到excel

?點擊導出函數按鈕、發送sendMessage信號(信號名稱,對象,數據)

void HydroelectricPowerPluginImpl::exportTableViewSelectedRows(QTableView* tableView, QWidget* parent)
{if (!tableView || !tableView->model())return;QString fileName = QFileDialog::getSaveFileName(parent, "導出選中行為CSV", "", "CSV文件 (*.csv)");if (fileName.isEmpty())return;QFile file(fileName);if (!file.open(QIODevice::WriteOnly | QIODevice::Text))return;QTextStream out(&file);QAbstractItemModel* model = tableView->model();// 寫表頭QStringList headers;for (int col = 0; col < model->columnCount(); ++col) {headers << model->headerData(col, Qt::Horizontal).toString();}out << headers.join(",") << "\n";// 寫選中行數據for (int row = 0; row < model->rowCount(); ++row) {QStringList rowData;for (int col = 0; col < model->columnCount(); ++col) {if (model->data(model->index(row, col)) != QVariant()) {rowData << model->data(model->index(row, col)).toString();}if (model->data(model->index(row, col), Qt::UserRole) != QVariant()) {rowData << F0(model->data(model->index(row, col), Qt::UserRole).toInt());}}out << rowData.join(",") << "\n";}file.close();
}

2.點擊button導出tableview

?

bool Utils::Gui::ExportVisibleColumnsToCSV(QTableView* tableView, const QString& filename, bool delegate, std::function<QString(const QVariant&)> v2s)
{QAbstractItemModel* model = tableView->model();if (model == nullptr) {return false;}QFile file(filename);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {return false;}QTextStream ts(&file);
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QTextCodec* codec = QTextCodec::codecForName("UTF-8");if (codec) {ts.setCodec(codec);} else {ts.setCodec(QTextCodec::codecForLocale());}ts.setGenerateByteOrderMark(true);
#elsets.setEncoding(QStringConverter::System);
#endifQHeaderView* header = tableView->horizontalHeader();QList<int> visibleCols;for (int col = 0; col < model->columnCount(); ++col) {if (delegate || (!header->isSectionHidden(col) && !IsColumnUsingCustomDelegate(tableView, col))) {visibleCols.append(col);}}// 按視覺順序排序std::sort(visibleCols.begin(), visibleCols.end(), [header](int a, int b) {return header->visualIndex(a) < header->visualIndex(b);});QStringList headerList;for (int col : visibleCols) {headerList << EscapeCSV(model->headerData(col, Qt::Horizontal).toString());}ts << headerList.join(',') << '\n';// 寫入數據行for (int row = 0; row < model->rowCount(); ++row) {QStringList rowData;for (int col : visibleCols) {QModelIndex index = model->index(row, col);auto&& v = model->data(index);rowData << EscapeCSV(v2s == nullptr ? v.toString() : v2s(index));}ts << rowData.join(',') << '\n';}file.close();return true;
}QString Utils::Gui::EscapeCSV(const QString& value)
{if (value.contains('"') || value.contains(',') || value.contains('\n') || value.contains('\r')) {QString escaped = value;escaped.replace("\"", "\"\"");return "\"" + escaped + "\"";}return value;
}

?代碼分析:

#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QTextCodec* codec = QTextCodec::codecForName("UTF-8");if (codec) {ts.setCodec(codec);} else {ts.setCodec(QTextCodec::codecForLocale());}ts.setGenerateByteOrderMark(true);
#elsets.setEncoding(QStringConverter::System);
#endif詳細解釋
1. #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
?	這部分代碼只在 Qt 5 及以下版本編譯時生效。
?	Qt 5 及以下用 QTextCodec 設置編碼。
代碼含義:
?	QTextCodec* codec = QTextCodec::codecForName("UTF-8");
嘗試獲取 UTF-8 編碼的 QTextCodec。
?	if (codec) { ts.setCodec(codec); }
如果獲取成功,設置 QTextStream 使用 UTF-8 編碼。
?	else { ts.setCodec(QTextCodec::codecForLocale()); }
如果失敗,則使用系統默認編碼。
?	ts.setGenerateByteOrderMark(true);
讓輸出流在文件開頭寫入 UTF-8 的 BOM(字節順序標記),有些軟件(如 Excel)讀取 CSV 時需要 BOM 才能正確識別為 UTF-8。
2. #else
?	這部分代碼只在 Qt 6 及以上版本編譯時生效。
?	Qt 6 移除了 QTextCodec,改用 QStringConverter。
代碼含義:
?	ts.setEncoding(QStringConverter::System);
設置 QTextStream 使用系統默認編碼(通常是 UTF-8)。總結
?	目的:保證導出的 CSV 文件編碼為 UTF-8,兼容不同 Qt 版本。
?	“坑”提示:如果編碼設置不對,中文等非 ASCII 字符在 Excel 等軟件中可能會亂碼。簡要記憶:
Qt 5 用 QTextCodec,Qt 6 用 QStringConverter,都為了讓文件編碼正確。
    // 按視覺順序排序std::sort(visibleCols.begin(), visibleCols.end(), [header](int a, int b) {return header->visualIndex(a) < header->visualIndex(b);});這行代碼的作用是:按照表頭的視覺順序對 visibleCols 進行排序。
詳細解釋
?	visibleCols 是一個存儲可見列索引(int)的列表。
?	header 是 QTableView 的水平表頭(QHeaderView*)。
?	header->visualIndex(a) 返回列 a 在界面上顯示的位置(比如用戶拖動列順序后,物理列索引和視覺順序可能不同)。
?	std::sort(..., [header](int a, int b) { ... })
使用 lambda 表達式自定義排序規則:如果 a 的視覺索引小于 b,則 a 排在前面。
舉例說明
假設表格有 4 列,物理順序是 0,1,2,3,但用戶把第2列拖到最前面,視覺順序變成 2,0,1,3。
此時 header->visualIndex(2) 返回 0,header->visualIndex(0) 返回 1,依此類推。
排序后,visibleCols 就會按照用戶看到的順序排列,而不是物理順序。常見“坑”提示:
如果你直接用物理順序導出數據,用戶看到的列順序和導出的順序可能不一致。用這段代碼可以保證導出順序和界面一致,體驗更好

?

?

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

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

相關文章

OSCP - Proving Grounds - DC - 1

主要知識點 drupal 7 RCEfind SUID提權 具體步驟 nmap起手,80端口比較有意思&#xff0c;安裝了 Drupal 7 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-17 14:23 UTC Nmap scan report for 192.168.57.193 Host is up (0.00087s latency). Not shown: 65531 cl…

仿小紅書交流社區(微服務架構)

文章目錄 framework - 平臺基礎設施starter - jacksoncommonexceptionresponseutil starter - content 全局上下文distributed - id - generate - 分布式 IdSnowflake - 基于雪花算法生成 IdSegment - 基于分段式生成 Id OSS - 對象存儲KV - 短文本存儲筆記評論 user - 用戶服務…

大模型開源技術解析 4.5 的系列開源技術解析:從模型矩陣到產業賦能的全棧突破

提示&#xff1a;本篇文章 1300 字&#xff0c;閱讀時間&#xff1a;5分鐘。 前言 6 月 30 日&#xff0c;百度正式開源文心大模型 4.5 系列&#xff0c;這一動作不僅兌現了 2 月發布會上的技術承諾&#xff0c;更以 10 款全維度模型矩陣刷新了國內開源模型的技術邊界。從學術…

[6-02-01].第05節:配置文件 - YAML配置文件語法

SpringBoot學習大綱 一、YAML語法 1.1.概述&#xff1a; 1.YAML是一種數據序列化格式&#xff1b;2.它是以數據為中心3.容易閱讀&#xff0c;容易與腳本語言交互,如下圖所示&#xff1a; 1.2.基本語法 1.key: value&#xff1a;kv之間有空格2.使用縮進表示層級關系3.縮進時…

FPGA學習

一、module : 定義&#xff1a; 是構建數字系統的基本單元&#xff0c;用于封裝電路的結構和行為。它可以表示從簡單的邏輯門到復雜的處理器等任何硬件組件。 1. module 的基本定義 module 模塊名 (端口列表);// 端口聲明input [位寬] 輸入端口1;output [位寬] 輸出端口1;ino…

26-計組-存儲器與Cache機制

一、存儲器與局部性原理 1. 局部性原理 基礎概念&#xff1a; 時間局部性&#xff1a;一個存儲單元被訪問后&#xff0c;短時間內可能再次被訪問&#xff08;例如循環變量&#xff09;。空間局部性&#xff1a;一個存儲單元被訪問后&#xff0c;其附近單元可能在短時間內被訪…

I/O 線程 7.3

前言 以下&#xff1a; 概述 1.基礎 2.代碼演示 3.練習 4.分析題 1.基礎 一、線程基礎概念 并發執行原理 通過時間片輪轉實現多任務"并行"效果 實際為CPU快速切換執行不同線程 線程 vs 進程 線程共享進程地址空間&#xff0c;切換開銷更小 進程擁有獨立資源&am…

MySQL JSON數據類型完全指南:從版本演進到企業實踐的深度對話

&#x1f4ca; MySQL JSON數據類型完全指南&#xff1a;從版本演進到企業實踐的深度對話 在當今數據驅動的時代&#xff0c;MySQL作為最受歡迎的關系型數據庫之一&#xff0c;不斷演進以滿足現代應用的需求。JSON數據類型的引入&#xff0c;讓MySQL在保持關系型數據庫優勢的同時…

BI × 餐飲行業 | 以數據應用重塑全鏈路業務增長路徑

在競爭激烈的餐飲行業中&#xff0c;數據已成為企業保持競爭力的關鍵資產。通過深入分析顧客數據&#xff0c;餐飲企業能夠洞察消費者的需求和偏好&#xff0c;從而提供更加精準和個性化的服務。此外&#xff0c;利用數據優化業務管理&#xff0c;降低成本&#xff0c;并提高運…

【學習線路】機器學習線路概述與內容關鍵點說明

文章目錄 零、機器學習的企業價值一、基礎概念1. 機器學習定義2. 學習類型3. 學習范式 二、核心算法與技術1. 監督學習2. 無監督學習3. 模型評估與優化 三、深度學習與神經網絡1. 神經網絡基礎2. 深度學習框架3. 應用場景 四、工具與實踐1. 數據處理2. 模型部署3. 機器學習的生…

Linux 命令:cp

Linux cp 命令詳細教程 cp 是 Linux 系統中最常用的命令之一&#xff0c;用于復制文件或目錄。它可以將源文件/目錄復制到指定的目標位置&#xff0c;支持批量復制、強制覆蓋、保留文件屬性等功能。下面詳細介紹其用法。資料已經分類整理好&#xff1a;https://pan.quark.cn/s…

java分頁插件| MyBatis-Plus分頁 vs PageHelper分頁:全面對比與最佳實踐

MyBatis-Plus分頁 vs PageHelper分頁&#xff1a;全面對比與最佳實踐 一、分頁技術概述 在Java持久層框架中&#xff0c;分頁是高頻使用的功能。主流方案有&#xff1a; MyBatis-Plus分頁&#xff1a;MyBatis增強工具的內置分頁方案PageHelper分頁&#xff1a;獨立的MyBatis…

PROFINET轉MODBUS TCP網關在機械臂通信操作中的應用研究

在特定的汽車零部件生產工廠焊接生產線上&#xff0c;機械臂被應用于焊接作業&#xff0c;其控制體系基于Profinet協議。同時&#xff0c;工廠的自動化控制體系以西門子S7-1200PLC為核心&#xff0c;通過ModbusTCP協議實現數據交換。為實現焊接過程的自動化控制以及生產數據的實…

Mac中如何Chrome禁用更新[update chflags macos]

寫在前面 在 macOS 系統中&#xff0c;系統更新提示的小紅點常常讓人不勝其擾。 尤其是當你希望保持現有系統的穩定性&#xff0c;或因兼容性問題暫不想升級時&#xff0c;這個小紅點就像一個頑固的提醒。 - windowsMac版直接刪除更新程序, 有效 cd ~/Library/Google/Googl…

LoRA使用-多個LoRA

LoRA的風格分類 不用去記它有什么很特別的風格&#xff0c;簡單來說基礎模型就像一個全能畫手&#xff0c;什么都能畫&#xff0c;而LoRA是在某個風格中經過特訓的它的一個分身。使得它更精通該風格。 關于LoR風格分類&#xff1a;提示詞撰寫公式 Checkpoint&LoRA對比 訓…

牛客刷題 — 【排序】[NOIP2012] 國王的游戲(高精度結構體排序)

1.題面&#xff1a;傳送門 2. 思路&#xff1a; 相鄰的兩個大臣的先后順序只會互相影響&#xff0c;并不會影響其他人的金幣數。 假設前 i-1 個人左手上的數乘積為 s 。 ① 若 A 大臣排在B 大臣的前面&#xff0c;則&#xff1a; s 此時的金幣數最大值為 。 ② 若B大臣排…

grpc 和限流Sentinel

基于gRPC的微服務通信模塊技術方案書 1. 總體架構設計 #mermaid-svg-TiN9cudEfW5mCWHm {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TiN9cudEfW5mCWHm .error-icon{fill:#552222;}#mermaid-svg-TiN9cudEfW5mCWHm…

經典灰狼算法+編碼器+雙向長短期記憶神經網絡,GWO-Transformer-BiLSTM多變量回歸預測,作者:機器學習之心!

經典灰狼算法編碼器雙向長短期記憶神經網絡&#xff0c;GWO-Transformer-BiLSTM多變量回歸預測&#xff0c;作者&#xff1a;機器學習之心&#xff01; 目錄 經典灰狼算法編碼器雙向長短期記憶神經網絡&#xff0c;GWO-Transformer-BiLSTM多變量回歸預測&#xff0c;作者&#…

VGG Image Annotator (VIA):一款免費的數據標注軟件介紹與使用

VGG Image Annotator (VIA)&#xff1a;一款免費的數據標注軟件介紹與使用 在計算機視覺領域&#xff0c;數據標注是訓練機器學習模型的基礎步驟之一&#xff0c;而標注工具的選擇直接影響標注的效率和準確性。眾多標注工具中&#xff0c;VGG Image Annotator (VIA) 是一個開源…

CSS實現百分比水柱圖

背景 在echarts沒發現有可以直接使用的展示百分比的柱形圖,只好自己封裝一個組件使用 實現思路 一、圖形拆解 要實現的組件是一個 可配置的圓柱形液柱圖組件&#xff0c;常用于展示比例進度&#xff0c;比如任務完成度、指標達成率等。把圖拆成最小單元然后拼接起來&#x…