日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

MFC Excel導(dǎo)出實(shí)戰(zhàn):COM、CSV與xlsx選型避坑

MFC Excel導(dǎo)出實(shí)戰(zhàn):COM、CSV與xlsx選型避坑 簡(jiǎn)介面向具備 C 基礎(chǔ)的 Windows 客戶端開(kāi)發(fā)者的 MFC 操作 Excel 示例工程圍繞 COM 組件接口演示如何在桌面程序中創(chuàng)建、讀寫(xiě)并保存 Excel 工作簿解決日常業(yè)務(wù)里報(bào)表導(dǎo)出與數(shù)據(jù)導(dǎo)入的實(shí)現(xiàn)問(wèn)題適合想了解 MFC 與 Office 自動(dòng)化如何銜接的中級(jí)讀者參考。壓縮包共 41 個(gè)文件、約 178KB以 26 個(gè) .h 頭文件和 4 個(gè) .cpp 源文件為主體另有 sln 與 vcxproj 工程配置、rc 與 ico 資源文件及 2 個(gè) txt 說(shuō)明文本是一個(gè)可直接編譯的對(duì)話框工程內(nèi)含 ExcelLib、Export2Excel 等封裝模塊。已有 259 人學(xué)習(xí)下載。讀者可獲得 COM 環(huán)境初始化與釋放、Application/Workbook/Worksheet/Range 對(duì)象模型的使用脈絡(luò)以及單元格寫(xiě)入讀取、另存、退出時(shí)對(duì)象釋放與異常捕獲等關(guān)鍵環(huán)節(jié)的代碼參照便于對(duì)照改造為自身的導(dǎo)出功能。1. 一個(gè)被低估的“導(dǎo)出”按鈕產(chǎn)品經(jīng)理在 MFC 客戶端上加了一個(gè)按鈕把當(dāng)前列表導(dǎo)出成 Excel。開(kāi)發(fā)看到需求的反應(yīng)往往是“一下午的事”結(jié)果代碼寫(xiě)完進(jìn)程管理器里躺著一排 EXCEL.EXE客戶那邊的表格打開(kāi)全是 ####雙擊 CSV 中文亂碼。MFC 操作 Excel 這件事難點(diǎn)從來(lái)不在“怎么寫(xiě)第一行”而在選型、釋放順序、編碼和批量寫(xiě)入這四個(gè)地方。這份資源就是圍繞這條鏈路整理的一套可編譯示例COM 自動(dòng)化怎么開(kāi)怎么收、CSV 和 SpreadsheetML 怎么在不開(kāi) Excel 的前提下落地、第三方 xlsx 庫(kù)怎么塞進(jìn) MFC 工程、以及三條路線怎么用一層接口隔開(kāi)方便換。適合正在給存量 MFC 項(xiàng)目補(bǔ)導(dǎo)出功能的人也適合接手別人代碼、被殘留進(jìn)程和亂碼反復(fù)消耗的人。下面按“選路線 → 跑通 → 批量?jī)?yōu)化 → 避坑”的順序拆。2. 三條路線的分水嶺先定方案再敲第一行代碼接手這類需求最常見(jiàn)的錯(cuò)誤是打開(kāi)搜索引擎抄一段CreateDispatch就開(kāi)干。代碼能跑但沒(méi)人回答一個(gè)問(wèn)題這個(gè)功能到底需要“生成一個(gè)能被業(yè)務(wù)方繼續(xù)編輯的 Excel”還是只需要“給對(duì)方一份能導(dǎo)入系統(tǒng)的表格”。這兩個(gè)訴求對(duì)應(yīng)的實(shí)現(xiàn)代價(jià)差著一個(gè)數(shù)量級(jí)前者要么依賴本機(jī)裝了 Excel要么引入一個(gè)完整的 xlsx 讀寫(xiě)庫(kù)后者一行 CSV 寫(xiě)文件就能解決還不占進(jìn)程。所以動(dòng)手之前先把路線定死再?zèng)Q定代碼放哪一層。這一步花二十分鐘后面能省兩天。2.1 COM 自動(dòng)化、文件格式、第三方庫(kù)各自的適用邊界把三條路線的依賴和風(fēng)險(xiǎn)攤開(kāi)看選擇其實(shí)很清楚。路線前置依賴讀寫(xiě)格式能力主要風(fēng)險(xiǎn)COM 自動(dòng)化目標(biāo)機(jī)必須裝 Excel且注冊(cè)正常強(qiáng)強(qiáng)公式、樣式、圖表、多 Sheet 全支持進(jìn)程殘留、彈框阻塞、跨位數(shù)與環(huán)境差異純文件格式CSV / SpreadsheetML無(wú)CSV 弱、XML 可讀可寫(xiě)只有值無(wú)樣式XML 有基礎(chǔ)樣式編碼、轉(zhuǎn)義、行列上限第三方 xlsx 庫(kù)隨程序分發(fā)靜態(tài)鏈接視庫(kù)而定強(qiáng)值 常用樣式公式支持看庫(kù)授權(quán)、體積、中文路徑、異常處理COM 路線的核心優(yōu)勢(shì)是“所見(jiàn)即所得”業(yè)務(wù)方要合并單元格、要條件格式、要在導(dǎo)出文件里帶一個(gè)數(shù)據(jù)透視表只有它能干。代價(jià)是把一部分可靠性交給了目標(biāo)機(jī)器——機(jī)器上沒(méi)裝 Excel、裝的是精簡(jiǎn)版、注冊(cè)表被清理工具動(dòng)過(guò)你的導(dǎo)出功能就直接趴下。CSV 和 SpreadsheetML 的優(yōu)勢(shì)是完全可控不依賴任何外部程序?qū)懲昃徒Y(jié)束沒(méi)有進(jìn)程、沒(méi)有彈框、沒(méi)有句柄泄漏。限制也很硬CSV 單表、無(wú)樣式SpreadsheetML 2003 是 XML 文本能帶樣式和列寬但文件體積大且部分新版工具對(duì)它的兼容性在退化。我在給內(nèi)部系統(tǒng)做“導(dǎo)出對(duì)賬單”這類需求時(shí)基本都走 CSV因?yàn)閷?duì)方拿到就是導(dǎo)入另一個(gè)系統(tǒng)樣式毫無(wú)意義。第三方 xlsx 庫(kù)落在中間程序自帶實(shí)現(xiàn)不依賴本機(jī)裝沒(méi)裝 Excel同時(shí)能產(chǎn)出真正的 xlsx帶基本樣式。選型時(shí)看四條——能不能靜態(tài)鏈接、異常是拋還是返回碼、路徑收不收寬字符、授權(quán)是否允許商用分發(fā)。第三條最容易被忽略第 4 章會(huì)展開(kāi)。一個(gè)務(wù)實(shí)的組合是主路線走 xlsx 庫(kù)另外保留一條 COM 路線給“需要復(fù)雜格式”的少數(shù)報(bào)表再用 CSV 做兜底降級(jí)。資源里的接口層就是為這個(gè)組合準(zhǔn)備的。2.2 AfxOleInit 與 CoInitializeEx初始化放哪、用哪個(gè)MFC 工程的 COM 初始化有兩個(gè)入口很多人混著用。AfxOleInit()內(nèi)部就是OleInitialize它把 OLE 相關(guān)的剪貼板格式、拖放、OLE 控件承載一并初始化好裸CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)只做 COM 部分。如果你的對(duì)話框里以后可能放 OLE 控件、要支持文件拖放用AfxOleInit()省事如果只是調(diào) Excel 的自動(dòng)化接口兩者都行但同一個(gè)線程里別重復(fù)用不同的套間模型。放在InitInstance最前面并且失敗時(shí)不要直接return FALSE// App.cpp —— 單實(shí)例初始化放在 InitInstance 的最前面 BOOL CExportDemoApp::InitInstance() { // 用 AfxOleInit 而不是裸 CoInitializeEx // 后續(xù)如果對(duì)話框里要放 OLE 控件、要支持拖放只有它會(huì)把相關(guān)狀態(tài)一并初始化 if (!AfxOleInit()) { // 導(dǎo)出屬于可降級(jí)功能主流程不該因?yàn)?COM 起不來(lái)就整個(gè)退出 AfxMessageBox(_T(OLE 初始化失敗Excel 相關(guān)功能不可用已切換為文件導(dǎo)出)); m_bComAvailable FALSE; } CWinApp::InitInstance(); // ... 其余初始化 return TRUE; }工作線程是另一回事。COM 的套間是按線程算的主線程初始化過(guò)不代表子線程能用。把導(dǎo)出扔到后臺(tái)線程時(shí)線程入口第一件事必須是自己初始化并且只能用 STA// ExportThread.cpp —— STA 是硬約束Excel 是單元線程模型的服務(wù)端 UINT CExportThread::Run() { // 工作線程必須獨(dú)立初始化 COM用 MTA 調(diào) Excel 會(huì)直接拿不到接口 HRESULT hr CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); if (FAILED(hr)) { PostMessage(WM_EXPORT_DONE, FALSE, 0); return 0; } BOOL bOk DoExportWork(); CoUninitialize(); // 與上面的 CoInitializeEx 嚴(yán)格配對(duì) PostMessage(WM_EXPORT_DONE, bOk, 0); // UI 更新只回傳消息不碰 MFC 對(duì)象 return 0; }這里有個(gè)血淚經(jīng)驗(yàn)工作線程里絕對(duì)不能直接用主線程的CWnd指針去更新進(jìn)度條。MFC 的窗口對(duì)象有線程歸屬跨線程調(diào)用在 Debug 下可能僥幸跑過(guò)Release 下就是隨機(jī)崩潰。正確做法是算好進(jìn)度、PostMessage丟回主線程由主線程更新控件。2.3 用類型庫(kù)導(dǎo)入替代硬編碼安裝路徑COM 路線的第一種寫(xiě)法是COleDispatchDriver加手工填DISPID第二種是#import類型庫(kù)讓編譯器生成包裝類。資源里用的是后者理由很實(shí)在Invoke的參數(shù)順序、VARIANT類型、返回值判斷全由生成的代碼處理寫(xiě)錯(cuò)了編譯期就能發(fā)現(xiàn)而不是運(yùn)行期收到一個(gè)DISP_E_TYPEMISMATCH。關(guān)鍵點(diǎn)是不要寫(xiě)死 EXCEL.EXE 的安裝路徑那玩意在不同版本、不同安裝方式下位置完全不一樣。用類型庫(kù) GUID 導(dǎo)入// ExcelTypes.h —— 全工程只在這一處引入類型庫(kù)其他文件包含它即可 #pragma once // 用類型庫(kù) GUID 導(dǎo)入避免把 Office 的安裝路徑寫(xiě)死 // 同一臺(tái)機(jī)器裝過(guò)多個(gè)版本時(shí)可以加 version(1.9) 鎖定版本代價(jià)是老環(huán)境導(dǎo)不進(jìn)來(lái) #import libid:00020813-0000-0000-C000-000000000046 \ named_guids \ no_namespace \ rename(RGB, XL_RGB) \ rename(DialogBox, XL_DialogBox) \ rename(CopyFile, XL_CopyFile) \ rename(GetObject, XL_GetObject) \ rename(FindText, XL_FindText)幾行rename不是多余的。類型庫(kù)里有個(gè)RGBMFC 里也有RGB宏類型庫(kù)里有DialogBox全局作用域里也有同名函數(shù)。不重命名包含順序一變就是一堆“重定義”報(bào)錯(cuò)這種報(bào)錯(cuò)信息指向的是系統(tǒng)頭文件排查起來(lái)非常費(fèi)勁。named_guids讓生成的.tlh里同時(shí)定義CLSID_Application之類的常量方便后續(xù)用__uuidof(Excel::Application)拿 coclass。生成的包裝指針如Excel::_ApplicationPtr本質(zhì)是_com_ptr_t析構(gòu)時(shí)會(huì)自動(dòng)Release這一點(diǎn)比手寫(xiě)LPDISPATCH安全得多——前提是你別在中途把它Detach()掉。提示#import生成的是.tlh/.tli兩個(gè)中間文件放在編譯輸出目錄里。清理工程時(shí)它們可能殘留改過(guò)類型庫(kù)導(dǎo)入語(yǔ)句后如果行為沒(méi)變化先把這兩個(gè)文件刪掉重編。3. COM 自動(dòng)化實(shí)戰(zhàn)從打開(kāi)工作簿到批量寫(xiě)單元格路線定成 COM 之后代碼要解決的是三件事把對(duì)象鏈建起來(lái)、把數(shù)據(jù)塞進(jìn)去、把對(duì)象鏈按正確順序拆掉。第三件最容易出事而它偏偏在功能驗(yàn)收時(shí)看不出來(lái)——開(kāi)發(fā)和測(cè)試機(jī)器上跑十次都正常裝到客戶機(jī)上就變成“每次導(dǎo)出后多一個(gè) EXCEL.EXE”。3.1 最小可運(yùn)行鏈路創(chuàng)建、寫(xiě)入、另存、退出先把最短路徑跑通別一上來(lái)就封裝。下面這段是能編譯、能出文件的最小實(shí)現(xiàn)// ExcelExporter.cpp —— 最小可運(yùn)行鏈路先把這一段跑通再談封裝 #include pch.h #include ExcelTypes.h #include comdef.h bool ExportDemo(const CString strPath, CString strErr) { Excel::_ApplicationPtr spApp; // CLSCTX_LOCAL_SERVERExcel 是獨(dú)立進(jìn)程的服務(wù)端這一點(diǎn)決定了后面必須有 Quit HRESULT hr spApp.CreateInstance(__uuidof(Excel::Application)); if (FAILED(hr)) { strErr _T(無(wú)法啟動(dòng) Excel請(qǐng)確認(rèn)本機(jī)已安裝且 COM 注冊(cè)正常); return false; } try { // 三個(gè)開(kāi)關(guān)后臺(tái)跑、不彈框、不刷新界面 spApp-Visible VARIANT_FALSE; spApp-DisplayAlerts VARIANT_FALSE; spApp-ScreenUpdating VARIANT_FALSE; Excel::_WorkbookPtr spBook spApp-Workbooks-Add(); Excel::_WorksheetPtr spSheet spBook-Worksheets-Item[_variant_t(1L)]; // Value2 接收 VARIANT字符串用 _variant_t 包一層別直接賦 CString spSheet-Range[_variant_t(_T(A1))]-Value2 _variant_t(_T(編號(hào))); spSheet-Range[_variant_t(_T(B1))]-Value2 _variant_t(_T(名稱)); spSheet-Range[_variant_t(_T(A2))]-Value2 _variant_t(1L); spSheet-Range[_variant_t(_T(B2))]-Value2 _variant_t(_T(示例行)); // 51 xlOpenXMLWorkbook即 xlsx存成 xls 用 -4143CSV 用 6 spBook-SaveAs(_variant_t((LPCTSTR)strPath), _variant_t(51L)); // 順序不能反先關(guān)工作簿再退出應(yīng)用 spBook-Close(_variant_t(VARIANT_FALSE)); spApp-Quit(); } catch (_com_error e) { strErr e.ErrorMessage(); // 異常路徑同樣要盡力退出否則又是一個(gè)殘留進(jìn)程 try { spApp-Quit(); } catch (...) {} return false; } return true; }代碼之后要解釋幾個(gè)點(diǎn)。CreateInstance拿的是 coclassExcel 作為本地服務(wù)端進(jìn)程被拉起來(lái)這一步之后任務(wù)管理器里就已經(jīng)有一個(gè) EXCEL.EXE 了即使你后面什么都沒(méi)干。Visible VARIANT_FALSE只是讓它不顯示窗口不減少進(jìn)程。Value2和Value的區(qū)別值得說(shuō)清楚Value2不經(jīng)過(guò)貨幣和日期類型的轉(zhuǎn)換純數(shù)值就是 double速度略快一般導(dǎo)出場(chǎng)景都用它。但正因?yàn)椴蛔鲛D(zhuǎn)換寫(xiě)入字符串形式的數(shù)字時(shí)要特別小心第 5 章會(huì)講它怎么把1-2變成日期。SaveAs的FileFormat參數(shù)是枚舉值不是字符串寫(xiě)錯(cuò)不會(huì)報(bào)錯(cuò)只會(huì)生成一個(gè)后綴對(duì)、內(nèi)容不對(duì)的文件。常用取值51是 xlsx-4143是 xls6是 CSV-4146是 SpreadsheetML 2003 的 XML。3.2 SAFEARRAY 批量寫(xiě)把逐單元格賦值換掉上面那種一格一格賦值的寫(xiě)法一萬(wàn)行八列就是八萬(wàn)次跨進(jìn)程調(diào)用每次調(diào)用都要走一遍 COM 的列集散集實(shí)測(cè)下來(lái)分鐘級(jí)起步。真正的做法是構(gòu)造一個(gè)二維SAFEARRAY一次性賦給一個(gè)區(qū)域// 行列號(hào)轉(zhuǎn) A1 地址列號(hào)從 1 開(kāi)始超過(guò) 26 列要換成 AA/AB 的二十六進(jìn)制換算 static CString MakeRangeAddress(long nRow1, long nCol1, long nRow2, long nCol2) { CString str; str.Format(_T(%c%ld:%c%ld), (TCHAR)(A (nCol1 - 1)), nRow1, (TCHAR)(A (nCol2 - 1)), nRow2); return str; } bool WriteBlockFast(Excel::_WorksheetPtr spSheet, const std::vectorstd::vectorCString rows, CString strErr) { const long nRows (long)rows.size(); if (nRows 0) return true; const long nCols (long)rows[0].size(); SAFEARRAYBOUND bounds[2]; bounds[0].lLbound 0; bounds[0].cElements nRows; // 第 1 維是行 bounds[1].lLbound 0; bounds[1].cElements nCols; // 第 2 維是列 SAFEARRAY* psa SafeArrayCreate(VT_VARIANT, 2, bounds); if (psa nullptr) { strErr _T(創(chuàng)建數(shù)據(jù)塊失敗數(shù)據(jù)量過(guò)大); return false; } for (long r 0; r nRows; r) { for (long c 0; c nCols; c) { LONG idx[2] { r, c }; // 索引順序必須和 bounds 一致 VARIANT v; VariantInit(v); v.vt VT_BSTR; v.bstrVal rows[r][c].AllocSysString(); SafeArrayPutElement(psa, idx, v); // 內(nèi)部做拷貝源必須自己清理 VariantClear(v); // 不清就是每格一個(gè) BSTR 泄漏 } } try { // 區(qū)域尺寸必須和數(shù)據(jù)塊嚴(yán)格一致多一行少一列都會(huì)拋 DISP_E_EXCEPTION const CString strAddr MakeRangeAddress(1, 1, nRows, nCols); _variant_t varBlock; varBlock.vt VT_ARRAY | VT_VARIANT; varBlock.parray psa; // 所有權(quán)移交給 _variant_t psa nullptr; // 置空防止作用域結(jié)束時(shí)重復(fù)釋放 spSheet-Range[_variant_t((LPCTSTR)strAddr)]-Value2 varBlock; // varBlock 析構(gòu)時(shí) VariantClear 會(huì)自動(dòng) SafeArrayDestroy不用手工釋放 } catch (_com_error e) { if (psa) SafeArrayDestroy(psa); strErr e.ErrorMessage(); return false; } return true; }參數(shù)上有兩個(gè)容易翻車(chē)的點(diǎn)。第一是維度順序bounds[0]對(duì)應(yīng)的是行SafeArrayPutElement的idx[0]也必須是行號(hào)寫(xiě)反了數(shù)據(jù)會(huì)轉(zhuǎn)置著填進(jìn)表格而且不報(bào)錯(cuò)。第二是所有權(quán)psa一旦交給_variant_t就絕對(duì)不能再手動(dòng)SafeArrayDestroy否則是雙重釋放程序直接退出且崩潰棧指向 COM 內(nèi)部非常難查。另外一次性賦值的數(shù)據(jù)塊別太大。十萬(wàn)行乘二十列塞進(jìn)一個(gè)SAFEARRAY光構(gòu)造過(guò)程就吃掉幾百兆內(nèi)存Excel 那邊再?gòu)?fù)制一份32 位程序很容易碰到地址空間上限。我一般按五千到一萬(wàn)行切塊每塊賦給一個(gè)區(qū)域間隔里刷新一下進(jìn)度。3.3 參數(shù)清單哪些開(kāi)關(guān)必須關(guān)關(guān)了有什么副作用COM 自動(dòng)化里幾個(gè)屬性直接決定成敗整理成表方便對(duì)照。屬性 / 參數(shù)常用取值作用副作用與注意VisibleFalse不顯示窗口不減少進(jìn)程調(diào)試時(shí)建議臨時(shí)設(shè)True看現(xiàn)場(chǎng)DisplayAlertsFalse覆蓋、格式警告不彈模態(tài)框出錯(cuò)時(shí)也靜默異常要靠_com_error捕獲ScreenUpdatingFalse關(guān)閉界面刷新寫(xiě)入提速明顯結(jié)束后要恢復(fù)為T(mén)rue否則用戶看到的是白屏EnableEventsFalse抑制工作表事件避免觸發(fā)用戶宏用戶自定義函數(shù)不會(huì)重算導(dǎo)出完成后要手動(dòng)CalculateCalculation-4135手動(dòng)關(guān)掉自動(dòng)重算大量公式的場(chǎng)景提速最明顯但值可能是舊的SaveAs的FileFormat51/6/-4143決定實(shí)際文件格式與文件后綴無(wú)關(guān)寫(xiě)錯(cuò)會(huì)生成“假后綴”文件Workbooks.Open的UpdateLinks0不更新外部鏈接打開(kāi)帶外鏈的表時(shí)避免長(zhǎng)時(shí)間卡住和彈框Calculation那一項(xiàng)值得單獨(dú)說(shuō)。默認(rèn) Excel 是自動(dòng)重算你在一個(gè)有幾萬(wàn)行公式的工作簿里逐塊寫(xiě)值每寫(xiě)一塊它就重算一遍耗時(shí)能翻好幾倍。導(dǎo)出場(chǎng)景下把計(jì)算改成手動(dòng)全部寫(xiě)完、保存前再調(diào)一次Calculate是標(biāo)準(zhǔn)的提速套路。4. 輕量導(dǎo)出與第三方庫(kù)把 COM 從主路徑上摘掉很多項(xiàng)目走到這一步會(huì)發(fā)現(xiàn)真正需要 Excel 格式的報(bào)表只占兩成剩下八成都是“導(dǎo)出一份給業(yè)務(wù)看”或“導(dǎo)出給另一個(gè)系統(tǒng)導(dǎo)入”。把這兩類需求都?jí)航o COM等于讓整個(gè)導(dǎo)出功能綁死在目標(biāo)機(jī)裝沒(méi)裝 Excel 上。資源里的做法是分層主路徑用不依賴外部程序的實(shí)現(xiàn)復(fù)雜報(bào)表才走 COM。4.1 CSV 的編碼與轉(zhuǎn)義兩個(gè)必踩的坑CSV 看著簡(jiǎn)單實(shí)際出錯(cuò)率比 COM 還高。第一個(gè)坑是編碼用 ANSI 寫(xiě)換一臺(tái)區(qū)域設(shè)置不同的機(jī)器打開(kāi)就是亂碼用 UTF-8 不帶 BOM 寫(xiě)Excel 雙擊打開(kāi)同樣亂碼因?yàn)樗跊](méi)有 BOM 時(shí)會(huì)按本地代碼頁(yè)猜。穩(wěn)妥做法是寫(xiě) UTF-8 帶 BOM。// CsvWriter.cpp —— UTF-8 BOM字段按 RFC 4180 轉(zhuǎn)義 static CStringA ToUtf8(const CString strSrc) { int n ::WideCharToMultiByte(CP_UTF8, 0, strSrc, -1, nullptr, 0, nullptr, nullptr); std::vectorchar buf(n 0 ? n : 1, 0); if (n 0) ::WideCharToMultiByte(CP_UTF8, 0, strSrc, -1, buf.data(), n, nullptr, nullptr); return CStringA(buf.data()); } static CStringA EscapeField(const CString strField) { CString str strField; // 含逗號(hào)、引號(hào)、換行的字段必須整體加引號(hào)內(nèi)部引號(hào)翻倍 BOOL bNeedQuote str.FindOneOf(_T(,\\r\n)) 0; str.Replace(_T(\), _T(\\)); CStringA strUtf8 ToUtf8(str); return bNeedQuote ? CStringA(\) strUtf8 \ : strUtf8; } bool WriteCsv(const CString strPath, const std::vectorstd::vectorCString rows) { CFile file; if (!file.Open(strPath, CFile::modeCreate | CFile::modeWrite | CFile::shareExclusive)) return false; // UTF-8 BOM本地化環(huán)境里雙擊打開(kāi)時(shí)靠這三個(gè)字節(jié)識(shí)別編碼 const BYTE bom[3] { 0xEF, 0xBB, 0xBF }; file.Write(bom, 3); CStringA strLine; for (const auto row : rows) { strLine.Empty(); for (size_t i 0; i row.size(); i) { if (i 0) strLine ,; strLine EscapeField(row[i]); } strLine \r\n; // 行尾用 CRLF純 LF 在部分工具里會(huì)被當(dāng)成一整行 file.Write(strLine, strLine.GetLength()); } file.Close(); return true; }轉(zhuǎn)義這塊CString::Replace把引號(hào)翻倍必須在加外層引號(hào)之前做順序反了會(huì)把外層引號(hào)也翻倍。行尾統(tǒng)一\r\n只寫(xiě)\n的話部分老版本工具打開(kāi)會(huì)擠成一行。第二個(gè)坑是數(shù)據(jù)本身的類型。CSV 里沒(méi)有類型信息編號(hào)00123寫(xiě)進(jìn)去再打開(kāi)就變成123長(zhǎng)數(shù)字會(huì)被識(shí)別成科學(xué)計(jì)數(shù)法。解決辦法只有兩個(gè)要么在字段值前面加一個(gè)制表符或單引號(hào)丑但有效要么干脆別用 CSV 承載這類數(shù)據(jù)換第 4.2 節(jié)的 xlsx 路線。這也是我給“對(duì)賬單導(dǎo)出”選 CSV、給“卡號(hào)名單導(dǎo)出”選 xlsx 的原因。4.2 在 MFC 工程里掛一個(gè) xlsx 庫(kù)的最小改動(dòng)第三方 xlsx 庫(kù)的選擇面不小常見(jiàn)的分兩類只寫(xiě)不讀的、讀寫(xiě)都支持的。導(dǎo)出場(chǎng)景只需要寫(xiě)選只寫(xiě)的那類體積更小、API 更直白。下面的代碼用一個(gè)抽象命名空間xw表示你所選庫(kù)的接口接入時(shí)替換成實(shí)際的頭文件和調(diào)用。// XlsxWriterAdapter.cpp —— 把第三方庫(kù)完全藏在實(shí)現(xiàn)文件里頭文件不外泄 #include pch.h #include IExcelWriter.h #include xw/xw.h // 換成你實(shí)際選用的庫(kù) static std::string ToUtf8(const CString strSrc) { int n ::WideCharToMultiByte(CP_UTF8, 0, strSrc, -1, nullptr, 0, nullptr, nullptr); std::vectorchar buf(n 0 ? n : 1, 0); if (n 0) ::WideCharToMultiByte(CP_UTF8, 0, strSrc, -1, buf.data(), n, nullptr, nullptr); return std::string(buf.data()); } class CXlsxWriter : public IExcelWriter { public: bool Open(const CString strPath) override { // 路徑先轉(zhuǎn) UTF-8多數(shù)跨平臺(tái)庫(kù)內(nèi)部按窄字符處理 // 直接強(qiáng)轉(zhuǎn) CStringA 會(huì)讓中文目錄下的文件名變成亂碼甚至創(chuàng)建失敗 m_book xw::create_workbook(ToUtf8(strPath)); return m_book ! nullptr; } bool WriteSheet(const SheetData data) override { if (!m_book) return false; auto sheet m_book-add_sheet(ToUtf8(data.strSheetName)); long nRow 0; for (size_t c 0; c data.vecHeader.size(); c) sheet-write_string(nRow, (int)c, ToUtf8(data.vecHeader[c])); for (const auto row : data.vecRows) { nRow; for (size_t c 0; c row.size(); c) { // 純數(shù)字走數(shù)值接口避免被當(dāng)成文本后在表格里顯示左對(duì)齊的小三角 double d 0; if (IsNumericField(row[c], d)) sheet-write_number(nRow, (int)c, d); else sheet-write_string(nRow, (int)c, ToUtf8(row[c])); } } return true; } bool Save() override { return m_book ? m_book-save() : false; } private: std::unique_ptrxw::Workbook m_book; };接入這類庫(kù)時(shí)改動(dòng)很小一般就是三步把頭文件和源文件加進(jìn)工程、把庫(kù)目錄加進(jìn)“附加包含目錄”、把.lib加進(jìn)鏈接器輸入。麻煩的是編譯期沖突老工程里定義了min/max宏庫(kù)頭文件里的std::min就會(huì)炸有的庫(kù)用了std::filesystem工程卻還鎖在舊的語(yǔ)言標(biāo)準(zhǔn)上。資源里把這些適配細(xì)節(jié)集中在適配層里就是為了把這類問(wèn)題關(guān)在一個(gè)文件內(nèi)。unique_ptr需要 C11 以上老編譯器環(huán)境換成裸指針加手寫(xiě)析構(gòu)邏輯一樣。4.3 用接口層把三條路線隔開(kāi)三條路線各自實(shí)現(xiàn)一套業(yè)務(wù)代碼里到處if判斷走哪條是這類功能日后最難維護(hù)的寫(xiě)法。正確姿勢(shì)是先定義一個(gè)極窄的接口只暴露“開(kāi)、寫(xiě)一頁(yè)、存”三個(gè)動(dòng)作// IExcelWriter.h —— 業(yè)務(wù)層只認(rèn)識(shí)這三個(gè)函數(shù) #pragma once #include vector #include memory struct SheetData { CString strSheetName; std::vectorCString vecHeader; std::vectorstd::vectorCString vecRows; }; class IExcelWriter { public: virtual ~IExcelWriter() {} virtual bool Open(const CString strPath) 0; virtual bool WriteSheet(const SheetData data) 0; virtual bool Save() 0; }; enum EExportRoute { Route_Com 0, Route_Xlsx, Route_Csv }; // 工廠按配置或運(yùn)行時(shí)探測(cè)結(jié)果選路線業(yè)務(wù)層不感知 std::unique_ptrIExcelWriter CreateWriter(EExportRoute eRoute) { switch (eRoute) { case Route_Com: return std::unique_ptrIExcelWriter(new CComExcelWriter()); case Route_Xlsx: return std::unique_ptrIExcelWriter(new CXlsxWriter()); case Route_Csv: return std::unique_ptrIExcelWriter(new CCsvWriter()); } return nullptr; }接口的設(shè)計(jì)取舍在于不要把 COM 特有的Range、Worksheet暴露出去否則接口一旦被其他路線實(shí)現(xiàn)就全是空函數(shù)也不要把樣式參數(shù)塞進(jìn)來(lái)樣式在各本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产日韩在线播放av| 操香逼| 久久久日本电影| 九九九九九精品十六| 乱老女人一区二区视频| 欧美亚洲色图另类国产| 综合久久少妇中文字幕| 97久久久网站| 精品人妻一区二区三区蜜桃视频| 偷拍色图| 色www精品视频在线观看| 丝袜 亚洲 偷拍| 人干人人人操人人摸| 狠狠干91| 日本欧美国内在线| 国模不卡| 亚洲精品毛片在线观看| 思思热久久成人| 亚洲麻豆av一区二区| 久久9精品网站| 大香蕉伊人网WWWn0n| 色色色综合网| 天天天天天干夜夜夜夜夜操| 日韩,欧美,中文在线| 一起草欧美| 台湾一区国产高清在线| 欧亚无码视频| 日韩在线性爱免费视频| 亚洲综合另类小说色区亚洲成av人片在www| 黄色工厂这里只有精品| 欧洲视频在线| 狠狠爱综合网| 国产精品 视频| 中文字幕天堂在线| 欧美日韩性爱操大逼| 午夜视频好爽啊| 亚洲图片激情综合另类| 亚洲最大成人a毛毛片| 91精品国产日韩欧美综合| 亚洲国产91精品一区二区久久| 97爱亚洲| 天天影视色香欲综合网小说| 天天操人人操狠狠插| 色欲av一区二区三区蜜芽| 欧美日韩大香蕉| 2024黄色视频| 91在线精品| 免费在线黄片视频| 久久HD| 日本三级中国三级99人妇网站| 国产家庭乱伦网址| 人人喜人人妻| 亚洲中文字幕av| 91性感在线| 爱逼综合| 成人97人人超碰人人| 精品无码久久久久久国产浪潮| 久久久久久日韩| 久久久久久国产精品免费网站 | 91GD.COM| 男女91| 超碰欧美在线欧美| 78精品| 97超碰色| 在线观看日韩av不卡| 中文字幕 码精品视频网站| 操91| 热热热热日日漂亮永久永久国产日| 久久成人精品| 亚洲麻豆av一区二区| 少妇啪啪自拍| 97日视频| 亚洲一区在线观看欧洲| 色色操| 中文一区二区婷婷视频| 日本免费一区二区不卡 | 亚洲aV无码成人在线观看| 亚洲国男人的天堂| 九七人妻在线| 日本精品一级二级三级| 91日本在线观看| yazhousetuoumei| av橘色网站| 性影在线视频| 东京太热久久久| 啊啊啊轻点在线观看| 免费a v| 亚洲无码AV九九九| 色 亚洲 91| 加勒比中文av| 日韩不卡毛片Av免费高清| 黄色成品网站| 日夜伊人网| 粉嫩av在线一区二区| 人人爱夜夜爱| 日韩熟女操逼| 午夜精品99久久久久传媒| AV色五月天| 18禁看网站一区| 色婷网| 91强在线播放| 国产理论视频在线播放| 亚洲图片欧美制度| 欧洲特黄毛片免费看欧洲毛片| 偷窥自拍A片| 欧美色图下一页| 人人操人人舒服| 人人人人人人少妇| 舔足天天操天天射| 日韩有码一区三区| 玖草在线视频| 综合久草| 狠狠操,使劲操| 日本免费一区二| 无码人妻一区二区三区四区老鸭窝| 欧美系列在线一区二区| 99国产精品自在自在| 欧美性爱www免费版| 走光一区92下载| 无码高清操逼网址| 久久超碰97中文字幕| 国产一区免费午夜视频| 夜夜欧美| 日本孕妇一区二区视频操逼免费看| 好淫网一二三视区| 99色热| 午夜欧美女人操逼| 欧美另类天堂| 五月丁香色婷婷| 天天噜| 69超碰综合| 国产精品ww久久| 97色冈| 国产精品久久久无码aV去| 九九成人精品| 色综合天天| 日本熟妇色熟妇在线视频播放| 亚洲人妻在线一区| 青青草在线视频美女| 国产刺激视频| 成人a v在线播放免费| 中文字幕在线观看AV| 中国AAAAAA黄色片| 欧美成人一区二区| 激情图片亚洲色图| 人妻人人做人人澡人人爽欧美一区| 亚洲一二三四区在线免费看视频| 激情五月天婷婷| 操逼操逼操| 爱爱久久| 欧美黑人猛交春色影视大全| 精品人妻中文字幕4399| 加勒比综合88| 1二区9| 99re在线观看| 老外又粗又长一晚做五次| 久久华人网| 清清一区二区三区四区不卡视频| 99热最新| 欧美性爱中文字幕无线码| 操熟女91| 亚洲在钱| 精品一区二区三区四区外站| 电影69乱码96| 日欧操屄视频| 亚洲欧美综合区自拍另类| 91第一页| 超碰碰小说97| 狠色婷婷久久一区二区三区_| 五月天精品| 中文字幕日韩人妻视频一区二区三区 | 国内精品a| 麻豆 美女 丝袜 人妻 中文| 人妻人人澡人人爽人人| 欧美黄色图片| 午夜男人天堂| 人妻熟女一区在| 成人亚欧免费视频| 性爱网站一区二区| 精品无码秘 人妻一区二区| 人妻五十路在线| av大香蕉网站| 欧美中文字幕男人天堂久久精品| 激情综合婷婷| 九九色影院| 精品成人亚洲午夜电影| 午夜乱轮操逼视频免费看| 神马久久午夜| 青青青青青手机视频| 九色 蝌蚪 熟女自 | 91福利网在线观看| 9久久久久| 人妻喷水| 噜噜噜亚洲精| 久久久少妇诱惑精品视频| 国产五码丝袜屁眼| 超碰碰激情97+久| 91九九九逼| 嗯阿好爽好紧| 欲射影视| 性欧美精| 91色综合色| 亚洲综合 欧美| 97爱b| 欧美永久激情一区二区| baiduhicn.com。| 色眯眯射| 情侣操 逼视频99| 日韩电影天堂视频二区三区| 欧亚韩国999| 欧美色吧综合| 精品午夜福利导航| 大香蕉乱级| av在线播放国产一区| 天天狠操| 亚洲国产成人精品无码专区| 亚洲中文字幕精品久久久久久直播| 日亚韩精品视频二区三| 欧美成人精品A片免费一区99| 亚洲1区| 嗯嗯啊在线视频| 偷拍欧美激情| 67194无码不卡| 天天看人人操屄犊摸阴| 超碰久超碰久| 丁香婷婷五月| 亚洲高清无码AAA久久久精品| 中文字幕一区二区三区视频播放| 精品久久視頻在线| 草蕉影视亚洲无码| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 国产99999久久精品| 欧美亚洲韩国视频十五区| 天天综合网视频91| 乱伦日本中文自拍| 亚洲AV操| 一区=区三区视频| 韩日巨乳美女免费视频在线观看| 欧美亚洲首页| 韩国三级一线观看久| 口爆吞精在线观看| www.91视频网| 26uuu国产亚洲综合| 欧美日韩性爱视屏免费看了| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 97视频900| 久热这里| 91精品久久久久五月天精品| 国产精品色哟哟| 国内外毛片在线观看| 97超碰久久| 欧美aaaaaaa| 午夜天堂精品久久久久91| 久久久久久久久久久999| 亚洲精品熟妇1区2区3区。| 色哟哟AⅤ| 超碰人人在线| 亚av顶级裸体一区二区三区四区五区| 91人妻人人澡人人爽人人精品| 成人无码在线超碰网| 91丨九色丨国产打屁股| 天堂精品| 大香蕉黄色一级片免费看| 先锋精品av色鲁| 久久久久久久久久久久欧美日| 欧美精品庄| 日韩一性一交一A片俄罗斯| 十八禁网站在线| 96一区二区三区| 精品人妻中文字幕4399| 岛国AV一区二区电影| 99热在线只有精品| 亚洲图片偷拍视频区| 国产美女自拍AV| 色噜噜狠狠色综合日日| 97久久久久久久久久| 中国一级特黄大片护士| 狠插 制服 自拍| 精品一区二区三区丰满熟女-亚洲欧美一区| 国产日韩欧美亚洲精品95| 天堂资源欧美| 欧美第一页| 亚洲麻豆精品二区三区| 久久99九九九九6666免费观看软件| 啪啪AV导航| 色女99一级片在线观看| 91视频精品| 欧美激情 日韩精品| 99re9| 久久色情| 蜜臀久久99精品久久久久久-DVD原版全| 国产AV高清AV无码| 玖玖综合视频| 啪啪91| 国产性爱强奸乱伦大全| 91亚洲不卡一区| 男人的天堂2019| 亚洲天堂色图| 天天操人人操狠狠插| 精品九九九九九九九| 一级岛国大片| 好舒服视频| 国产精品探花在线| 国产美女91| 亚洲色婷婷| 少妇色| 日本少妇va7777| 最新国内自拍av免费| 欧美 日韩 另类 亚洲| 欧美一区二区三区四区综合| 高清孕妇孕交 交孕妇| 十八禁视频网站| 91丝袜视频在线观看| oumeisetu综合| 超碰97人妻免费在线| 无码久| 亚洲国产欧美中文永久| 精品对白久久不卡| 久久久性爱视频| 国产91精品福利在线| 久久九九热| 这里有精品| 夜夜草天天| 2019午夜福利视频| 人妻天天夜夜爽一区二区| 亚洲国产精品无码AV久久久| 91狠狠狠| 天天天天天天天天综合| 欧美顶级黄片AAAAA在线免费看| 久久高潮妇女视频| 日本熟妇色熟妇在线视频播放| 欧美日韩性爱精品| 欧美一区二区三区互相| 婷婷20月天青娱乐| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 亚洲不卡不卡中文字幕不卡| 日本日皮视频逼| V A在线| 老熟妇一区二区三区| 国产久久久9999| 综合欧美日韩在线观看| 国产精品内射婷婷一级二| ...日韩成人一区二区三区字幕| 免费精品99| 国产欧美精选激情视频| 久久精品国产亚洲AV清纯| 在线电影亚洲色图| 91国产美女丝袜足交精品视频 | 国产精品乱码久久久| 久久一二三四不卡 | 啊啊啊啊啊啊啊国| 欧美精品999| 岛国黄色短视频| 91爱网| 亚洲熟妇AV日韩熟妇在线| 国产SV一线| AV九九| 蜜桃无码AV一区二区| 被男人吃奶很爽的毛片| 欧美色网| …亚洲黄色厕厕女女在线播…| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 日本综合久久| 色色激情五月天| 欧美v亚洲v日韩v最新在线二区| 无码一区免费在线不卡| 欧美片第一页| 另类图片欧美激情综合| 毛片一区二区| 亚洲婷婷丁香在线| 五月婷亚洲精品天堂| 成人九九| 97超碰9| 欧美色老汉| 欧美日韩人妻精品一区二区三区| 欧美日韩美女精品久草一区二区三区| 欧美亚洲宗合色性图| 亚洲www91| 美女毛片999| 久久婷婷亚洲欧| 影音先锋一区二区在线资源| av线电影| 色噜噜人妻av中文字幕| 男人天堂2030| 五月婷亚洲精品天堂| 清纯唯美亚洲| 另类小说综合网| 国产综合在线视频网站| 亚州免费啪啪视频| 18禁超污无遮挡无码免费网| 久久人妻精品| 特级大荫道BBwBBwBBW| 日韩欧亚太美不卡| 亚洲国产精品久久久男人的天堂| 综合视频91| 女上位精品在线| 人妻娇喘 激情视频| 熟妇色99| 热无码中文亚洲H一道本一区二区| 国产精品4p在线观看| 艹精品| 在线观看国产黄色| 久久久久13| 日日天天久久啊啊aaa| 久久鲁夜| 欧美日韩妖精91com| 亚洲综合首页| 性爱视频啪啪啪啪| 婷婷久久综合久| 国产精品九9| 日韩精品电影| 美女啊啊啊啊啊啊| 大香蕉黄色一级片免费看| 欧美黑人精品一区二区| 大稥蕉免费视频这里只有精品| 性色中出| 性色综合网| 亚洲人妻在线一区| 尹人大香蕉视频在线| 天天看人人操屄犊摸阴| 曰本特级特黄特色黄色A级网站高清在线免费看 | 高清视频一区| 东北丰满熟女国产一区| 青青草中文-久久青草精品一区二区三| 国产精品情侣啪啪| 色九色久| 国产亚洲美日韩Aⅴ中文字幕无码成人| 91chinese在线| 久久av网| 96一区二区| 欧美日韩操操操| 97爱免费插| 搡老女人老91妇女熟女| 一级性爱视频免费观看| 99re视频在线观看这里只有精品| 老女人碰碰在线碰碰视频| 快灬快灬 一下爽蜜桃在线观看 | 黄日韩| 韩国一级做a久久久久| 26uuu国产免费观看| 美女AV一区二区| 超碰九7免费| 国产风韵犹存熟妇三区| 日韩 国产 欧美自拍| 国产这里只有精品| yazhouzaixian| 黑人美精品 A片| 日韩精品操少妇| 亚洲情欲| 婷婷香蕉欧美在线一区二区三区| 变态综合色| 精品伊人久久久大香线蕉小说| 欧美久久久15P| 最新国产精品| 爱射综合| 欧美999| 天天综合91在线| 90后后入| AV中文在线| 青青草一本道福利视频| 中国亚洲呦女专区| 天堂亚洲精品| www.夜夜| 大香蕉淫人网| 狠狠中文字幕| 99re9| 久久手机视直播| 亚洲天堂精品日韩电影| 色女女女导航| 青娱乐二区免费| 啊啊啊97视频| 女同女同恋久久级三级| 日本精品一区二区三| 亚洲制服欧美另类内射| 日日骚网站| 屌逼麻豆| 欧美亚洲国产91在线| 国产91精品久久久久久久网曝门| 老外又粗又长一晚做五次| 日本精品免费一区二区三区四区| 国产精品干干干| 色亚州人久干视频在线观看免费版| 久久久久免费看少妇A片特黄| 天美传媒AV国产在线| 精品亚洲国产成人精品| 久久99九九九九6666免费观看软件| 99热成人| 日韩欧美操逼xxx| se01国产在线视频| 熟妇无码视频三区| 东京热激情视频一二三区 | 国产免费大片| 欧美日韩亚洲一区二区在线观看| 日本 情色 1区2区3区| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 国产精品密臀网在线观看| 精品一区二区人妖| 日本不卡二区| 亚洲精品久久一区二区三区蜜桃臀| 成人网址在线观看| 麻豆综合一区av| …中文字幕亚洲乱,97人妻无码费视…| 99操| 强奸乱伦大香蕉网| 国产9区| 精品国产乱码久久久兰草影视| 亚洲天堂 视频你懂的| 91无遮挡| 亚洲人妻久久久| 人妻碰碰碰碰碰碰| 亚洲激情在线| 亚洲男人天堂2019| 日韩欧美国产高清视频| 日韩中文字幕视频| 久久骚少妇| 小草av不卡亚洲二区| 91丨九色丨43老版熟女| 三级激情网站| 97亚洲中文| 亚洲天堂美臀在线| 夜夜嗨av午夜成人| 色婷婷电影网| 性开放中文AV高清无码免费看| 人人操人人肉久久精品| 熟女露脸激情自拍视频| 99热aaa| 99这里只有精品| 亚洲欧美在线观看2021| 91在线精品一区二区三区| 亚洲图片视频小说| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 精品人妻一区二区三区日产| 中文熟女五十乱码在线| 国产精品久久久久久久久久久久久久久久久久 | 午夜天堂网| 人妻熟女一区在| 在线观看日韩av不卡| 亚洲精品国产无码高清| 日本黄大片在线观看视频| 亚州男人天堂| 欧亚日韩中文在线| 91高清欧美| 999九九九九国产动| 天天综合网AV91| 久久久久久9999| 久视频在线观看| 丁香五月成人| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 国产AV天美传媒一区二区三区 | 在线毛片片免费观看| 国产精品福利视频| 亚洲欧洲激情卡通另类文学四射小说网站 | 日韩欧美偷拍美女视频| 五月天婷婷色| 国产精品免费视频人成| 囯产乱伦一区二区三女 | 亚洲综合码| 日本一区二区三区欧美日韩中文字幕| 亚洲日韩av一区二区三区百合| 极品色社| 91碰碰| 久久久九97| 久久色激情一区二区三区| 91网站18在线观看| 欧州激情视频在线一区二区| 骚逼一区二区| 经典丝袜一区| 综合网亚洲在线| 搡老女人老91二区| 囯产精品久久久久久久久久梁医生 | 久热在线精品免费观看| 亚洲三区视频| 婷婷激情综合网| 91碰碰碰| 97超碰色屌| 东北女人操比视频| 欲色综合| 一区二区三区美女超清| 芊芊操逼视频无码| 操婷婷逼| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 人妻少妇精品久久久| 亚洲色棕合| 99热伊人| 亚洲?V无码专区在线电影| 91快色色色色色| 免费观看的av| 白丝少妇一区二区| 亚洲欧美国产精品久久久久久久| 九九九网站| 巨爆乳一区二区爆乳区| 99色热| 男人干美女| 国产又大又粗又长视频| 百度百度日本操逼| 亚洲欧美国产其他二区| 青娱乐亚洲热| 人妻少妇无码| 秋霞一级A片黄色视频| 日韩不卡av一二三| 国产精品网站免费| 78精品| 黄色一区二区秘书性感| 9九九九九视频在线观看| 爱爱久久| 亚洲婷婷丁香在线| 日韩在线观看中文字幕视频| 天天摸天天碰天天添青青| av影院十区| 欧美黄色片在线播放| 天天综合91入口| 人人模人人看| 97色婷婷| 欧美97av| 秋霞蝌科网日本一区| 亚洲免费精品一区| 欧美色性情| 乱伦AVxx| 国产在线精品电影观看| 蜜乳视频网站| 精品国产自在在线99| 欧洲一区二区| 色爱三区| 青青草日韩免费观看高清在线| 在线免费观看高清无码视频| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴| silk lablo在线观看一区二区| 国产一国产一级毛片古装| 九九aV| 日韩欧美中文字亚洲慕| 中文字幕一区二区韩| 96AV久久久| 久久精品一区二区三区四区五区| 激情综合网激情五月天| 人妻素股| 日本人人操人人操| 18禁久极品美女久久哦哟呀!| 午夜男女爽爽大片免费观看| 丰满人妻一区二区三区在线| 大香蕉78| 色噜噜国产在线| 香蕉人欧美综合| 伊人久久88国产女| 欧美综合第一页| 狠狠狠狠狠狠| 日韩色香| 亭亭丁香激情| 美女裸体无遮挡永久免费观看网站 | 久久香蕉国产传媒一区剧情天美| 少妇丝袜在线观看AV| 内射小黄片| 嗯嗯,好大,好爽,好骚| 久久岛国| 久久亚洲婷婷| 天天综合91入口| 超碰碰碰碰| 狠狠操使劲操| 亚洲AO在线| 久久久性| 97色色,97综合| 99精品久久久久久久婷婷| 久久9精品网站| 色婷婷av在线观看| 在线不欧美| 精品国产72| 五月天婷精品激情| 欧美色性情| 欧美精品91| 欧美极度丰满熟妇hd| 97亚洲色图| 欧美精品丝袜久久久中文字幕| 欧美一区二区日韩三区| 亚洲精品久久一区二区三区蜜桃臀| 国产97色在线| 曰韩人妻中文字幕在线| 亚码人妻| 大香蕉97久久| 18禁免费视频| 伊香蕉综合久久久久久久噜噜噜| 韩国轻伦国内自拍一区| 一本一道波多野毛片中文在线| 中文字幕二区| 国产白嫩精品久久| 91强热人妻| 91丨人妻丨国产丨丝袜| 欧美日韩另类字幕中文| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 欧美超碰9798| 亚洲二区精品在线观看| 中欧人妻丝袜中文字幕| 日韩中文字幕宗合在线| 免费看毛片操穴| 亚洲AV秘 精品久久老牛影视| 91亚洲综合在线| 加勒比东京热五月天天堂网| 亚码激情| 国模精品一区二区三区苹果色戒| 操操逼视频| 热热色91| 免费男人的天堂| 韩国女主播青草在线| 九九无码| 91精品国产高清久久久久久,亚洲成人| 91天天| julia国产在线 | 伊人宅男大香蕉| 久久久久七视频| 91色情黑丝搞鸡在线观看一区二区三区三州 | 天天操夜夜操| 国产成人无码高清| 激情抓乳插进去啪啪啪日韩| 白丝AV| 亚洲黄色AV电影| 91c色| 国产v片在线免费观看| 啪啪自拍九九综合| 欧美日韩系列| 日韩精品系列| 亚洲自拍欧美色综合| 九九成人精品| 美女高潮视频91| 日本久操视频| 另类综合另类| 一本一道人妻久久一区二区三区 | 欧美在线|亚洲| 亚洲伊人久久精品影院| 操死我了嗯嗯嗯| 超碰人妻久久人妻中文97| 强奸少妇AV导航网| 夜夜夜久久| 国产人妻精品久久久一区二区三区| 久久曰曰| 麻豆国产尤物AV| 69人妻精品一区二区绯色| 婷婷伊人綜合中文字幕小说| 亚洲欧洲综合视频在线| 精品久久99| 另类视频在线| 操人妻少妇中文 | 欧美美女视频| 欧美色亚洲| 操逼网站网站| 成人AV超碰免费在线| 91人精品妻入口| 高潮毛片无遮挡高清免费| 91人妻精华帖| 国产男人又猛又粗又爽| 在线观看综合精品亚洲| 五月天色图| 黄污污污污| 亚洲AV乱码专区国产噜噜亚洲 | 亚洲性爱成人| 人妻少妇被猛烈进入中| 欧美人妻一区| 五月天啪啪| 麻豆视频test| 蜜臀99999| asc国产精品| 欧美性夜| 亚洲精品国产无码高清| 人人射人人操人人摸| www.狠狠| 国产乱弄免费在线视频。| 久久久免费懂色| 欧美综合色图网| 国产 日韩 欧美一区| 性爱视频无打码在线观看| 欧美视频边做饭边橾| 99国产人成精品| 国产精品午夜成人福利| 国产精品电| 99re在线| 成人免费福利在线观看| 大香蕉伊利av| 97热视频在线观看| 伊人久久AV诱惑悠悠| 国产精品视频自拍在线| 另类专区在线观看| 美腿丝袜偷拍亚洲欧美| 欲综合网| 亚洲精品性爱片| 97人人干人人操| 国产高清不卡视频| 天天影视91看看| 在线观看亚洲成人精品| 韩国黄色片精品久久久 | 无码一区二区精品视频久久久春药| 欧美性爱视频免费一区一A| 日韩亚洲美女一区久久| 视频在线中文字幕| 日韩免费簧片| 久久98| 国产第二页| 久久伊人最新网址视频| 国产高潮AA片免费看| 另类av综合久久| 蜜臀99久久精品久久久懂爱| 蜜臀AV网站| 怡春苑东京热| 九九九九精品九九九九| 一级性爱aaaa| 妇人噜噜| 亚洲一区二区在线观看91| 中文字幕av亚洲在线| 欧美72网页| 91综合色噜噜| 91狠| 欧美色综合网| 日本亚洲熟女视频| 久久99草| 在线岛国新天堂8| 91女人的网站| 日韩精品人妻| 久久久999日本大片| 新91视频.cmp| 国内自拍 日韩激情 99| 98福利在线视频| av在线观看不卡网站| 成人色女网| 国产毛片毛片4p懂色| 欧美亚洲国内自拍| 诱惑网综合| 口爆综合网| 人妻少妇精品视频一区二区三区| 亚洲AV成人在线| 久久这里只精品| 综合色99| 嗯嗯不要视频| 国产女人高潮视频| 九热中文字幕| 无码99| 日韩啊V| 日本丝袜美腿人妻九九| 18禁看网站一区| 极品粉嫩一区二区| 人妻性爱一区二区| 国产超碰在线一区| 在线看的av| 亚洲精品97中文字幕| 国产白嫩漂亮KTV在线| 欧美 综合 亚洲| 99久久久无码国产精品性男| 舔人妻中文免费视频| 欧美成va视频网站| 欧成人精品一区二区三区| 日韩高潮一区| 久久的免费性爱视频| 欧美 综合| 国产毛片在线| 91插B网站| 久久久爆乳翘臀一线天伦理视频| 啊啊啊网站| 麻豆天美传媒在线视频天堂| 成人麻豆av电影网站| 中文日韩欧美熟| 91狠狠综合久久久| 人妻夜夜爽天天爽三区麻豆AV网站| 亚洲日韩av一区二区三区百合| 成人免费看吃奶视频网站| 91精品久久久久久久久久| 亚洲国产激情国产av| 日少妇视频| 亚洲情色在线| 综合一区中亚洲国产成人综合精品| 粉嫩av一区二区三区天美传媒 | 欧美日韩97| 天天干天天日天天射黄色片| 爱av免费| 午夜精品久久一区二区| 久久99草| 久久五月份| A级毛片在线看免费| 欧美色爱综合| 亚洲国产剧情少妇激情| 播播亚洲小说亚洲| 欧亚日韩中文在线| 91影视亚洲| 性色一线| 人妻乱仑一区二区三区| 国产成人在线观看网址| 亚洲精品久久一区二区三区蜜桃臀| 屌逼麻豆| 亚洲av影院在线观看| 亚洲一区二区在线观看91| 四虎在线免费视频| 日韩伦理视频| 国产热RE99久久6国产精品首| 人人操人人干xxx| 国产尤物在线三区| 久久久∴| 天堂av2019| 亚洲欧美激情在线视频| 日本欧美韩国国产在线| 久久色精品视频在线| 国产精品久久久久999| 欧美日韩国产中文精品字幕自在自线,| 黄页网站免费高清在线观看| 91操熟女| 97操b| 玖玖爱伊人玖玖爱| 丰满搜索结果 -第18页- 久久高清无码 | 夜夜国产一区| 91九久| 天天弄天天操| 色牛牛AV| a天堂视频| 日韩欧美大力操| 99久久久无码国产精品性啊聊| 中文字幕国产| 视频在线中文字幕| 人妻无码久久一区二区三区免费| 青青草密桃在线播放| 色婷婷丁香五月| 国产精品免费美女视频| 成人av影院在线观看| 91福利网在线观看| 欧美天天综合网| 亚州欧美在线| 亚洲在线综合| 四虎免费在线播放| julia ann久久| 亭亭在线资源| 亚欧美综合网。| 欧美中字二区| 日日夜夜草草草| 亚洲男人的天堂AV| 久久AV无码1区2区3区| 中文字幕视频一区视频二区| 色妺妺在线视频| 骚货人妻偷情自拍在线视频| 小少妇| 久久欧美按摩999| 亚洲美乱| 黄色小说亚洲| AV丝袜少妇| 亚州色图欧美| 涩涩久久精品| 九热超碰| 亚洲情色 自拍| 亚洲午夜精品久久久中文影院| 日韩成人小视频| 日韩有码专区| 天天看天天日| 91久久九九精品国产综合| 无码高清少妇久久| 中文字幕一二区二三区人妻专区| 婷婷丁香九月| 亚洲情色中文字幕一区| 操逼网站地址| 日本三级久| 800zy一区二区| 欧美日韩婷婷中文| 欧洲性人爱视频| 亚洲精品国产拍免费91在线| 青青草久草| 九九九精品成人免费视频小说| 超碰国产精品无码| 精品久久久久av影院| 女人爽到高潮潮喷18禁网站| 97WW精品| 亚州 综合 色图| 日韩欧美蜜桃精品久久中文字幕久久| 欧日韩一二三f区| 日韩一级二级三级在线不卡观看完整| 亚洲精品国语在线播放| 久草国产在线视频| 大香蕉乱伦视频网| 日本不卡高清免v欧美日韩在线观看| 日韩99神马视频片| 亚洲精品97久久中文字幕| 久久久999| 欧美日韩国产黄色片| 91超级碰碰碰| 日日天天久久啊啊aaa| 啊啊啊啊啊啊啊啊啊在线观看| 欧美人妖内射| 欧美一区二区三区互相| 国产超碰| 国产精品91ai| 成人九九| 亚洲性爱免费电影| 99无码| 高清肉丝中文无码| 美女91在线| 3d成人精品一区二区| 欧美亚洲综合色| 欧洲精品一二三在线| 精品黄色电影| 在线无码操| 人妻出轨一区二区三区| 99色热| 日韩在线一区二区| 97爱爱爱综合| 国产自偷| 欧美日韩国产三级黄色| 熟女丰满人妻一区| 亚洲精品国产熟女久久久| 国产无码久久高清| 涩五月婷婷| 91精品免费| 亚洲āv网址在线观看| 91狠狠综合久久久| 亚州色阁| 少妇熟女1区2区3区| 日韩啪啪啪啪啪| 天天综合网亚洲综合网| 伊人久久综合影院| 久久一区无码| 东北熟女91| 国产精品成人无码av| 都市激情人妻一区二区青青操视频 | 99亚洲国产精品色一区二区三区| 99色天堂| 毛片99-全集电影手机免费观看完整-B029AV | 日韩射精| 大香蕉久操| 亚洲做性| 国产精选三级在线观看| 欧美色图 人妻| 狠狠久久手机视频精品| 一本一道人妻久久一区二区三区| 丝袜美腿91| 亚洲乱码尤物193YW| 欧美天堂亚洲电影院一区在线播放| 欧美传媒| 欧美色图私拍91| 国产一区二区三区高清视频| 天天综合日韩网| 天天综合欧美| 久久午夜伦| 久久精品—区二区三区内射| 九九热精品| AV天堂因数| 中出91| 欧美97爱| 激情图片伦理国产一区二区日韩| 国产精品香蕉| 四虎AV无码| 国产JDAV无码视频在线观看| 久久av网| 少妇3P性爱自拍| 超碰免费欧美7| 手机在线人成免费视频| 国产日产欧产美韩系列麻豆免费| 中文字幕成人理论在线| 亚洲天堂一区二区| 久草五月| 大香蕉一级黄色片久久| 熟女色图在线| 精品人体无圣光凹凸| 国产成人精品午夜福利| 国产视频一区二区免费| 91制服丝袜| 混色激情av| 久久黄片国产一区二区| 做爱福利视频一区二区| 国产午夜无码片在线观看影视| 好爽要喷了| 五月天激情综合网| 国产午夜精品理论片a大结局| 精品国产99| 久久高清欧美国产| 加勒比aⅴ| AV天堂电影网| 国产熟女完整版中字| 91综合天天看| 99久久com免费视频′| www.99色| 亚洲欧美天| 欧美亚洲性爱一区二区| 久久亚洲欧美中文字幕国语| 999色欧美中文字幕| 91亚洲黑人| 性影在线视频| 98久久超碰| 91综合国产精品| AV大香蕉| 91精品微拍福利| 加勒比综合在线| 欧美一二在线| 99色在线观看| 人人摸.人人色| 91观看 国产白丝| 91高跟美女在线播放| 99精品久久| 久久黄色视频一区二区三区 | 日本一区二区三区四区免费观看| 亚洲欧美97√| 亚洲自拍欧美国产首页网曝| 亚洲精品亚洲人成人网| 国产午夜福利专区综合| 97 国产精品| 男人的天堂欧美| 国产一级片| 色狠狠 - 百度| 神马久久久久久| 夜夜嗨免费视频| 97干天天| 天天欧美色| 曰韩av中文字幕专区| 免费观看性欧美一级| 成人国产二区三区在线,男女精品。| 一级黄碟在线看| 高清不卡一二三区视频......| 人妻-91porn| 人人操人人摸人人看人人干| 久久久久97| 99999久久精| 老色鬼成人精品视频下载大在线观看| 色综合潮| 人妻啊啊人妻啊啊| 全球成人中文在线| 亚洲色系另类精品国产| 蜜臀一区二区三区在线 | 亚洲激情在线| Blackedraw视频一区二区| 2026国产精品视频| 亚洲日韩成人性爱视频| 被窝影院午夜看片无码| 啊啊啊啊操死我| 伊人性在线视频| 啊啊啊啊啊舒服| 足交视频老司机| 欧美天堂超碰97| 久久超碰免费的| 国产黄色动态精品| 嗯嗯啊啊操死我| 校园春色综合| 91在线色综合| 国产精品交换一区二区| 五月婷婷六月色| 亚洲综合五月天婷婷丁香| 超碰人人干| 人人扣人人操| 色婷婷综合网站| 五月丁香狠狠爱| 激情五月天婷婷| 黄污污污污| 校园春色 男人天堂| 中文字幕在线24| 狠狠中文字幕| 搡老女人老妇女老妇老熟女怎么读| 久久久无码国精品无码三区三区| 激情五月天网| 欧美99| 熟妇熟女亚洲天堂网| 亚洲欧美一区二区三区在钱蜜桃| 亚洲日本成人动漫| 熟妇熟女亚洲天堂网| 日本免费一区二| 欧美精品偷拍| 很很很很操| 天天综合网合集91| 新91视频.cmp| 亚洲熟女综合一区二区| 亚州一区二区| 天天射天天操天天干天天吃2018| 综合影院永久入口国产| 99老司机精品视频在线观看| 免费看A片毛毛片在线播|