免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

C# NPOI 操作 Excel:選型、流式導(dǎo)出與避坑

C# NPOI 操作 Excel:選型、流式導(dǎo)出與避坑 簡介面向正在用 C# 處理 Excel 的 .NET 開發(fā)者這份資料圍繞 NPOI 庫給出可直接參考的讀寫示例覆蓋舊版 .xls 與新版 .xlsx 兩種格式既適合剛接觸 NPOI 的新手入門也適合需要封裝通用工具類的中級開發(fā)者對照借鑒。壓縮包共 15 個(gè)文件以 12 個(gè) dll 依賴庫為主另有 2 個(gè) cs 源碼與 1 個(gè) xml 配置整體約 2.19MBdll 提供 NPOI 各模塊及 JSON、壓縮等支撐能力cs 文件則呈現(xiàn)工具類的組織方式。內(nèi)容涉及工作簿與工作表創(chuàng)建、單元格寫入與遍歷讀取、字體邊框?qū)R等樣式設(shè)置、文件保存和異常處理并按 2012Version 與 201607Version 分版本實(shí)現(xiàn)便于比較不同 NPOI 版本下的 API 差異及 HSSF、XSSF 兩套模型。已有 6358 人學(xué)習(xí)可為項(xiàng)目中的 Excel 導(dǎo)入導(dǎo)出、報(bào)表生成與工具類封裝提供參考。1. 別急著裝 Office先看清 C# NPOI 操作Excel 到底解決什么問題后臺要導(dǎo)一份對賬單服務(wù)器上沒裝 OfficeMicrosoft.Office.Interop.Excel一跑就拋 0x800A03EC這個(gè)場景我見過不止一次。換個(gè)角度看C# NPOI 操作Excel 最省心的地方恰恰是它根本不碰 Office——純托管庫在進(jìn)程里直接拼 xls/xlsx 的二進(jìn)制結(jié)構(gòu)服務(wù)器裝不裝 Office 都能跑。它一套 API 覆蓋兩種格式老的.xls走 HSSF新的.xlsx走 XSSF數(shù)據(jù)量大再換 SXSSF 流式寫十萬行也不至于把內(nèi)存吃穿。適合做報(bào)表導(dǎo)出、批量數(shù)據(jù)導(dǎo)入、模板填充的后臺服務(wù)、桌面工具和接口項(xiàng)目如果你只是偶爾手動改個(gè)表那確實(shí)沒必要上它。2. 技術(shù)選型與工程結(jié)構(gòu)HSSF、XSSF、SXSSF 三套模型怎么分工打開 NPOI 的命名空間會看到一堆HSSF開頭的類第一反應(yīng)通常是“這不是 Java 那套的翻版嗎”。確實(shí)接口模型沿用了IWorkbook/ISheet/IRow/ICell這層抽象好處是同一份業(yè)務(wù)代碼換個(gè)實(shí)現(xiàn)類就能讀寫不同格式壞處是新手很容易在new的那一行就把類型寫死后面想兼容.xls就得大改。選型這一步基本決定了后面會不會返工所以拆代碼之前先把模型說清楚。2.1 三種工作簿模型的邊界模型對應(yīng)格式內(nèi)存形態(tài)適用量級主要限制HSSFWorkbook.xls全量駐留內(nèi)存幾萬行以內(nèi)單表 65536 行、256 列XSSFWorkbook.xlsxDOM 全量駐留十萬行內(nèi)看堆大小行數(shù)越多內(nèi)存線性上漲SXSSFWorkbook.xlsx滑動窗口 磁盤臨時(shí)文件百萬行級已刷出的行不能再改、不能刪行我的默認(rèn)規(guī)則很粗暴對方?jīng)]明確要求.xls一律XSSFWorkbook導(dǎo)出預(yù)估超過五萬行直接上SXSSFWorkbook只有對接老系統(tǒng)、對方還在用舊版表格軟件時(shí)才回頭用HSSF。這條規(guī)則能省掉九成的兼容性扯皮。SXSSF 的代價(jià)必須提前說清楚。它把已經(jīng)寫出去的行刷到磁盤臨時(shí)文件內(nèi)存里只留窗口內(nèi)的那幾百行所以你別想回頭sheet.GetRow(0)去改第一行——那時(shí)候它已經(jīng)在臨時(shí)文件里了GetRow直接返回null。需要回頭改的東西合計(jì)行、頁腳匯總要么放最后寫要么在窗口還沒刷出去之前處理掉。這個(gè)限制踩過一次就記住了。還有一個(gè)反直覺的點(diǎn)讀文件時(shí)判斷格式不要靠文件后綴用WorkbookFactory.Create(stream)讓它自己嗅探。業(yè)務(wù)方發(fā)過來的“對賬單.xls”里裝著的其實(shí)是 HTML 表格這種事我一年能遇到兩回。2.2 示例工程的分層與目錄結(jié)構(gòu)示例工程我按“核心邏輯不依賴 UI、不依賴文件系統(tǒng)”來切目錄長這樣NpoiExcelDemo/ ├── NpoiExcelDemo.sln ├── src/ │ ├── NpoiExcelDemo.Core/ # 只做 Excel 讀寫不放業(yè)務(wù) │ │ ├── ExcelReader.cs │ │ ├── ExcelWriter.cs │ │ ├── ExcelStyleFactory.cs │ │ ├── ExcelColumnAttribute.cs │ │ └── Models/OrderRow.cs │ ├── NpoiExcelDemo.Console/ # 命令行入口跑兩個(gè)示例 │ │ └── Program.cs │ └── NpoiExcelDemo.Tests/ # xUnit用內(nèi)存流做往返測試 │ └── RoundTripTests.cs ├── samples/ │ ├── legacy.xls # 老格式樣本 │ └── modern.xlsx # 新格式樣本 └── templates/ └── 對賬單模板.xlsxCore里我堅(jiān)持不讓IWorkbook泄漏出去。對外方法簽名一律是Stream進(jìn)、Stream或ListT出業(yè)務(wù)層根本不需要using NPOI.SS.UserModel;。這么做有兩個(gè)直接好處單測里傳一個(gè)MemoryStream就能跑完整鏈路不落盤Web 上傳場景拿到IFormFile.OpenReadStream()可以直接喂進(jìn)去不用先存臨時(shí)文件再刪。samples目錄的作用容易被低估。.xls和.xlsx在單元格類型、日期序列號、公式緩存上的行為并不完全一致光靠猜沒用必須有一份真實(shí)的舊格式文件反復(fù)驗(yàn)證。templates目錄則是給“模板填充”這種需求準(zhǔn)備的——表頭、樣式、合并單元格都在模板里做好代碼只負(fù)責(zé)往里塞數(shù)據(jù)行改樣式的時(shí)候不用改代碼。3. 從零跑通裝包、寫第一個(gè) xlsx、再讀回 xls這一章的操作照著敲就能跑起來目標(biāo)是把“寫出去”和“讀進(jìn)來”這兩條鏈路都走通一遍中間不留黑匣子。3.1 建工程與引包# 建解決方案和兩個(gè)項(xiàng)目 dotnet new sln -n NpoiExcelDemo dotnet new classlib -n NpoiExcelDemo.Core -o src/NpoiExcelDemo.Core dotnet new console -n NpoiExcelDemo.Console -o src/NpoiExcelDemo.Console # 掛到解決方案下 dotnet sln add src/NpoiExcelDemo.Core src/NpoiExcelDemo.Console # NPOI 只需要裝在 Core 里Console 通過項(xiàng)目引用拿到 dotnet add src/NpoiExcelDemo.Core package NPOI dotnet add src/NpoiExcelDemo.Console reference src/NpoiExcelDemo.Core這里面幾個(gè)參數(shù)值得說明。-o是指定輸出目錄把項(xiàng)目塞進(jìn)src/是習(xí)慣不塞也能跑。dotnet add package NPOI不寫版本號默認(rèn)拉最新穩(wěn)定版如果目標(biāo)框架是netstandard2.0要給老項(xiàng)目引用加-f netstandard2.0或者直接改 csproj 里的TargetFramework。Framework 4.x 的老項(xiàng)目不走 CLI在包管理器里裝完記得看一眼依賴項(xiàng)——NPOI 會順帶拉一個(gè)壓縮庫發(fā)布的時(shí)候別只拷了NPOI.dll就以為完事了缺依賴的報(bào)錯(cuò)信息通常很含糊只說“未能加載文件或程序集”排查起來全靠猜。提示目標(biāo)框架選net8.0還是netstandard2.0取決于調(diào)用方。庫給多個(gè)項(xiàng)目共用就選netstandard2.0純新項(xiàng)目選net8.0能用上Span之類的新 API。3.2 寫出第一個(gè) .xlsxNPOI 的層級就四層工作簿 → 工作表 → 行 → 單元格。下面這段是最小閉環(huán)using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; public static void WriteSimple(string path) { // 1. 工作簿XSSF 對應(yīng) .xlsx IWorkbook workbook new XSSFWorkbook(); ISheet sheet workbook.CreateSheet(對賬單); // 2. 表頭行 IRow header sheet.CreateRow(0); string[] titles { 訂單號, 客戶, 金額, 下單時(shí)間 }; for (int i 0; i titles.Length; i) { header.CreateCell(i).SetCellValue(titles[i]); } // 3. 數(shù)據(jù)行 IRow row sheet.CreateRow(1); row.CreateCell(0).SetCellValue(SO-2024001); row.CreateCell(1).SetCellValue(某客戶); row.CreateCell(2).SetCellValue(1280.50); // 數(shù)值走 double 重載 row.CreateCell(3).SetCellValue(DateTime.Now); // 日期直接給 DateTime // 4. 列寬單位是 1/256 個(gè)字符寬度20 * 256 20 字符 sheet.SetColumnWidth(0, 20 * 256); using var fs new FileStream(path, FileMode.Create, FileAccess.Write); workbook.Write(fs); }逐段說一下。CreateSheet傳的名字就是 Excel 底部的標(biāo)簽名超過 31 個(gè)字符或含[]:*?/\會直接拋異常。CreateCell(i)的索引從 0 開始跳著創(chuàng)建也允許比如只創(chuàng)建第 0 和第 5 個(gè)中間的空單元格讀回來是CellType.Blank。金額這一行是關(guān)鍵SetCellValue(1280.50)存的是數(shù)值Excel 里能參與求和如果圖省事寫成SetCellValue(1280.50)存的是文本Excel 會在左上角給你標(biāo)個(gè)綠色小三角用戶一點(diǎn)“轉(zhuǎn)換為數(shù)字”全部格式又亂掉血淚經(jīng)驗(yàn)。日期同理SetCellValue(DateTime)會把它轉(zhuǎn)成序列號存儲顯示格式由單元格樣式的DataFormat決定不設(shè)樣式就是默認(rèn)的日期顯示。最后workbook.Write(fs)這個(gè)重載在不同版本上行為有差異有的會把流關(guān)掉有的不會。不確定的話就在Write之后立刻fs.Flush()并且不要指望后面還能繼續(xù)往這個(gè)流里寫東西。3.3 用 WorkbookFactory 統(tǒng)一讀 .xls 和 .xlsx讀這邊最容易犯的錯(cuò)是寫死new XSSFWorkbook(fs)遇到.xls就拋Invalid header signature。正確姿勢是工廠加接口using NPOI.SS.UserModel; public static void ReadAny(string path) { using var fs new FileStream(path, FileMode.Open, FileAccess.Read); // 關(guān)鍵工廠根據(jù)文件頭自動選 HSSF 還是 XSSF IWorkbook workbook WorkbookFactory.Create(fs); for (int s 0; s workbook.NumberOfSheets; s) { ISheet sheet workbook.GetSheetAt(s); // LastRowNum 是最后一行索引空表返回 -1不能直接當(dāng)行數(shù) for (int r sheet.FirstRowNum; r sheet.LastRowNum; r) { IRow row sheet.GetRow(r); if (row null) continue; // 整行被刪過就是 null不判會 NRE for (int c 0; c row.LastCellNum; c) { ICell cell row.GetCell(c); Console.Write(ExcelReader.GetCellText(cell) \t); } Console.WriteLine(); } } }WorkbookFactory.Create支持傳Stream或FileInfo內(nèi)部會讀文件頭判斷格式比看后綴靠譜得多。FirstRowNum和LastRowNum都返回索引空表或者全空行的情況下LastRowNum可能是-1、0或者你以為的行數(shù)寫for循環(huán)時(shí)用并且判row null這兩道保險(xiǎn)缺一不可。GetSheetAt是按順序取GetSheet(名字)是按名取。名字取不到會返回null而不是拋異常后面直接.GetRow()就炸了所以按名取的時(shí)候記得判空。3.4 跑起來看一眼dotnet run --project src/NpoiExcelDemo.Console -- ./out/demo.xlsx ./samples/legacy.xls參數(shù)依次是輸出路徑和要讀的舊格式樣本。跑完先確認(rèn)三件事out/demo.xlsx能被正常打開、金額那一列右對齊且能求和、legacy.xls的中文沒有亂碼。這三條過了說明環(huán)境、依賴、編碼都沒問題后面再改代碼就是純業(yè)務(wù)活了。4. 核心模塊拆解取值、樣式、大文件、格式差異這一段是真正要反復(fù)用的東西。示例里那幾個(gè)方法寫短是因?yàn)榘阉锌佣际者M(jìn)了這幾個(gè)方法里。4.1 單元格取值CellType 分支一個(gè)都不能漏讀 Excel 最典型的故障是“日期變成 45000 這種數(shù)字”根子在CellType.Numeric—— 日期在底層就是數(shù)字靠樣式區(qū)分。所以取值方法必須寫成這樣public static string GetCellText(ICell cell) { if (cell null) return string.Empty; switch (cell.CellType) { case CellType.String: return cell.StringCellValue; case CellType.Numeric: // 日期底層是序列號必須靠單元格樣式判斷直接 ToString 會得到 45000 if (DateUtil.IsCellDateFormatted(cell)) return cell.DateCellValue?.ToString(yyyy-MM-dd HH:mm:ss) ?? ; return cell.NumericCellValue.ToString(); case CellType.Boolean: return cell.BooleanCellValue ? TRUE : FALSE; case CellType.Formula: // 公式要按緩存結(jié)果類型再分一次支不能直接取 StringCellValue switch (cell.CachedFormulaResultType) { case CellType.Numeric: return DateUtil.IsCellDateFormatted(cell) ? cell.DateCellValue?.ToString(yyyy-MM-dd) ?? : cell.NumericCellValue.ToString(); case CellType.String: return cell.StringCellValue; default: return cell.ToString() ?? ; } case CellType.Blank: return string.Empty; case CellType.Error: // 把 #DIV/0! 這類錯(cuò)誤碼還原成可讀文本 return FormulaError.ForInt(cell.ErrorCellValue).String; default: return cell.ToString() ?? string.Empty; } }三個(gè)地方值得單獨(dú)講。DateUtil.IsCellDateFormatted(cell)是個(gè)靜態(tài)工具方法內(nèi)部讀的是單元格樣式的DataFormat字符串判斷是不是日期/時(shí)間格式比自己寫正則靠譜。CellType.Formula分支里必須先看CachedFormulaResultType—— 公式單元格的StringCellValue只有在緩存結(jié)果是字符串時(shí)才有效緩存是數(shù)字你卻去取字符串拿到的是空串或者直接拋異常這種問題在日志里只表現(xiàn)為“某幾列讀出來是空的”非常難定位。FormulaError.ForInt把0x07這種錯(cuò)誤碼轉(zhuǎn)成#DIV/0!報(bào)表里帶著錯(cuò)誤碼有時(shí)候反而是有用的信息別急著當(dāng)成異常吞掉。注意DateCellValue在較新版本里是DateTime?老版本可能是DateTime。如果編譯報(bào)“無法將 DateTime 轉(zhuǎn)換為 DateTime?”說明你手上的版本比較舊去掉?.就行。4.2 樣式復(fù)用ICellStyle 是共享池不是隨手 new 的樣式是 NPOI 里最容易被寫成性能問題的模塊。工作簿內(nèi)部維護(hù)一個(gè)樣式池你每CreateCellStyle()一次就多占一個(gè)槽位.xls上限大約 4000 個(gè).xlsx大約 64000 個(gè)超了直接拋異常而且文件體積會以肉眼可見的速度膨脹——見過一個(gè)導(dǎo)出的表 800KB 數(shù)據(jù)配 60MB 樣式就是這么來的。正確做法是做個(gè)樣式工廠按 key 緩存public sealed class ExcelStyleFactory { private readonly IWorkbook _wb; private readonly Dictionarystring, ICellStyle _cache new(); public ExcelStyleFactory(IWorkbook wb) _wb wb; public ICellStyle Money(string format #,##0.00) { if (_cache.TryGetValue(format, out var cached)) return cached; var style _wb.CreateCellStyle(); // 每調(diào)一次就占一個(gè)樣式槽 style.DataFormat _wb.CreateDataFormat().GetFormat(format); style.Alignment HorizontalAlignment.Right; style.BorderBottom BorderStyle.Thin; style.VerticalAlignment VerticalAlignment.Center; _cache[format] style; return style; } }CreateDataFormat().GetFormat(#,##0.00)里的格式串跟 Excel 自定義格式語法一致0.00%、yyyy/m/d、#,##0;(#,##0)這些都能直接用格式串本身也是被緩存的同一個(gè)串多次調(diào)用返回同一個(gè)對象。Money方法用格式串當(dāng)緩存 key是因?yàn)橥粋€(gè)工作簿里不同列可能需要不同小數(shù)位用字符串做 key 天然支持多套格式共存。用法上先取一次樣式循環(huán)里反復(fù)賦給不同單元格var styles new ExcelStyleFactory(workbook); var moneyStyle styles.Money(); foreach (var item in rows) { var cell row.CreateCell(2); cell.SetCellValue(item.Amount); cell.CellStyle moneyStyle; // 賦值不是 new }4.3 SXSSF 流式導(dǎo)出十萬行不能再用 XSSF數(shù)據(jù)量上去以后XSSFWorkbook把所有行都留在內(nèi)存里十萬行乘以十幾列堆基本就撐不住了。換成 SXSSFpublic static void WriteLarge(string path, IEnumerableOrderRow rows, int windowSize 500) { // windowSize內(nèi)存里保留的行數(shù)超出的會被刷到磁盤臨時(shí)文件 var workbook new SXSSFWorkbook(windowSize); try { var sheet workbook.CreateSheet(明細(xì)); int r 0; foreach (var item in rows) { var row sheet.CreateRow(r); row.CreateCell(0).SetCellValue(item.OrderNo); row.CreateCell(1).SetCellValue(item.CustomerName); row.CreateCell(2).SetCellValue(item.Amount); // 注意這一行一旦被刷出去后面 GetRow(r) 就取不到了 } using var fs new FileStream(path, FileMode.Create, FileAccess.Write); workbook.Write(fs); fs.Flush(); } finally { workbook.Close(); workbook.Dispose(); // 必須顯式調(diào)用否則臨時(shí)文件會留在系統(tǒng)臨時(shí)目錄 } }windowSize這個(gè)參數(shù)是內(nèi)存和磁盤 IO 的平衡點(diǎn)。設(shè)太小比如 100刷盤頻繁寫十萬行能明顯感覺到慢設(shè)太大比如 5000內(nèi)存優(yōu)勢就沒那么明顯了。我一般按 500 起步實(shí)測導(dǎo)出耗時(shí)偏高再往上調(diào)。Dispose()這一步不能省。SXSSF 在系統(tǒng)臨時(shí)目錄里建的文件只有Dispose才會清理進(jìn)程長時(shí)間跑批又不釋放臨時(shí)目錄遲早被塞滿然后你會收獲一堆“磁盤空間不足”的告警排查半天發(fā)現(xiàn)是自己導(dǎo)出的表。4.4 兩種格式的行為差異能力.xlsHSSF.xlsxXSSF / SXSSF單表最大行655361048576單表最大列25616384單元格樣式上限約 4000約 64000文件本質(zhì)二進(jìn)制復(fù)合文檔zip 包 若干 xml新函數(shù)支持只有老函數(shù)集基本都能用讀入內(nèi)存占用相對低相對高這張表最有用的兩行是行數(shù)上限和樣式上限。行數(shù)超了不會報(bào)錯(cuò)會直接截?cái)嘁话偃f條數(shù)據(jù)導(dǎo)出成.xls最后只剩六萬五而且沒有任何提示——這種 bug 上線之后才被發(fā)現(xiàn)返工成本極高。樣式上限則是另一個(gè)方向.xls到 4000 就拋InvalidOperationException堆棧里看不到你的業(yè)務(wù)代碼只看到 NPOI 內(nèi)部的Workbook.CreateCellStyle。5. 避坑與排查五個(gè)真踩過的問題5.1 日期讀出來是 45000 這樣的整數(shù)現(xiàn)象導(dǎo)入的對賬單里時(shí)間列全是五位數(shù)用戶以為數(shù)據(jù)錯(cuò)了。 原因CellType.Numeric分支直接NumericCellValue.ToString()沒判斷日期格式。日期在 Excel 里本質(zhì)是從 1900-01-01 起算的天數(shù)45000就是某個(gè)真實(shí)日期。 解決取值統(tǒng)一走 4.1 那個(gè)GetCellTextNumeric分支先DateUtil.IsCellDateFormatted(cell)再決定是格式化日期還是原樣輸出數(shù)字。5.2 導(dǎo)出的文件打不開提示“發(fā)現(xiàn)不可讀取的內(nèi)容”現(xiàn)象瀏覽器下載下來的 xlsxExcel 打開報(bào)修復(fù)提示點(diǎn)“是”之后內(nèi)容可能還在也可能丟了。 原因九成是流被提前關(guān)掉或者Position沒歸零。workbook.Write(stream)在某些版本會關(guān)閉傳入的流之后Response.Body再寫就寫不進(jìn)去了另一種是同一個(gè)MemoryStream寫完沒Position 0就直接當(dāng)讀的源用。 解決寫文件的流自己using管好生命周期別依賴庫來關(guān)Web 場景用MemoryStream寫完先ToArray()再輸出讀之前一律stream.Position 0。5.3 大批量導(dǎo)出時(shí)內(nèi)存飆升甚至 OOM現(xiàn)象導(dǎo)五萬行的時(shí)候進(jìn)程內(nèi)存漲到 2G 以上容器直接被 kill。 原因用了XSSFWorkbook所有行和單元格對象都駐留在堆里一個(gè)單元格對象幾十字節(jié)五萬行乘二十列就是一千萬個(gè)對象。 解決換成SXSSFWorkbook窗口設(shè) 500 左右順手檢查一下是不是在循環(huán)里CreateCellStyle那個(gè)也是內(nèi)存大戶。5.4 讀 .xls 報(bào) Invalid header signature現(xiàn)象文件后綴明明是.xlsnew XSSFWorkbook(fs)直接拋異常。 原因一種是用錯(cuò)了實(shí)現(xiàn)類.xls得用 HSSF另一種更陰——某些系統(tǒng)導(dǎo)出的“xls”其實(shí)是 HTML 表格或者 CSV 改了后綴二進(jìn)制頭根本不是 OLE 復(fù)合文檔。 解決讀入口統(tǒng)一用WorkbookFactory.Create(fs)讓庫自己判斷如果工廠也認(rèn)不出來用十六進(jìn)制工具看一眼文件頭D0 CF 11 E0是真的 xlsPK是 xlsxhtml或者table就是偽裝的得先當(dāng)文本解析再轉(zhuǎn)。5.5 單元格樣式莫名不生效現(xiàn)象設(shè)置了邊框和背景色打開文件發(fā)現(xiàn)只有第一行有后面全是白板。 原因ICellStyle是工作簿級別的共享對象但很多人習(xí)慣在循環(huán)里CreateCellStyle()之后只對當(dāng)前單元格賦值同時(shí)又在別處CloneStyleFrom覆蓋了屬性結(jié)果樣式對象被復(fù)用后互相污染。 解決樣式只在工廠里創(chuàng)建一次循環(huán)里只做cell.CellStyle cachedStyle賦值確實(shí)需要“繼承再加一點(diǎn)差異”的用CloneStyleFrom克隆出一個(gè)新對象并單獨(dú)緩存別在原對象上改。6. 二次開發(fā)把示例收成一層能復(fù)用的導(dǎo)入導(dǎo)出示例代碼寫到后面你會發(fā)現(xiàn)每個(gè)業(yè)務(wù)實(shí)體都在重復(fù)“讀表頭 → 找列 → 轉(zhuǎn)類型”這套動作。我一般會加一個(gè)特性加反射的映射層讓業(yè)務(wù)代碼只寫實(shí)體。[AttributeUsage(AttributeTargets.Property)] public sealed class ExcelColumnAttribute : Attribute { public ExcelColumnAttribute(string title) Title title; public string Title { get; } } public sealed class OrderRow { [ExcelColumn(訂單號)] public string OrderNo { get; set; } ; [ExcelColumn(金額)] public decimal Amount { get; set; } [ExcelColumn(下單時(shí)間)] public DateTime CreatedAt { get; set; } }讀取端靠表頭文本反查屬性允許列順序和實(shí)體屬性順序不一致public static ListT ReadT(Stream stream) where T : new() { var map typeof(T).GetProperties() .Select(p (Prop: p, Attr: p.GetCustomAttributeExcelColumnAttribute())) .Where(x x.Attr ! null) .ToDictionary(x x.Attr!.Title, x x.Prop); IWorkbook wb WorkbookFactory.Create(stream); ISheet sheet wb.GetSheetAt(0); IRow header sheet.GetRow(sheet.FirstRowNum); // 表頭文本 - 列索引 var index new Dictionarystring, int(); for (int c 0; c header.LastCellNum; c) { var title ExcelReader.GetCellText(header.GetCell(c)).Trim(); if (!string.IsNullOrEmpty(title) map.ContainsKey(title)) index[title] c; } var list new ListT(); for (int r sheet.FirstRowNum 1; r sheet.LastRowNum; r) { var row sheet.GetRow(r); if (row null) continue; var entity new T(); foreach (var (title, prop) in map) { if (!index.TryGetValue(title, out var c)) continue; var text ExcelReader.GetCellText(row.GetCell(c)); if (string.IsNullOrWhiteSpace(text)) continue; // 可空類型要?jiǎng)円粚覥onvert.ChangeType 不認(rèn) NullableT var target Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType; prop.SetValue(entity, Convert.ChangeType(text, target)); } list.Add(entity); } return list; }改完之后業(yè)務(wù)側(cè)就一行var rows ExcelImporter.ReadOrderRow(stream);字段增減只改實(shí)體上的特性不用碰解析代碼。驗(yàn)證方式我用往返測試不落盤、跑得快[Fact] public void Xlsx_RoundTrip_ShouldKeepAmount() { var ms new MemoryStream(); using (var wb new XSSFWorkbook()) { var sheet wb.CreateSheet(t); var head sheet.CreateRow(0); head.CreateCell(0).SetCellValue(訂單號); head.CreateCell(1).SetCellValue(金額); var data sheet.CreateRow(1); data.CreateCell(0).SetCellValue(SO-1); data.CreateCell(1).SetCellValue(99.5); wb.Write(ms); } ms.Position 0; // 不歸零讀出來就是空的 var rows ExcelImporter.ReadOrderRow(ms); Assert.Single(rows); Assert.Equal(99.5m, rows[0].Amount); }這個(gè)測試我建議再補(bǔ)三個(gè)邊界樣本一個(gè)帶合并單元格的表頭、一個(gè)日期列為空的行、一個(gè)金額列是公式的表。前兩個(gè)驗(yàn)證判空邏輯第三個(gè)驗(yàn)證CachedFormulaResultType分支。這三個(gè)樣本跑通線上八成的導(dǎo)入投訴基本能提前擋掉。從那以后我每次接 Excel 相關(guān)的需求都會先問清三句話讀進(jìn)來的是什么格式、寫出去給誰用、最大多少行然后才動手寫第一行代碼。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久噜久噜| 在线观看婷婷5月| 九九Y精品热播| 丁香五月六月婷婷综合| 热99视频| site:xmssd.com| 一起草AV入口| 天天操夜夜操| 大香蕉婷婷| 日在线V视频在线播放| 欧美激情中文字幕| 中文字幕天天干| 天天狠狠夜夜狠狠2023| 波多野结衣AV无码Porn| 婷婷综合激情| se影音资源在线观看| 日本熟女视频一区二区| www98日本小时间到了| 国产偷人爽久久久久久老妇APP| 百度4399有码精品V在线观看| 成人午夜无码视频| 婷婷综合视频| 丁香 久久| 国产精品噜噜在线视频| 婷婷5月色| 欧美日韩精品一区二区三区钱| 99热这里只有精品4| 拳交大逼| 天天摸天天透天天舔| 婷婷五月色花丁香社区| 丁香婷婷久久| 激情五月天久久丁香| 噜噜五月天综合| 思思热在线观看| 五月综合视频| 狠狠干在线| 久久思思热视频| 26UUU一区二区| 久xxxx| 综合一本道| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 国产精产国品一二三在观看| 99综合视频| 国产97色在线| 欧美日韩成人在线| 五月丁香六月激情| 婷婷成人五月天| 91人妻PORNY九色大屁股| 丁香五月最新地址| 久久久精品人妻| 欧美激情综合色综合啪啪五月| 日日夜夜狠狠操| 亚洲激情网站| 六月丁丁香| 色丁香婷婷| 婷婷深爱五月丁香网| WWW夜夜| 久99热| 超碰激情网| 亚洲无码色色| 成人午夜天| www.99色| 97操碰日本女人| 久久久五月天婷婷成人网| 草了bav视频在线观看| 五月综合久久| 丁香婷婷影院| 色婷五月| 久热最新视频| 无码动漫av| 99啪啪网| 国产69精品久久久久999小说| 精品久久久91久久影视网| 亚洲无AV在线中文字幕| 毛v一区二区视频| 91丨人妻丨国产丨丝袜| 伊人春天av| 另类图片激情五月天| 婷婷成人综合免费视频| 九九99精品视频| 强伦轩人妻一区二区电影| 91热视频色网站| 91狠狠综合久久久| 美国色五月天婷婷资源站| 亚洲色色香蕉| 亚洲第一综合| 超碰精品国产首页| 精品久久人妻热| 思思久热6| 91热视频色网站| 噜噜视频| www.99精品视频| 欧美 日韩 成人 在线| 五月天激情综合网站| 五月婷婷视频啪啪美女| 色五月婷婷操逼| 97香蕉碰碰人妻国产欧美| 九九色网专区| 丰满少妇猛烈A片免费看观看 | 九九热视| 五月大香蕉| 无码字幕中文| 5月色亭亭视频| 婷婷久久草| 五月丁香六月香香蕉| 欧美性猛交AAAA片黑人 | 婷婷草| 欧美丁香婷婷五月| 色播五月天婷婷老师| 可以免费看av网站| 久久精典| caopeng97人人| 77799热| 五月婷婷视频| av五月丁香婷婷网| 婷婷色丁香五月| 中美日韩成人在线| 激情久久肏屄视频| 2021日韩无码| 国产成人99久久亚洲综合精品| 婷婷综合激情| 色婷婷电影网| 小视频久久久aaa| 91操女| 精品视频99看在线视频| 超碰99在线观看| 婷婷五月天久| 五月天天爱| 亚洲成av人影院| 黑人无码一区| 99爱视频| 久久9精品视频| 久久成人天| 噜噜噜久久| 综合色影院| 97色五月天| 狠狠草在线观看| www.九月婷婷丁香.com| 丁香五月天激情网| 五月天久久小说| 这里只有视频精品| 五月丁香六月激情综合| 婷婷六月天精品| 99精品无码| 亚洲AV人人操| 激情五月天影院| 六月婷婷av| nvrentiantang av| 狼人狠狠操| 夜夜操夜夜操| 五月天综合激情网| 99热这里只有精品3| 六月婷婷综合| 99在线免费视频| 丁香五月婷婷啪| 婷婷色五月丁香六月欧美啪| 亚洲性图一区二区三区| 国产无套精品一区二区| 思思热99在线视频| 欧美色宗和激情| 淫视馆AV在线| 色婷婷成人在线| 五月综合激情| 久播影院免费观看电视剧大全最新网| 99超碰在线免费| 五月丁香在线综合| 大香蕉天堂| 99啪啪视频| 日本久久网| 丁香五月电影| 色射婷婷五月天| 国产精品久久久久9999小说| 人人干人人操人人摸| 伊人激情网| 天天狠狠干| 日本97久久久精品| 五月天激情小说网| 26uuu亚洲欧美日本| 9色免费网| 中文久久婷婷| 伊人超碰| 久久婷视频| 玖玖综合色| 99这里只有精品视频免费| 婷婷综合五月| 国产视频婷婷| 五月天婷婷网站| www.第四色99| 久久九九热视频| 色婷婷六月综合| 激情五月瑟瑟| 色婷视频| 五月丁香久| 天天爽夜夜爽夜夜爽精品| 丁香五月婷婷图片综合| 精品久久99| 色综合久久88色综合天天人守婷| 黄色成人网站在线播放| 婷婷色情 | 婷婷六月激情综合| 天天婷婷天天| 激情床戏| 精品九九婷婷| 婷婷色色亚洲| 天天色粽合合合合合合合| 99热只有国产在线精品| 69精品人人人人| 99热在线观看| 六月色婷婷| 思思热精品在线观看| 99热亚洲| 丁香六月综合激| 99热这里有精品| 婷婷丁香激情五月天色色| 伊人五月婷婷| 91操在线观看| 色都都狠狠色都都色综合色| 大地9中文在线观看免费高清| 激情五月六月| 热热久久99| 激情六月下句是什么| 婷婷五月丁香激情图片| 久99久视频精品| 丁香婷婷性爱| 九热精品| 亚洲六月色婷婷| 婷婷五月天成人基地| 97天堂| 激情婷婷五月天丁香| 亚洲人人操| 人人97碰| 色色激情五月| 五月丁香激情婷婷| 天天综合色| 婷婷综合五月色播| http://www.lingjunshare.com/ | 精品思思久久| 五月天天堂久久| 抽插特写| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 五月婷婷婷婷婷| 欧美成人热| 久久综合综合久久| 欧亚洲在线高清视频| 亚洲成片在线观看| 97九色视频| www.婷婷五月天,com| 丰满人妻妇伦又伦精品国产| 日本色婷婷| 日日色综合| 99久久久久久www| 丁香成人视频| 激情六月婷婷| 97色色色| 伊人在线视频| 婷婷五月精品| 超色欲天天| 久久3级片| 黄色激情网站在线观看| 日本一级大片| 国产成人AV在线播放| 色色色色色色色色色色色色色五月天| 亚洲激情五月| 九九综合伊人| 五月天开心激情网色欲无码| 色色色色色色色色色999| 综合激情开心五月| 久久久五月婷婷| 色射婷婷五月天| 日日爽天天| 丁香五月婷婷骚视屏| 91大屁股| 婷婷综合成人| 九九这里有精品| 性综合网| 国产精品成人网址| 精品成人在线观看| 婷婷五月天色网久| 丁香五月婷婷影院| 九九色精品| 婷婷天堂站| 中文人妻AV久久人妻18| 色五月婷婷、老熟女| 黄色99网| 亚洲人成色A777777在线观看| 99ri精品在线| 国产成人一区二区三区在线观看| 97碰碰草| 五月丁香91| 九九视频在线观看视频6 | www超碰| 国产AV一区二区三区最新精品| 色五月婷婷7777| 色婷婷色综合| 久久久久久天天日天天爱| 精品无码色| 婷婷娱乐丁香综合网| 天天干夜夜想| 色五月丁香婷婷综合| 色综合久久88色综合中文字幕| 亚洲AV色婷婷人禽五月天| jiZZdr| 色欲色香综合网| 熟妇内谢69XXXXXA片| 丁香婷婷久久五月天| 色五月超碰| 第二色AⅤ| 亚洲婷婷免费| 高清一区二区三区日本久| yirenjiqingshiping| 日本操碰碰| 成人小说 五月天 婷婷| YJLZZJLZZ亚洲乱熟无码| 狠狠色婷婷| 超碰啪啪网| 在线国产精品色| 99免费视频网| 国产乱子轮XXX农村| 大香蕉七区| 26uu| 色区久久| 婷婷在线视频| 91九色国产在线| 天天干在线播放| 丁香激情网| 思思热在线播放| 九九aV| 久人操| 五月噜噜| 无码人妻精品一区二区蜜桃色欲| 五月天社区| 天天色综网| 黄桃AV无码免费一区二区三区| 99精品久久久久| 激情久久综合网| 天天天干夜夜夜操| 天天摸天天肏| 久久网日本| www.色欲丁香婷婷| 婷婷五月天电影在线| 另类小说色婷婷| enecarbon-materials.com污K127封锁请涟系@wip1688 | 99色网站| 性视频久久| 色丁香影院| 99ER热精品视频| 九九综合久久| 伊人五月天在线| 99综合熟女| 欧美人妻一区二区| 国产小网站| 天天爽天天日天天舔| 中文字幕无码人妻少妇免费视频| 丁香五月婷婷六月婷| 亚洲久久激情| 丁香五月天天| 激情婷婷五月天| 激情综合网五月婷婷| 综合成人小说婷婷| 中文字幕九九九九| 色综合激情| 婷婷的久久网站| 91avse| 台湾无码A片一区二区| 亚洲视频色婷婷| 1024在线视频| 激情五月婷婷视频一区二区三区| 大香蕉操操| 久热69| 五月丁香黄色| 久久九九热视频| 五月婷婷干干干| 99热97| 狠狠操.com| 亚洲操操| 五月丁香天堂网| 亚洲色五月婷婷| 丁香六月婷婷久久综合| 欧亚洲在线高清视频| 五月丁香影视| 婷婷丁香五月天在线| 婷婷丁香六月天激情四射网| 极品另类| 在线,国产,色,热视频| 国产XXXX搡XXXXX搡麻豆| 五月伊人视频在线看| 免费视频1区| 五月天成人网在线观看| 婷婷丁五月| 无码AV久久久久久久久| 偷偷操99| 婷婷激情五月综合| 26uuu精品国产| 综合久久97| 天天爽天天爽| 国产无套精品一区二区| 色婷婷基地| 精品国产乱码久久久久久免费| 婷婷四色成人综合色视| 99福利导航| 99这里只有精品| www.夜夜.com| 婷婷色亚洲| 久热在线中文字幕色999舞| 99亚洲无码| 九九热10| 色色9 9| 中文字幕婷婷| 丁香5月婷婷| 九九香蕉网| 婷婷在线五月综合| 国产一级片| 青草热视频这里只有精品| 9久久久| 激情五月天社区| 欧美VA在线观看| 久草 天堂| 久久XX日本综合| 色婷五月| 久热黄色| 国产精品黑丝| 狠狠CAO日日穞夜夜穞AV| 亚洲人成色A777777在线观看| www。88热在线视频免费观看| 大香蕉视频婷| 色色色色欧美| 噜噜噜狠狠色综合| 色色婷婷五月| 久久色五月天| 思思热精品在线视频| 如何安全看伊人婷婷| 五月丁香日逼| 噢美99| 九九成人视频| 99免费热视频在线| 亚洲国产成人在线| 中文字幕成人影视| 极品人妻VideOssS人妻| 五月丁香激情婷婷| 丁香五月五月婷婷五月天激情四射| 婷婷激情伍月网| 成人在线日韩欧美| 色综合色色色色| 欧美五月婷婷综合| 婷婷五月天天| 超碰国产在线播放| 字幕网AV中文字幕| 亚洲情综合五月天| 国外亚洲成AV人片在线观看| 99在线观看精品视频| 久婷久婷| 色狠狠999综合| 婷婷六月久久综合导航| 丁香五月婷中字幕| 色五月婷婷很很操| 丁香九月婷| 久热re在线视频| 丁香婷婷影院| 色综合久久无码| 五月久久丁香| 中文字幕欧美精品久久| 久久婷婷六月综合综合| 六月丁香激情| 色热久| 色狠狠综合网| 九九黄色网| 亚洲精品亚洲人成人网| 这里只有精品免费在线视频| 丁香五月婷婷性爱| 久久五月婷综合网| 亚城区在线| 色色哒五月婷婷六月丁香| 亚洲色vA| www.婷婷五月天.com| 99成人免费热视频| 激情五月综合网| 天天干天天干天天干| 婷婷五月天综合在线 | 91九色在线| 开心激情站| 欧美大肥婆大肥BBBBB| 99激情视频| 成人做爰高潮A片免费视频| 国产精产国品一二三在观看| 日本在线观看99| 精品国婬伦V无码久久久| 五月丁香A片| 大胆伊人久久| 色色综合无码| 激情性五月天免费小说视频| 五月天激情综合| 丁香五月婷婷啪| 能看的av| 大香蕉网 久久| 婷婷久久婷婷| 狠狠综合| 77777亚洲午夜久久| 日本天堂免费99| 亚洲视频五区| 久久这里99| 天天插天天插天天插天天插| 香蕉久久国产AV一区二区| 啪啪啪综合网| 婷婷久久18| 超碰av在线| 亚洲五月天综合| 五月婷婷激情久久| 色综合久久88色综合中文字幕| 五月丁香婷婷三级| 99色婷婷视频| 99精日本久久| 伊人婷婷青青cao| sewuyuejiqingwang| 饮料下药迷倒漂亮女同事强干| 二色AV| 中国女人内射6XXXXX| 99热高清在线| 亚洲尤物在线| 婷婷综合激情| 熟美女麻豆| 久久婷婷丁香五月一二三| 日韩肏屄网| 91色逼| 夜夜做天天爽| 久久99网站| 亚洲综合五月天婷婷| 超碰无码318604| 色综合久久久无码中文字幕999| 人人插9| 六月婷婷七月丁香| 狠狠干狠狠干| 亚洲另类婷婷综合| www五月| 国产肥白大熟妇BBBB视频| 色九月婷婷丁香| 色五月天在线| 极品少妇XXXX精品少妇偷拍| 日良久久| 熟女网站久久| 9久9久| 伍月婷丁香花全集| 校花娇喘呻吟校长陈若雪视频| 六月久久婷婷| 五月天激情网站| 91久女| 亚洲人人96@| 99操久久| 超碰9| 久热这里只有| 99资源在线| 永久地址 色| 国产精产国品一二三在观看| 婷婷色五月婷婷姐妹| 九九热中文| 另类激情综合| 婷婷九月在线| 九九热精品| 啪啪色激情五月天| 五月激情婷婷女| 成人在线二区| 天天操天爱综合| 午夜成人片400| 五月天六月丁香| 久碰视频| 梁铮版蜘蛛女在线观看| 九九婷婷网五月天| 欧洲激情网站| 天天爽人人综合免费7799| 五月婷婷色色| 九色视频91| 天天婷婷综合| 熟女人妻一区二区三区免费看| 插插插丁香五月婷婷| 噜噜视频| 色青青五月| 亚洲精品久久久久久久久久飞鱼| 婷婷激情五月天亚洲综合| 欧美S码亚洲码精品M码| 婷婷五月婷婷五月天| 9久久狠狠的| 天天色天天爱天天爽| 极骚大香蕉伊人| www夜夜操comwww| 在线超碰精品| 九九亚洲视频| 99色在线| 精品国产va久久久| 色色色色区| 丁香色综合| 操操操操操操婷婷五月天| 午夜一区| 久久婷婷五月天激情唯美| 亚洲天堂AV综合网| 大香蕉婷婷五月| 色婷婷五月天激情| 狠狠干.com| 久久视频这里有精品99| 99九九在线观看免费| 99热这里只有精品16| 琪琪秋霞| 欧美日韩中国| 综合色图区| 俺去也在线视频| 日本三级毛片| 丁香五月婷婷基地| 久久久这里有精品| 99亚色色色| 九月丁香婷婷基地| 婷婷九月综合| 久久精品永久免费| 性色婷婷| 丁香五月婷婷国产av| 涩婷婷五月天在线精品视频| 婷婷色五月噜噜| 伊人九九九久| 色五月婷婷五月天| 五月天 无码| 婷婷五月天成人五月天| 爆乳熟女-区二区三区| 色情五月丁香| 日日狠狠久久偷偷四色综合免费| 免费亚洲婷婷中文字幕| 婷婷狠狠青青| 丁香五月天社区| 丁香婷婷基地| 五月色婷婷AV| 99在线精品观看99| 婷婷五月六月| 成人免费黄色短视频| 操日视频| 人人爽欧美婷婷久久久五月丁香| 丁香六月婷婷缴情欧美| 五月天婷综合| 七七色综合| 色五月综合网| 亚洲五月婷| va婷婷| 色小说婷婷五月天天天| 久久综合干| 色婷婷亚洲综合天堂| 久久婷婷五月综合| 亚洲六月色婷婷| 色色色色色网站| 久久九九免费大视频| 91色在线| 人人看人人97| 久久99久久99www| 性av| av九九| 五月婷婷基地| 曰曰久久| 91日视频| 中文AV在线观看| 无码人妻一区| 婷婷丁香五月亚洲免费| 99在线国| 99综合99| 五月丁香在线婷婷蜜桃| 成年AAAA色情| 久er7久热| 99免费视频久久| 色色激情网| 五月婷婷深深爱| 欧美在线视频9| 国产探花一片区| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 999久久久国产精品| 狠狠狠夜夜夜| 成人视频婷婷| 丁香婷婷五月| 类似婷婷激情综合网站| 婷婷 丁香 精品| 爱草人视频| 夜夜干 夜夜操| 五月天狠狠网| 天天干天天插| 超碰九九热| 武则天精品久久| 丁香五月婷婷激情网| 婷婷五月色综合| 99ri在线观看视频| 婷婷五月天无码熟女| 欧美日本综合网| 狠狠干天天内射| 丁香五月 综合| 五月色丁香综合| 亚洲爱爱无码婷婷色五月| 色综合久久伊伊婷婷五月| 九九热在线视频,| 五月丁香六月综合激情网| 亚洲第一色区| 九月色婷婷综合| 色~性~乱~伦~噜| 天天精品视频免费观看| 国产亚洲精品AAAAAAA片| 国产精品天天狠天天看| 九九综合网| 1区2区视频| 综合亚洲六月婷婷在线| 日日天天操| 久热这里只有精品在线| 色婷婷丁香五月| 伊人婷婷五月天| 桃色五月天| 97婷婷五月丁香| 色色婷婷丁香五月天| 色五月首页| 五月天婷婷六月| 人人爱国产| 91人人操人人| 91蝌蚪窝视频在线| 婷婷趴趴| 情五月亚洲婷婷| 天天爽天天摸天天爱| 久久久久激情| 丁香六月在线综合| 久久总和99| 丁香五月天婷婷久久综合| 国产午夜精品久久久观看| 色婷| 久草x色在线观看99| 九月婷婷色色| 夜夜操夜夜姧| 9久久久久久久久久久| 欧美成人一区二区三区在线视频| 五月婷婷六月丁香玖玖玫瑰91| 66精品国产成人| 色色COm| 天天干天天干天天干天天干天天干| 日韩国产在线精品| 超碰人人操人人干| 99久久玖玖| 色五月婷婷网| 色噜噜五月天| 国产精品A片| 99re8这里只有精品99re8热视频| 婷婷色网址| 密黄站| 97碰碰在线观看视频| 欧美成人猛片AAAAAAA| 久99视频在线观看| 开心色五月天久久久久久久| 99精品热| 99在线热| 五月天 婷 欧美亚洲| 亚洲综合五月天婷婷| 99久热这里只有精品视频删减版| 色五婷婷在线视频| 国产99久| 啪啪啪啪五月天| 天天天天天日| 97资源碰碰在线| 色吧五月婷婷| 欧美 色婷婷| 九九热视频首页/这里只有精品| 一区二区乱码视频| 天堂网色色| 久久九九在线视频| 另类在线免费视频| www。88热在线视频免费观看| 久久99久久99精品免观看粉嫩| 丁香婷婷五月天成人| 色五月激情综合| 久9视频| 超碰在线人妻| 天天肏视频| 日韩AV在线免费观看| 狠狠xx| 丁香婷婷浪潮AV久久综合| 日本特黄aaaaa| 国产精产国品一二三在观看| 99视频色在线观看| 久久五月天婷婷| 婷婷五月天影院| 色~性~乱~伦~噜| 人人综合久| 999激情视频| 午夜爱爱网站| 爽极品色| 91在线日| 色偷偷综合| 丁香五月花婷婷开心| 久久九九色| 五月天天丁香婷婷在线中| 99久热| 久久99综合| 99热综合网| 欧美va精品va老师va| 久99久视频| 久久99热这里| 婷婷香蕉精品| 成人丁香婷婷| 五月天色色婷婷| 激情色色| 色色色在线播放| 国产无遮挡又黄又爽免费网站| 六月婷婷七月丁香| 九月婷婷综合色干| 丁香五月影院| 久久九九99| 国产精品久久久久久久久久久久| 五月丁香五月天现场视频| 综合另类激情| 久9免费视频| 99久久亚洲精品视频| JAPANRCEP老熟妇乱子伦视频| 情情五月天色| 婷婷色六月| 人人操AV| 丁香五月综合图片在线观看| 人妻在线观看视频| 丁香五月激情综合| 婷婷第六色| 五月天丁香久久综合| 色色a| 99热国产精品| 日本乱子人伦在线视频| 色导航色婷婷五月天在线观看| 久久久久久99精品无码| 99久久网站| 天天天天爽爽天干| 91婷婷在线| 99噜噜噜在线播放| 影音先锋91资源站| 天天插综合在线| 亚洲色频| 亚洲国产精品VA在线看黑人| 亚洲激情五月丁香久久久久| 2016日日夜夜操| 伊人综合网站| 天天干天天爽| 就爱干 在线| 国产色网站| 熟女少妇内射日韩亚洲| 天堂久久性| 久久伊人日日夜夜| 亚洲熟女乱色综合亚洲网站| 六月天婷婷| www.狠狠| 99在线视频精品| 丁香五月婷婷亚洲综合精品| 4438亚洲欧美| 超碰免费人人| 色婷婷社区| 激情文学天天| 在线观看996精品| 亚洲狠狠色丁香婷婷综合久久| 婷婷午夜激情| 日韩在线婷婷五月天综合| 玖玖色综合| 五月五月婷婷| 成人五月丁香花| 另类激情中文| 99啪啪网| 午夜丁香五月天综合| 色综合色婷婷色伊人| 九九综合网色全集| 99久99久| 天天插天天射| 欧美性爱五月天| 日本婷婷色日| 日日狠夜夜狠| 婷婷深爱五月天在线| 99热这里都是精品| 婷婷激情五月视频| 亚洲无码影音| 五月天伊人| 91九九| 国产精品色婷婷99久久精品| 狠狠色噜噜色狠狠狠综合久久成人波 | 这里只有精品96| 一本色道久久综合狠狠躁小说| 日本婷婷在线| 激情六月色| 久久这里只| 天天操夜夜肏| 丝雨一区二区| 无码日本精品XXXXXXXXX| 丁香五月婷婷色| 婷婷综合视频| 激情 婷婷| 夜夜谢天天干| 婷婷天天婷婷天天澡| 另类激情五月| 丁香六月爱综合| 色婷婷五月天激情综合| 丁香六月色情| 六月丁香婷婷天堂| 婷婷色系婷色| 欧美丁香六月激情视频| 五月天色综合服务平台| 五月婷婷久久激情 | 五月婷婷五月天| 久热只有精品| 色婷婷狠狠18禁| 欧美综合丁香网| 亚洲性爱99| 国产视频久色| 婷婷舔| 97色伦另类图片小说视频 | 再綫Av免费視品| 超黄亚洲瑟瑟网站| henhencao国产在线| 亚洲舔观看| www.五月婷婷久久.com| 久久人妻情侣| 激情五月婷婷综合色播小说| 国产婷婷五月天| 日韩爱操视频| 99热成人精品网站| 丁香激情久久| 久热九九| 丁香五月天堂婷婷| 久久日曰| 色婷婷免费观看| 亭亭丁香aV| 五月婷婷之六月丁香| 久久久精品人妻录| 激情五月天小说网| 超碰亚洲天堂| 亚洲精品又粗又大又爽A片| 丁香五月五月婷婷欧美大香蕉| 久草丁香婷婷1024| 久久人五月| 五月丁香久久综合| 五月丁香六月激情综合啪啪| 五月婷在线视频免费播放| 色婷久九| 亚洲综合网区| 婷婷激情5月| 思思热在线观看| 色五月婷婷综合| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 精品色色色| 丁香婷婷色| 色五月综合| 丁香伊人五月色婷婷五十路| 激情综合五月天| 亚洲精品国产A久久久久久| 色黄啪啪| 色色激情五月天| 色丁香五月综合网| 久99视频在线观看| 无码少妇高潮喷水A片免费 | 99热这里只有精品2016| 色色色99| 色玖玖| 久久天堂婷婷五月| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 9久9久| 亚洲色色爱| 思思热在线视频精品| 丁香五月婷久久| 五月丁香久久综合91| 激情六月婷婷| 特级片神马电影| 99久久综合网| 伊人大香蕉爱聚| 91精品婷婷国产综合久久| 丁香五月天婷婷中文| 97视频91| 免费观看日韩成人av| 激情五月黄色小说| 日本狠狠干| 性欧美大战久久久久久久83| 激情综合国产| 亚洲免费99| 婷婷欧美| 久久婷婷五月综合精品蜜芽| 婷婷五月深深爱| 色色操| 日本一级特黄大片AAAAA级| 麻豆五月丁香婷婷| 五月丁香六月激情综合| 91久久电影| 色5月婷婷| 人妻久久久| 婷婷色播婷婷| 99热99极品观看| 99热在线极品极品| 国产日韩欧美性生活| www.婷婷亚洲基地| 9精品一区| 久久婷婷亚洲五月天| 色九区| 啪啪啪大香蕉| 超碰免费人人| 超碰在线超碰| 91xxxx九色| 99热这里只有精品最新地址获取| 婷婷丁香熟妇综合网| 六月婷婷激情| 性天堂久久| 奇米网大香蕉| 五月婷婷开心综合| 成人网在线观看视频| 久久成人性爱| 激情久久久| 激情五月天黄色小说| 亚洲中文字幕网| 91色逼| 国产无人区大片| 综合九九久久| 亚洲国产99| aaa9区免费在线观看| 色小说五月天| 五月天大香蕉AV| 欧美色色网| 大香婷婷| 免费亚洲婷婷| 韩国19 主播内部福利vip免费播放| 五月天激情小说欧美激情| 91伦| 五月婷婷香| 男人的天堂97| 九九热精品在线| 日韩精品超碰在线观看| 色婷婷久久| 激情爱爱网站| 中文字幕AV在线| 五月天婷婷激情网| 激情色色| 啪啪五月天啪啪| 狠狠色 综合色区| 99.色| 爆乳熟女-区二区三区| www.99热视频| 视频一二区| 99自拍视频| 99这里只有精品国产| 常久最新免费的色吊丝| 成人va在线| 在线成人视频免费| 日本久热| www.zbzhongsen.com| 爱草视频在线| 五月天婷婷色综合| 激情丁香五月天| 五月丁香六月成人| 99色在线视频| 开心五月深爱五月婷| Av免费网站在线| 丁香五月综合激情性爱| 新97人人上人人| 狠狠干,狠狠操| 五月天另类小说久久小说网| 亚洲免费电影2| 色婷婷亚洲| 久久久er热| 奇米四色五月天| 亚洲成人AV在线播放| aaaaaa片| 伊人激情网| 99自拍网| 欧美久久五月婷婷| 偷偷操九九| 超碰人妻在线| 婷婷深爱网| 一月婷婷色色| 欧美日韩精品人妻狠狠躁免费视频| 开心五月深爱婷婷| 婷婷五月色情天| 久久精品A片777777| 五月婷婷啪啪| 天天爽天天日人人爱 | 五月天婷婷小说| 日韩免费乱轮网站| 久久ri精品视频| 五月天综合视频| 五月天婷婷永久免费视频| 91久久综合亚洲噜噜成人在线| 久操热线| 五月天激情小说网| 婷婷丁香六月激情综合| 国产黄色一级片| 最近中文字幕2019视频1| 99精品网| 五月五丁香婷婷| 97碰久久| 99精品综合在线| 欧洲色色| 五月天婷婷激情| 天天综合亚洲综合| 精品久久99码| 综合精品99| 午夜成人片400| 国产成人av在线播放| 五月丁香激情深爱婷婷| 欧美色图45678| 久久色吧| 密着浓厚中出乚交尾GvG935| 久久伊人大香蕉| 五月丁香六月婷婷姐| 欧美综合丁香网| 激情AV| 久久99精品久久久| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | www.婷婷五月天.com| 久久99草五月婷婷| 熟妇人妻中文字幕无码老熟妇| 久久大香蕉同僚| 欧美激情综合色综合| 国产AV熟妇人震精品一品二区| 生活片五区| 99热综合网| 五月婷婷说| 国产精品色色色色| 99rewww| 成人视频一区| 婷婷综合亚洲| 99久久精彩视频| YW无码| 琪琪色五月婷婷老师| 欧美成人精品三区综合A片| 色婷婷狠狠爱| 丁香婷婷色| 思思热在线视频精品| 色狠狠综合入口| 五月丁香激情在线| 啪啪啪五月天| 婷婷五月俺要去| 久久婷婷成人视频| 丁香五月婷婷狠狠色| 亚洲、欧美、国产另类笫二区| 好色婷婷| 99久久99视频| 五月丁香婷婷综合视频| 日本三级网址| 亚洲激情五月| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 五月天综合| 96色婷婷| 97人人操人人拍| 欧美日本国产| 综合久久狠狠| 九月丁香网婷婷| 激情五月成年| 亚洲三A| 精品夜夜澡人妻无码AV| 91狠狠综合久久久久久| 91九色精品熟女内射| 性爱久久| 亚洲天堂99| 福利视频在线播放| 久久精品A片777777| 九九色情网站| 1024AV视频| 肏日网在线看| 日91高清无玛| 五月天婷婷色色网| 丁香六月啪啪啪| 天天日天天添| 五月丁香婷婷无码A∨| 我爱宗和色| 色婷婷视频综合| 网站免费一站二站| 97人人做| 性爱久久| 久久曰9| 在线观看亚洲视频影院| www婷婷色| 爱iii做iiii日日| 在线看黄色| 伊人久久综合| 久久五月丁香伊人青草| www久久久| 综合狠狠五月婷婷| 天堂草在线观| 成人在线视频一区| 99性视频| 婷婷色五月91啪啪| 日韩无码91| 色狠狠综合| 丁香五月婷婷激情123| 日本社区五月天激情| 99精品久久久久| 夜夜撸日日操| 五月做爱| 97人人操在线| 我爱宗和色| 丁香六月天| 亚洲五月天激情| 五月激情久久| 婷婷在线免费| 激情九九这里只有精品| www,com,五月色色| 五月丁香综合网| 五月婷av| 热的国产99热| 玖玖精品视频| 99热都是精品| 色综合中文综合网| 91viP在线看| 人人看人人摸人人| 97人人干人人操| 欧美槡BBBB槡BBB少妇| 91日韩美女被插视频| 青青操avbb| 激情五月婷婷视频一区二区三区| 99热| 亚洲第二AV| 婷婷爱综合| 久久婷婷五月天激情四射| 亚洲视频一区| 国产精品色婷婷99久久精品| 337p午夜影院| 色99在线观看| 以及AA大片看看| 激情综合自拍五月婷婷色五月| 色吧五月婷婷| 中国女人做爰A片| 色婷婷色情| 亚洲情a| 97碰在线视频| 色婷婷先锋| 日韩十国产极品久久| 久久这里只有精品热在99| 久婷自拍视频| 婷婷免费无视频| 99精在线| 超碰99热精品| A久网| 国产偷人爽久久久久久老妇APP| 五月丁香激情四射| 五月天天天色| 蜜桃婷婷丁香综合久久开心亚洲| 91操碰| 9l视频自拍9l九色9l成人| 有码一区二区三区| 美女要搞搞天天搞搞搞网站| 亚洲成人综合在线| 九九热婷婷| 开心激情播播五月天| 青青久在线视频免费观看| 婷婷五月在线免费| www.日韩国产| 97人人看一| 啪到高潮激情丁香五月| 成人在线二区| 久久99热这里只有精品23| 亚洲色久| 成人五月天丁香| 丁香五月天狠狠| 色99超碰| 婷婷五月天激情基地| 久久视9精| 激情五月天网页| 无码AV免费精品一区二区三区| 99这里有精品久久97| 综合色色网| www.婷婷亚洲基地| 五月丁香欧美综合| 99热热这里只精品996小说| 天天爱天天做天天| 1囯产午夜仑鲁鲁| 噜噜网免费视频| 天色色综合网| 思思热精品在线视频| 久久久五月天婷婷成人网| 久久色五月天综合网| 久久性都花花世界成人免费视频| 丁香五月婷婷亚洲另类| 免费无码毛片一区二区A片| 五月丁香六月婷婷免费视频| 影音先锋男人女人| 思思热再线视频|