亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

C# OpenXml 操作 Word 表格:從基礎(chǔ)結(jié)構(gòu)到樣式合并的完整指南

C# OpenXml 操作 Word 表格:從基礎(chǔ)結(jié)構(gòu)到樣式合并的完整指南 簡介面向需要在C#程序中自動化生成Word報表的.NET開發(fā)者這份PDF演示了如何借助OpenXml SDK為Word文檔添加表格。內(nèi)容從引入DocumentFormat.OpenXml命名空間開始逐步講解AddTable方法的封裝、TableGrid列數(shù)定義、表格邊框樣式設(shè)置以及表頭和數(shù)據(jù)行的循環(huán)創(chuàng)建邏輯并配有可直接運行的示例代碼和運行效果便于遷移到批量生成、數(shù)據(jù)導(dǎo)出等實際場景。資源共1個PDF文件大小121KB目前已有326人學(xué)習(xí)下載適合具備基礎(chǔ)C#語法、希望以輕量方式操作Word文檔的讀者快速查閱。1. C# 用 OpenXml 給 Word 加表格為什么我不再碰 COM 自動化實際做報表導(dǎo)出的人多半經(jīng)歷過這種場景程序需要往 Word 文檔里插入一張表格數(shù)據(jù)量不大但要求格式規(guī)整、邊框齊全。常見做法是直接調(diào) COM 自動化控制 Word 進程開發(fā)機上跑得很好一旦部署到?jīng)]裝 Office 的服務(wù)器上就各種罷工。換成開源的 OpenXml SDK 后直接操作 docx 底層的 XML 結(jié)構(gòu)不依賴 Office批量生成帶表格的 Word 文檔變得干凈可控。這篇文章圍繞一個具體需求展開用 C# 的 OpenXml 給 Word 文檔添加表格覆蓋表頭、數(shù)據(jù)行、邊框、單元格樣式和最常見的坑。適合用 .NET 做報告生成、合同填充、批量導(dǎo)出功能的開發(fā)者尤其是需要在 Windows 服務(wù)里跑批處理的場景。2. 先摸清 Word 表格的 XML 骨架再寫第一段可運行代碼在寫第一行代碼之前建議花十分鐘把 OpenXml 的 Word 文檔模型過一遍。很多人直接抄一份代碼就改結(jié)果要么列寬失效要么表格插不進正文最后繞回來補基礎(chǔ)反而更慢。這一章的思路是從打開文檔的方式講起再看 Table 的層級最后給出一段能直接跑通的最小代碼。2.1 WordprocessingDocument 打開文檔的三種方式別只會 Open(path, true)OpenXml SDK 的操作入口是WordprocessingDocument它指向的是一個 .docx 包很多人把它當(dāng)普通文件流用結(jié)果在生命周期管理上翻車。最常見的打開方式有三個。第一種打開已經(jīng)存在的文檔并允許修改using (WordprocessingDocument doc WordprocessingDocument.Open(Test.docx, true)) { // 這里可以增刪改 }第二個參數(shù)isEditable必須傳 true如果只傳路徑不傳這個參數(shù)默認是只讀。只讀模式不會立刻報錯但之后的Append、Add操作都會靜默失敗保存后一切變動都丟了。這是新手最容易迷惑的地方不報錯卻等于白寫。第二種新建一個空白文檔。Open方法要求文件真實存在否則拋FileNotFoundException。正確做法是用Createusing (WordprocessingDocument doc WordprocessingDocument.Create(NewDoc.docx, WordprocessingDocumentType.Document)) { MainDocumentPart mainPart doc.AddMainDocumentPart(); mainPart.Document new Document(new Body()); }這段代碼有兩個點不能省AddMainDocumentPart()負責(zé)創(chuàng)建文檔主部件Document new Document(new Body())負責(zé)在包內(nèi)生成空的正文結(jié)構(gòu)。少一句后面訪問doc.MainDocumentPart.Document.Body就會得到 null 引用。第三種從流打開。常用于把模板讀進MemoryStream再傳給Open(stream, true)避免臨時文件落盤。這時要注意流的所有權(quán)doc.Dispose()時也會關(guān)閉流后續(xù)如果還要用這個流得自己重新創(chuàng)建。批處理時如果同時操作多個文件用流方式可以避免很多文件句柄問題。using是這個場景的硬性要求。OpenXml 包在Dispose時才把未保存的內(nèi)容寫回文件如果不Dispose要么文件一直被占用要么改動直接丟失。我見過不止一個人因為少寫using排查到半夜最后發(fā)現(xiàn)是 Word 進程把 docx 鎖住了。2.2 Table 的層級Table、TableGrid、TableRow、TableCell、ParagraphWord 表格在 OpenXml 里的結(jié)構(gòu)不是簡單的二維數(shù)組而是一個嵌套樹。一個正常的表格從上到下大致是這個形狀Table ├── TableGrid │ └── TableGridColumn ├── TableProperties ├── TableRow │ └── TableCell │ └── Paragraph │ └── Run │ └── TextTableGrid定義表格一共有多少列以及每列的寬度。TableGridColumn的Width屬性單位是 twips1 厘米約等于 567 twips做導(dǎo)出的同學(xué)按這個比例換就行。TableRow是行TableCell是單元格單元格不能直接放字符串必須先有Paragraph再在Paragraph里放Run最后在Run里放Text。這個嵌套順序是 Word 渲染的基本要求缺一層都會導(dǎo)致文檔結(jié)構(gòu)不完整。理解了層級再回頭看原示例代碼里的grid.Append(new TableGrid())就能發(fā)現(xiàn)問題應(yīng)該追加的是TableGridColumn而不是又一個TableGrid同時grid也需要由table.Append(grid)掛到 Table 上。原示例里 grid 創(chuàng)建之后沒有真正進入 Table列定義等于無效。這種問題 SDK 不會報錯但 Word 打開時列寬會全部按照內(nèi)容自動分配。這里還要糾正一個隱藏得更深的錯誤原示例在插入表格時用了new Paragraph(new Run(table))。Table是不能被塞進Run里的它必須直接作為 Body 或容器的子元素。這種寫法的本意可能是想給表格包一層段落但 OpenXml 沒有這種構(gòu)造方式。正確做法是直接body.Append(table)表格本身已經(jīng)是一個獨立的塊級元素。2.3 最小可運行示例從空白文檔到三列表格把前面幾個要素串起來最小可運行代碼是下面這樣using System; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; public static void CreateSimpleTable(string filePath) { using (WordprocessingDocument doc WordprocessingDocument.Create(filePath, WordprocessingDocumentType.Document)) { MainDocumentPart mainPart doc.AddMainDocumentPart(); mainPart.Document new Document(new Body()); Table table new Table(); // 1. 定義兩列每列寬度 2000 twips TableGrid grid new TableGrid(); grid.Append(new TableGridColumn() { Width 2000 }); grid.Append(new TableGridColumn() { Width 2000 }); table.Append(grid); // 2. 第一行兩個單元格 TableRow row new TableRow(); row.Append(CreateCell(A)); row.Append(CreateCell(B)); table.Append(row); mainPart.Document.Body.Append(table); } } private static TableCell CreateCell(string text) { TableCell cell new TableCell(); Paragraph paragraph new Paragraph(); Run run new Run(); run.Append(new Text(text)); paragraph.Append(run); cell.Append(paragraph); return cell; }這段代碼的邏輯很直接先創(chuàng)建Table把TableGrid掛進去定義列寬然后一行行構(gòu)建單元格最后把表格掛到Body末尾。CreateCell方法值得說明一下TableCell下面必須有一個段落段落里必須有 RunRun 里才是文本這個嵌套在業(yè)務(wù)代碼里很容易漏寫漏了之后 Word 里會顯示成空單元格。參數(shù)說明TableGridColumn.Width傳的是 twips 字符串想按內(nèi)容自適應(yīng)可以傳auto但報表場景我更推薦固定值因為 Word 在無表格列定義或列寬不一致時會按照內(nèi)容長度自行分配導(dǎo)致最終效果和設(shè)計稿差很多。兩列的Width 2000就是大約 3.5 厘米按需調(diào)整。這個例子跑通后你已經(jīng)有了一個結(jié)構(gòu)合法的表格。接下來要做的是把表頭和數(shù)據(jù)行真正填進去并加上邊框。3. 把表頭和業(yè)務(wù)數(shù)據(jù)寫進 WordAddTable 方法的完整拆解項目示例的 AddTable 方法本質(zhì)上是在解決三件事數(shù)據(jù)怎么傳進來、每一行怎么創(chuàng)建、表格邊框怎么不丟。這一章把它拆開講順帶修正示例里幾個測試時發(fā)現(xiàn)的問題。3.1 方法簽名與數(shù)據(jù)準(zhǔn)備為什么用 Liststring[]AddTable的典型簽名是public static void AddTable(string wordPath, Liststring[] lstData, string[] headerArray)三個參數(shù)分別是 Word 文件路徑、二維數(shù)據(jù)每一行是 string[]、表頭數(shù)組。用Liststring[]看著不夠面向?qū)ο蟮谂繉?dǎo)出場景非常實用數(shù)據(jù)從數(shù)據(jù)庫查出來后通常也是 List 結(jié)構(gòu)直接 select 成 string[] 即可省去為每個報表單獨建實體類的步驟。OpenXml 只關(guān)心字符串內(nèi)容格式化交給上層處理。這里要留意一個細節(jié)列數(shù)。示例里用lstData.Select(x x.Count()).Max()求最大列數(shù)思路對但有個隱患。如果某一行數(shù)組長度小于最大列數(shù)后面遍歷建行時該行會少幾個單元格Word 里會表現(xiàn)出單元格錯位或表格列數(shù)不一致。我一般在構(gòu)建表格前統(tǒng)一補成等長數(shù)組int maxColumnNum lstData.Max(x x.Length); for (int i 0; i lstData.Count; i) { if (lstData[i].Length maxColumnNum) continue; string[] paddedRow new string[maxColumnNum]; Array.Copy(lstData[i], paddedRow, lstData[i].Length); for (int j lstData[i].Length; j maxColumnNum; j) paddedRow[j] string.Empty; lstData[i] paddedRow; }這段代碼的邏輯是先算出最大列數(shù)然后把每一行長度不足的部分用空字符串補齊。補位之后整個二維數(shù)組變成一個規(guī)整的矩形TableRow 數(shù)量穩(wěn)定TableGrid 的列定義才不會失效。如果你的數(shù)據(jù)本來就規(guī)整這段可以不寫但報表數(shù)據(jù)來自多張表時字段缺失是常態(tài)留著更安全。3.2 TableRow 統(tǒng)一構(gòu)建表頭和內(nèi)容用同一個方法原示例把表頭和數(shù)據(jù)行用同一個 foreach 邏輯處理這個思路很好。我傾向于再抽一個BuildRow方法表頭和數(shù)據(jù)都通過它來創(chuàng)建行后面要單獨改樣式時只動表頭那一次調(diào)用即可。private static TableRow BuildRow(IEnumerablestring cellTexts) { TableRow row new TableRow(); foreach (string text in cellTexts) { TableCell cell new TableCell(); Paragraph paragraph new Paragraph(); Run run new Run(); run.Append(new Text(text)); paragraph.Append(run); cell.Append(paragraph); row.Append(cell); } return row; }這個方法內(nèi)部做的事情非常直白每個字符串都創(chuàng)建一個單元格單元格里放一個段落段落里放一個 RunRun 里才是文本。很多初學(xué)者會把 Text 直接塞給 TableCell這是行不通的。TableCell 在 OpenXml 里只是容器不經(jīng)過 Paragraph 和 Run 兩層包裝Word 根本不會把內(nèi)容當(dāng)作可顯示文本。參數(shù)說明IEnumerablestring讓方法同時接收數(shù)組和 List表頭數(shù)組可以傳數(shù)據(jù)行 string[] 也可以傳。如果你想在表頭行加粗、加底色可以把表頭作為單獨字段放進去或者在生成表頭后用另一個賦值函數(shù)處理第一行對象。后面 4.1 會給一個帶樣式的表頭單元格寫法。示例還提到“有 TableHeader 對象用不來”。解釋一下TableHeader是TableRow的派生類專門用于跨頁重復(fù)表頭。如果表格不會跨頁用普通 TableRow 就行如果表格長到跨頁希望每一頁頂部都出現(xiàn)表頭第一行應(yīng)該用TableHeader。這一點到 4.4 再展開。3.3 TableProperties 邊框配置六個方向的邊框一個都不能少默認情況下OpenXml 創(chuàng)建的表格不帶邊框直接寫入 Word 會顯示成無框線表格。要加邊框必須給 Table 掛TableProperties里面再放TableBorders。示例里的邊框?qū)懛ū旧硎菍Φ牡袔讉€參數(shù)值得展開TableProperties tblProp new TableProperties( new TableBorders( new TopBorder() { Val new EnumValueBorderValues(BorderValues.Single), Size 2 }, new BottomBorder() { Val new EnumValueBorderValues(BorderValues.Single), Size 2 }, new LeftBorder() { Val new EnumValueBorderValues(BorderValues.Single), Size 2 }, new RightBorder() { Val new EnumValueBorderValues(BorderValues.Single), Size 2 }, new InsideHorizontalBorder() { Val new EnumValueBorderValues(BorderValues.Single), Size 2 }, new InsideVerticalBorder() { Val new EnumValueBorderValues(BorderValues.Single), Size 2 })); table.Append(tblProp);邊框類型有六種上、下、左、右、內(nèi)部橫線、內(nèi)部豎線。Size的單位不是像素而是 1/8 磅Size 2實際約等于 0.25 磅屏幕上看著像沒有。想要明顯一點的邊框給 4 或 8分別對應(yīng) 0.5 磅和 1 磅。Val除了Single還有Dashed、Dotted、Double但正式報表用 Single 最穩(wěn)妥。另一個關(guān)鍵是枚舉的寫法。OpenXml SDK 里大多數(shù)屬性值是強類型枚舉比如BorderValues.Single賦值時要通過new EnumValueBorderValues(...)包一層不能直接寫 BorderValues.Single。很多從舊版 OpenXml 2.0 遷移過來的同學(xué)經(jīng)常在這里遇到編譯錯誤。TableProperties里子元素的順序也有講究。Word 對tblPr內(nèi)部元素有固定 schema 順序手動Append時容易打亂。順序不對SDK 不會報錯但 Word 打開可能忽略部分屬性。穩(wěn)妥做法是用構(gòu)造函數(shù)一次傳完不要多次 Append。3.4 更完整的 AddTable 流程整合數(shù)據(jù)、表頭、邊框把以上內(nèi)容組合起來一個能用于生產(chǎn)環(huán)境的 AddTable 大致如下public static void AddTable(string wordPath, Liststring[] lstData, string[] headerArray) { using (WordprocessingDocument doc WordprocessingDocument.Open(wordPath, true)) { Body body doc.MainDocumentPart.Document.Body; int maxColumnNum Math.Max(headerArray.Length, lstData.Max(x x.Length)); Table table new Table(); // 列定義 TableGrid grid new TableGrid(); for (int i 0; i maxColumnNum; i) { grid.Append(new TableGridColumn() { Width 2500 }); } table.Append(grid); // 邊框?qū)傩?TableProperties tblProp new TableProperties( new TableBorders( new TopBorder() { Val new EnumValueBorderValues(BorderValues.Single), Size 4 }, new BottomBorder() { Val new EnumValueBorderValues(BorderValues.Single), Size 4 }, new LeftBorder() { Val new EnumValueBorderValues(BorderValues.Single), Size 4 }, new RightBorder() { Val new EnumValueBorderValues(BorderValues.Single), Size 4 }, new InsideHorizontalBorder() { Val new EnumValueBorderValues(BorderValues.Single), Size 4 }, new InsideVerticalBorder() { Val new EnumValueBorderValues(BorderValues.Single), Size 4 })); table.Append(tblProp); // 表頭行 table.Append(BuildRow(headerArray)); // 數(shù)據(jù)行 foreach (string[] rowData in lstData) { table.Append(BuildRow(rowData)); } body.Append(table); } }這段代碼和原示例主干一致但做了三處修正第一grid 里追加的是TableGridColumn并且真正掛到 table 上第二邊框 Size 提高到了 4更適合查看和打印第三表頭和數(shù)據(jù)的行構(gòu)建統(tǒng)一走BuildRow避免重復(fù)代碼。有同學(xué)問為什么 TableGrid 要放在 TableProperties 前面。實際上 Table 內(nèi)元素按照 OOXML 的 schemaTableGrid 應(yīng)該出現(xiàn)在 TableRow 之前TableProperties 一般放在 TableGrid 之后。具體順序可以用 OpenXmlValidator 驗證這個驗證器在最后一章會給代碼。順序正確的前提下Word 才能穩(wěn)定地識別邊框和列寬。4. 單元格樣式與通用布局背景色、對齊、合并、重復(fù)表頭基礎(chǔ)表格能跑通后真實的報表需求就來了表頭要加底色、數(shù)字列要右對齊、某些單元格要合并。這一章把單元格樣式和高頻布局操作拆開代碼都是可以直接抄進項目的。4.1 TableCellProperties 與 Shading給表頭加上底色單元格樣式最核心的對象是TableCellProperties簡稱 tcPr。它負責(zé)單元格寬度、背景色、垂直對齊、合并等。給表頭加底色要往 tcPr 里塞Shadingprivate static TableCell BuildHeaderCell(string text) { TableCell cell new TableCell(); TableCellProperties cellProps new TableCellProperties(); // 背景色Fill 是十六進制不帶 # Shading shading new Shading() { Fill D9E2F3 }; cellProps.Append(shading); // 單元格寬度單位 twips TableCellWidth cellWidth new TableCellWidth() { Type TableWidthUnitValues.Dxa, Width 2500 }; cellProps.Append(cellWidth); cell.Append(cellProps); Paragraph paragraph new Paragraph(); // 段落居中 ParagraphProperties paraProps new ParagraphProperties(); paraProps.Append(new Justification() { Val JustificationValues.Center }); paragraph.Append(paraProps); Run run new Run(); run.Append(new Text(text)); paragraph.Append(run); cell.Append(paragraph); return cell; }Fill是十六進制顏色字符串不帶 # 號。D9E2F3是淺藍灰表頭常用。TableCellWidth的Type有三種Dxa固定寬度、Auto自動、Pct百分比。建議固定列寬都用Dxa讓 Word 不參與列寬決策。Justification控制段落文字在單元格內(nèi)的水平對齊Center居中Right右對齊。如果還要控制垂直居中需要在 tcPr 上追加TableCellVerticalAlignmentcellProps.Append(new TableCellVerticalAlignment() { Val TableVerticalAlignmentValues.Center });有個坑必須提醒TableCellProperties在TableCell里必須位于Paragraph之前。如果先 Append 了 Paragraph 再 Append tcPr文檔結(jié)構(gòu)不符合 schema有些 Word 版本會直接視為無效單元格。SDK 平時不攔你但驗證階段會報警。4.2 合并單元格GridSpan 做水平合并VerticalMerge 做垂直合并合并單元格在制作復(fù)雜表頭時躲不開。OpenXml 里水平合并和垂直合并不是一回事。水平合并用GridSpan表示這個單元格橫跨幾列。比如一個單元格跨兩列TableCell spanCell new TableCell(); TableCellProperties spanProps new TableCellProperties(); spanProps.Append(new GridSpan() { Val 2 }); spanCell.Append(spanProps); Paragraph p new Paragraph(); p.Append(new Run(new Text(跨兩列))); spanCell.Append(p);使用GridSpan時TableGrid 里依然定義兩列但該行里的單元格數(shù)量會少一個。這不會導(dǎo)致列數(shù)錯誤因為 Word 知道這個單元格占了兩列的位置。垂直合并用VerticalMerge和 Excel 的合并單元格概念不同。需要兩個單元格配合起始單元格設(shè)置Restart后續(xù)單元格設(shè)置Continue。比如// 第一行 TableCell vMergeStart new TableCell(); vMergeStart.Append(new TableCellProperties( new VerticalMerge() { Val MergedCellValues.Restart })); vMergeStart.Append(new Paragraph(new Run(new Text(縱向合并)))); // 第二行 TableCell vMergeContinue new TableCell(); vMergeContinue.Append(new TableCellProperties( new VerticalMerge() { Val MergedCellValues.Continue })); vMergeContinue.Append(new Paragraph());Continue單元格不需要寫文本W(wǎng)ord 會把它并入上方的起始單元格。但最好保留一個空 Paragraph否則個別版本在打印預(yù)覽時會出現(xiàn)高度不對的問題。我在一次打印測試?yán)锞鸵娺^表格第二頁多出一條空白橫線原因就是 Continue 單元格里沒有 Paragraph。4.3 表格整體寬度和對齊TableWidth 與 TableJustification除了單元格整個表格也能設(shè)置寬度和頁面水平對齊。比如讓表格居中并占滿頁面寬度可以這樣寫TableProperties tableProps new TableProperties( new TableWidth() { Type TableWidthUnitValues.Pct, Width 5000 }, new TableJustification() { Val TableRowAlignmentValues.Center }); table.Append(tableProps);這里的5000在 Pct 類型下代表 100%因為 Word 內(nèi)部把百分比放大了。如果你要 50% 寬度寫2500如果不想換算直接用Dxa類型比如Width 8500大約是一頁 A4 可用寬度。這個換算關(guān)系很容易錯很多項目的表格寬度異常都是在這里翻車的。TableJustification控制的是表格在頁面上的左右位置和單元格內(nèi)文字對齊是兩回事。我做報表的習(xí)慣是外層表格居中單元格內(nèi)文字按列性質(zhì)決定居左還是居右數(shù)字列右對齊文本列左對齊這個組合最常見。4.4 讓表頭跨頁重復(fù)TableHeader 的正確打開方式長表格跨頁后第二頁頂部往往沒有表頭閱讀體驗很差。OpenXml 提供了TableHeader它繼承自TableRow只需要把第一行替換成它TableHeader headerRow new TableHeader(); foreach (string headerText in headerArray) { headerRow.Append(BuildHeaderCell(headerText)); } table.InsertAt(headerRow, 0);使用限制有兩點表頭必須是表格的第一行表格真正跨頁時才有效。如果表格只有幾行TableHeader和普通TableRow沒有區(qū)別。項目中遇到一頁裝不下的明細表加上這個設(shè)置第二頁頂部會自動出現(xiàn)重復(fù)表頭省去手工分頁的煩惱。5. 用 OpenXml 加表格避坑記錄五個翻車現(xiàn)場與修復(fù)這一章記錄的是實際開發(fā)中容易反復(fù)踩的五個問題。每條按“現(xiàn)象、原因、解決”的順序?qū)懛奖隳銓φ兆约旱拇a。5.1 表格列寬失效grid 沒掛到 Table 上Width 全白設(shè)現(xiàn)象表格成功寫入 Word但列寬完全不受控制有的列被內(nèi)容撐得很寬有的擠成一團檢查代碼TableGridColumn的 Width 都寫了就是無效。原因大多是結(jié)構(gòu)錯誤。常見兩種一是把new TableGridColumn()寫成了new TableGrid()導(dǎo)致 grid 里沒有列定義二是創(chuàng)建了 grid 卻忘了table.Append(grid)導(dǎo)致 TableGrid 沒有成為 Table 子元素。Word 找不到列定義時只能按單元格內(nèi)容自動分配列寬。解決嚴(yán)格按層級把 grid 放進 tableTableGrid grid new TableGrid(); for (int i 0; i columnCount; i) { grid.Append(new TableGridColumn() { Width 2500 }); } table.Append(grid);如果修正后列寬仍不對檢查 TableGridColumn 的數(shù)量和數(shù)據(jù)行里 TableCell 的數(shù)量是否一致。比如一行有 3 個單元格grid 卻定義 4 列Word 表格會多出一列默認寬度。遇到這種情況用 OpenXmlValidator 會提示列數(shù)與網(wǎng)格不匹配。5.2 直接 Open 不存在的文件FileNotFoundException 而不是友好提示現(xiàn)象程序在WordprocessingDocument.Open(不存在的.docx, true)這一行拋出FileNotFoundException路徑?jīng)]問題但文件確實不在。原因Open方法不支持“文件不存在就自動創(chuàng)建”。它要求目標(biāo)文件已經(jīng)存在且是合法 .docx。原示例默認Test.docx已經(jīng)存在許多初學(xué)者把路徑換成自己的沒注意文件根本不存在于是直接失敗。解決在打開前做一次存在性判斷不存在就用Create建一個空白文檔if (!File.Exists(wordPath)) { using (WordprocessingDocument doc WordprocessingDocument.Create(wordPath, WordprocessingDocumentType.Document)) { MainDocumentPart mainPart doc.AddMainDocumentPart(); mainPart.Document new Document(new Body()); } }如果擔(dān)心 Create 會覆蓋可以把判斷邏輯放在程序入口生成文件名的同時確認文件狀態(tài)。批量導(dǎo)出時我一般是先刪掉舊的臨時文件再 Create避免殘留數(shù)據(jù)。5.3 docx 文件被占用IOException 或“文件正由另一進程使用”現(xiàn)象第一次運行正常第二次運行時報IOException提示文件正由另一進程使用?;蛘邔懭脒^程中Word 打開了同一個文件保存直接失敗。原因docx 本質(zhì)是 ZIP 包WordprocessingDocument.Open會持有底層文件句柄直到對象釋放。如果using沒寫句柄不會釋放另一種情況是自己創(chuàng)建的 FileStream 也占用著文件和 OpenXml 包的句柄沖突。Word 打開同一個文件時同樣不允許其他進程覆蓋寫入。解決第一所有入口都用using包裹。第二不要在外部額外打開 FileStream。第三服務(wù)器批處理場景下先復(fù)制一份到臨時路徑再操作string tmpPath Path.GetTempFileName(); File.Copy(wordPath, tmpPath, true); using (WordprocessingDocument doc WordprocessingDocument.Open(tmpPath, true)) { // 寫入表格 doc.SaveAs(wordPath); } File.Delete(tmpPath);這樣源文件始終不被占用寫入完成后用SaveAs覆蓋回去。注意SaveAs只能在 Open 模式下使用Create 模式下不支持這個細節(jié)也值得記住。5.4 中文亂碼或文字不顯示很多情況下是少了一層 RunProperties現(xiàn)象表格寫入成功但中文在 Word 里顯示成問號、方塊或者單元格里空白一片點擊進入才能看到文字。代碼里明明用new Text(中文)寫入的。原因OpenXml 寫文本時如果 Run 沒有指定字體Word 會用文檔默認字體。沒有 Office 的服務(wù)器環(huán)境里默認字體可能不是中文字體于是在渲染階段變成亂碼。另外如果單元格里只有 Text 沒有 Paragraph或者 Run 沒有掛進 ParagraphWord 也識別不到內(nèi)容。解決給 Run 顯式設(shè)置中文字體覆蓋三個字體槽RunProperties runProps new RunProperties(); runProps.Append(new Fonts() { Ascii Microsoft YaHei, HighAnsi Microsoft YaHei, EastAsia Microsoft YaHei }); Run run new Run(); run.Append(runProps); run.Append(new Text(中文內(nèi)容));Fonts的Ascii管西文字符HighAnsi管擴展字符EastAsia才管中文。只設(shè) Ascii 的話中文依舊可能亂碼。我曾在某個報表項目里排查大半天最后發(fā)現(xiàn)是服務(wù)器上缺少中文字體把 RunProperties 顯式指定后問題才解決。5.5 TableProperties 子元素順序不對樣式時靈時不靈現(xiàn)象同樣的代碼把 TableProperties 放在不同位置后有時 Word 顯示邊框有時邊框完全消失而且不報任何錯。看起來很像玄學(xué)。原因Word 解析 OOXML 的tblPr和tcPr時對子元素順序有強制要求。OpenXml SDK 的構(gòu)造函數(shù)重載一般能保證順序但手工多次 Append 就很容易打亂。順序不符時Word 會靜默忽略部分屬性不給出錯誤提示。解決手工構(gòu)造 TableProperties 時按下面的順序追加常用子元素TableStyle、TableJustification、TableWidth、TableBorders 等。最穩(wěn)妥的方式是用構(gòu)造函數(shù)一次性傳參順序即 schema 順序TableProperties tblProp new TableProperties( new TableWidth() { Type TableWidthUnitValues.Dxa, Width 8500 }, new TableJustification() { Val TableRowAlignmentValues.Center }, new TableBorders( new TopBorder() { Val new EnumValueBorderValues(BorderValues.Single), Size 4 }, new BottomBorder() { Val new EnumValueBorderValues(BorderValues.Single), Size 4 } ) );如果屬性不生效別靠猜用 OpenXmlValidator 把錯誤列出來它連哪個元素的順序錯了都能告訴你。這個習(xí)慣我是在被 Word 的“修復(fù)文檔”彈窗教育了兩次之后才養(yǎng)成的。6. 收尾進階指定位置插入表格、自動驗證和重復(fù)表頭的完整組合基礎(chǔ)表格能加之后實際交付往往會遇到三個高頻需求表格不要總出現(xiàn)在文末、長表格要跨頁重復(fù)表頭、生成的文件不能一打開就提示修復(fù)。把這三個技巧串起來基本能覆蓋大多數(shù)批量導(dǎo)出場景。第一個技巧在指定位置插入表格。Body.Append(table)只能把表格追加到文檔末尾不符合業(yè)務(wù)里“在第三段后面插一張表”的要求。常見做法是先定位到目標(biāo)段落再用InsertAfterSelf插到它后面Paragraph target body.DescendantsParagraph() .FirstOrDefault(p p.InnerText.Contains(插入點)); if (target ! null) { target.InsertAfterSelf(table); }注意 table 如果已經(jīng)被 Append 過再次插入會報元素已存在異常。我通常先把表格構(gòu)建好再決定插入位置只插一次。第二個技巧表頭跨頁重復(fù)。把第一行聲明為 TableHeader 即可TableHeader headerRow new TableHeader(); foreach (string headerText in headerArray) { headerRow.Append(BuildHeaderCell(headerText)); } table.InsertAt(headerRow, 0);這里假設(shè) table 里還沒有任何行或者你已經(jīng)先把原來的表頭行清掉。TableHeader是 TableRow 的子類所以插入邏輯和普通行一致。第三個技巧也是我每次寫 OpenXml 必做的一步保存前用 OpenXmlValidator 驗證結(jié)構(gòu)。使用前需要引入DocumentFormat.OpenXml.Validation命名空間。這個驗證器能發(fā)現(xiàn)單元格層級、屬性順序、多余嵌套等問題省去在 Word 里反復(fù)試錯using DocumentFormat.OpenXml.Validation; using (WordprocessingDocument doc WordprocessingDocument.Open(filePath, true)) { var validator new OpenXmlValidator(); var errors validator.Validate(doc).ToList(); foreach (var error in errors) { Console.WriteLine(${error.Path} - {error.Description}); } }以前我不太信任驗證器總覺得手工寫的代碼自己心里有數(shù)。直到有一次交付的文檔被對方打開后提示“文件已損壞是否修復(fù)”才意識到檢查工具比肉眼可靠。從那以后每次生成完 docx我都會在單元測試?yán)锱芤槐?OpenXmlValidator再解壓 document.xml 看一眼表格段落的位置。這套流程看著多兩步實際上省掉了大量返工。希望這些記錄對你也有用。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美高清91| 国产精品探花在线| 久久成人精品| 青青草啪啪网| 大香蕉免| 97久久久久久久精| 看日韩美女二区三区免费操逼视频| 花花AV导航| 99在线视频播放| 欧美 日韩第一性色| 操操逼视频| 亚洲日韩精品在线播放| 永久免费av无码网站国产app| 97亚洲色图| 白天啪啪晚上啪啪视频| 欧美一区二区在线资源| 2020中文字幕在线| 久久9精品视频| 久久黄色视频一区二区三区| 东京热精品97综合网| 夜夜夜夜久久久久| 亚洲综合五月天| 美国三级日本三级久久99| 欧美日韩成人在线| 日本欧美亚洲高清在线看| 免费啊啊啊| 久久精品国产97欧美精品亚洲| 精品丰满熟妇人妻一区| 日本精品成人无码| 伊人午夜福利视频| 人妻中文字幕日韩电影| 小草精彩毛片| 国产人伦a片信息免费片| 久久伊人青青草| 久久久96| 亚洲成人日韩小说| 欧美色宗合| 国产精品黑人一区二区三区| 亚洲丁香花色| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 婷婷导航| 久久天天摸| 日韩乱码Av| 国产按摩一区二区三区| 校园春色亚洲欧洲| 97人人爱人人做人人乐| 青青草大香蕉在线视频| 啊啊啊男女| 大香蕉一人| 国产白丝网站| 张柏芝国产一区在线观看| 久久中出| 国产精品亚洲天堂网址| 亚洲导航深夜福利| 狠狠操综合| 亚洲午夜免费狠狠干| 精品国产嫩穴视频| 亚欧美综合网。| 蜜臀av网址| 丰满熟妇大乳做爰| 在线播放免费av福利片| www…国产操逼| 久久丁香五月天| 91久久精品蜜臀| 高树玛利亚无码流出| 91色黑人少妇| 欧美三四五区| 亚洲精品性爱片| 亚洲AV永久无码一区仙野| AAA久久| 激情看片网站| 久久综合精品一区二区三区| 97在线观看免费| v91av| 大二网站亚洲| 亚洲人妻av| 鸥美插入视频| 欧美乱欲| av婷婷色婷婷色六月| 男人的天堂2019AV| 四虎免费视频| 国产精品点击进入在线影院高清 | 91蜜臀人妻中文字幕在线| 超碰97 线线 在现| 国产免费久久久久| 97爱b| 国内一级精品| 亚洲人妻一区二区三区| 久久宗合亚洲| 婷婷激情五月天小说网| 亚洲综合在线高清| 人爽不卡视频| 激情AV| 内射黑人| 99久久精品国产系列| 强奸乱伦动态污图免费| 9999九九九久久久| 男女激烈网站最新| 久久久久久中文版| AA级电影三区| 亚洲激情色片| 自拍内地三级在线观看| 后入内射蜜桃臀| 亚洲日韩电影| 淫妻综合网| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 久久五月综合| 天操天操夜操夜月操月年年操操| 留下AⅤ黄色片| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 偷拍色图| 色噜噜精品一区二区三| 天天看高清麻豆| 黄色AV免费| 色色色色色色色色色色色色色色综合| 天天欧美| 亚洲 日本 一 二 三| 超碰 国产熟女精品一区| 国产成人91一区二区三区| 狠狠干综合| 偷拍导航视频网站| 91久精品| 黄色片A级一区二区三区| 婷婷色香| 国产一区二区三三视频| 日本大香蕉| 成人无码在线视频网站| 久湿久久| 色九区| 亚洲第一页色网| 手机看av网站在线看| 日韩欧美天天爽爽爽天天爽爽| 777AV电影| 国产精品电| 亚洲国产日韩欧美熟妇在线| 一个国产在线综合网站| 国产妇女精品视频青青草| 久久精品高清AV| 少妇高潮喷水无套久久久久久| 伊人久久大香大香线蕉中文| 黑人精品XXX一区一二区| 久久av色| 日韩精品99999| 成人97人人超碰人人| 夜夜狠狠躁日日躁色视频| 日韩亚洲中文字幕在线| 日韩专区久久久| 天天插天天干| 色欲三区| 青青青青青手机视频| 久久综合18p| 国产人伦a片信息免费片| 精品人妻15区| av情色影音| 自拍大香蕉乱插| 男人的天堂视频精品乱在线| 影音综合网| 国产操操日韩三级黄| 国产9熟妇视频网站| 性爱视频久久| 日韩中文字幕精品一区在线| 天天狂操夜夜狂日| 超碰1997| 视频在线观看一二三区| 国产亚洲禁久一区二区| 无码人妻精品一区二区三区99不卡 | 九t超碰| 亚洲丝袜天堂| 思思热在线视频精品| 综合亚洲欧美精品日韩?v| 97草草| 中文字幕一区二区三区人妻少妇在线| 围产精品一区二区三区视频播放| 亚洲av青草久久一区二区| 日本精品久久久久久久| 日本伦理一区二区| 97色色色| 欧美丰满熟妇XXXX性ppX人交| 精品视频在线观看精品| 熟女熟妇一区二区三四区| 黄色不卡视频| 麻豆精品A片免费观看| 99re国产中文字幕| 日韩av一级黄片| 日本欧美韩国国产在线| 玖玖爱在线视频免费观看| 精品无码少妇| 美女天天干| 91超碰碰在线| 综合91网| 久久视频,这里只有精品| 狠狠躁AV| 亚洲最大91网| 五月天丁香| 久久99精品视频| 欧美三级中文字幕hd| 一本精品日本在线视频精品| 操逼逼中文字幕| 欧美日韩黄片精品在线| 色狠狠 - 百度| 成人自拍三级在线观看| 精品日韩人妻视频| 免费观看网黄| 久久精品国产亚洲AV高级北京| 日韩无码视频黄色| 黄片无码在线制服| 99爱视频| 老熟女区| 麻豆a'v电影| 久久久一区二区| 国产1727欧美| 亚洲97网站| 日韩电影中文字幕| 97色在线视频| 被窝影院午夜看片无码| 国产精品嫩草久久久久| 在线观看国产黄色| 2018色综合天天操| 伊人天堂在线| 欧美曰韩国产精品| 97久久天天综合色天天综合色电影| 国产精品色哟哟| 欧亚不卡| 九九久久国产精品怡红院| 欧美综合天堂| 国产欧美在线观看免费观看| 色官网色综合| 99色在线| 97精品国产手机| 欧美在线|亚洲| 白嫩妹子国产骚| 日韩三级一区| 97se综合网| 91美女在线观看| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 色香色欲天天综合网天天来吧| 亚洲性天堂| 欧美在线亚洲| 囯产精品久久久久久久久久梁医生| 国产女人视频三四五区| 操逼无码操逼| 亚洲最新av无码成人精品区| 伊人97超碰| 磁力99AV| 三及片网站| A级国产欧美激情在线| 能在线播放的国产三级| 91一起操| 歐美性天天| 久久99干一本高清| 日韩免费a级毛片无码a∨| 成年女人黄网站| 99热这里只有精品9| 欧美一区二区情色| 久射吧| 超碰97 线线 在现| 亚洲精品国产专区在线观看| 色爱综合网| 久久综合久久综合人久久夜精品| 亚洲极品| 日韩无码a片| www九九热| 三级片大波波| 九九九九精品精| 99在线无码精品秘 入口黑人| 久久久久久国产精品| 久久夜夜夜夜| 97在线免费看视频| 日本一区二区不卡精品| 九九久久99| 外国免费性情大片| 日韩欧美视频青青| 欧美少妇色图| 欧美一级色| 国产精品在线一区二区| 国模私拍一区二区三区神乳| 台湾佬中文娱乐自偷自拍| 久久精品无码一区二区三区| 18禁超污无遮挡无码免费网| 欧美少妇高潮久久91| 大象AV在线| 这里只有精品视频在线| 蜜臀久久99精品久久久久久成人小说| 爽 好舒服 无码刺激久久| 自拍视频大全亚洲专媒视频/一区二区三区 | 国产精品久久久久久高清无码免费看| 激情综合五月| 69精品| 亚洲日韩精品在线播放| 97草草| 国产精品免费日韩| 在线情色电影 91大| 9国产超碰| 大香蕉综合| 欧美三级中文字幕hd| 国产日韩中文字幕欧美| 欧美亚洲色图另类国产| 试看60秒| 1769精品一区二区三区| 俺也射| 久久久久成人亚洲国产| 91色欧美| 96精品在线| 精品久| 欧美日韩国产中文超碰| 欧美日韩在线小说 | 无码操逼视频一下| 中字幕人妻一区二区三区| 情色日播放AV| 中文字幕人妻资源在线| 夜夜 中文视频rt| 一二三四视频中文字幕在线看| 亚洲情色1区| 综合av社区| 97国产天堂岛| m欧洲一级午老| 久久一留热品黄| 91红杏| 97超碰免费生活| 清纯唯美激情| 蜜乳Av成人片网站| 大香蕉男女超碰精品在线| 97超碰久久色| 亚洲AV成人无码一区二区三区在线观看 | 日韩欧美传媒一区国产| 人妻人人做人人澡人人爽欧美一区| 欧美人妻中出| 超碰在线看| 国产精品99999| 九九亚洲精品| 色色婷婷五月| 欧美日韩色综合网| 午夜视频久久久| 蜜臀精品1区2区| 欧美午夜视频免费观看| 色九色久| 男人久久精品| 亚洲AV免费在线| 中国AAAAAA黄色片| 久久人妻一区二区三区高清| 久插综合| www.91色综合| 精品亚洲国产成人AV制服丝袜 | 高清国产精品福利网站| 亚洲 欧美 日本 国内 首页| 超碰 另类 欧美 | 熟女精品一区二区三区| 丁香五月性| 超碰78| 校园春色欧美| 嗯~啊~快点 死我视频| 人看人人摸人人操| 岛国AB视频| 久久久精品网站| 97射欧美| 内射卯月麻衣| 日本新免费二区三区| 另类图片五月| 97舔舔| 丰满人妻av一区二区三区| 日韩激情电影中文字幕| 99久久久无码国产精品性啊聊| 99re在线视频| 亚洲美女 晚间男人天堂| 亚州情色j区| 日韩无码成人电影| 色牛牛AV| 免费操逼视频下载| 色色色天美视频| 26uuu性物| 国产日韩欧美操逼视频| 日韩精品资源专区二区| 免费在线看黄片av| 国产精品人妻无码久久久老鸭窝| 91网站18禁| 亚洲午夜精品久久久中文影院| 97超碰精品成| 99久久9| 日日骚精品视频| 中文字幕日韩人妻视频| 五月丁香六月婷综合成人综合 | 91xingse| 97色插| 国产精品老熟女一区二区| 日韩性爱网址| 激情婷婷五月天| 91精品黄在线观看| 激情第四色| 美女黄色一级A视频| 九九RE视频在线精品| 欧美日韩中文亚洲v在线综合| 亚洲天堂7777| 国产AV高清AV无码| 午夜免费视频1000| 九九热精品在线| 超碰97欧美在线| 强奸少妇AV导航网| 亚洲三级网址久久最新| 使劲用力艹少妇视频一区二区| 色网在线| 久久尹人大香焦视| 国产精品黑人一区二区三区| 一个人免费视频观看在线WWW | 人人爱夜夜爱| 乱码人妻一区二区三区| 欧美热图99| 少妇激情一区二区三区视频| 大香蕉中文| 久久精品久久久久久久久| 宅男影院久久久,99| 久久久亚洲欧美综合| 一区二区三区视频在线观看免费| 久久草大香蕉| 大香蕉国产中文自拍| 亚洲综合射| 后入合集| 三级日韩一区二区三区| 日韩国产成人自拍视频| 激情文学网伊人| 第四色色综合91| 国产热av| 秋霞 色色| 亚洲精品一区二区三区在线播放| 98色网| 男人的天堂日本东京热| 欧美成人精品欧美一级乱黄一区二…| 亚洲无码国产探花在线观看| 日本精品成人无码| 亚洲天堂人人妻| 91性网| 国产精品美女久久久久AⅤ国产馆| 国产家庭乱伦网址| 亚洲高清视频在线观看| 久久婷婷一区| 2018天天干在线视频| 五月天婷婷久久| 97免费视频网| 久久久久久久九九九九| 熟女人妇一区二区三区| 快播久久人人aV| 欧美色性情| 日美免费黄片| 欧美老妇女内射网址| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 7777奇米影视久久| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 综合网亚| 九九九九热| 欧美人人AAA| 熟女网站最新| 日韩性爱视频在线免费观看| 日韩一区二区熟女| 91亚洲影视| 免费a在线播放v| 91国产美女丝袜足交精品视频| 青娱乐黄色录像| 强歼乱伦资源网| 啊啊啊不要好爽日韩无码一区| 亚洲男人电影天堂| 狠狠 91| 91亚洲综合在线| 婷婷色影院| 97精品一区| 中出后入| 日韩精品碰碰| 国产精品成人蜜臀AV在线| 午夜精品久久久99| TS人妖另类精品视频系列| 丁香五月天啪啪| 一本色道久久综合狠狠操| 欧美成人四级在线播放| 1204av韩国| 欧美性爱日韩高清| 欧美72网页| 翔田千里AⅤHD无码| 97高清啪啪| 色欲Av人妻精品一区二| 热热热热日日漂亮永久永久国产日| 亚洲婷婷丁香在线| av在线人气| 中文字幕第9页萱萱影音先锋| 91原创在线观看| 97免费在线| 日韩一999精品| 97超碰人人操人人操| 国产乱婷婷精品二区三区| 亚州熟女乱伦| 大香蕉欧美国产日韩高潮| 99re国产精品视频| 色噜噜人妻av中文字幕| 97精品国产97久久久久久| 国产一国产一级毛片古装| 天天综和| 日本性爱不卡视频| 久久日韩肥臀| 中文字幕在线观看第二页| 久久精品福利影院| 久久精品国产97欧美精品亚洲 | 99久久综合| 欧洲一级性爱视频在线观看| 欧美翘臀视频网站一区二区三区 | 成人精品在线免费视频| ai欧美亚洲小说| 国产亚州日韩欧美看片| 欧美一级黄色免费专区| 玖玖大干人妻| 日少妇亚洲版| 91精品黄在线观看| 东京热视频网| 精品国产AV一区天美传媒| 天操天操夜操夜月操月年年操| 国产无码高清操逼视频| 婷婷国产精品一区二区| 亚洲精品骚逼| 五月婷婷综合网| 国产乱伦亚洲| 偷拍 亚洲 欧美| 超碰97欧美日韩| 蜜臀久久一区二区| 伊人色综合超碰| 综合久久久久久久综合网| 日韩精品一区二区人人人| 欧美 青青草| 99精品网| 亚洲精品第一| 性色av大全| 欧美精品黑人猛交高潮| 欧美亚洲se91| 冬京热男人的天堂| 天天爱天天韩国日本牛牛牛牛 | 欧美日韩理论一区| 激情久久久| 亚洲一卡2卡3卡4卡乱码网站| 精品黄色电影| 综合亚洲欧美| 碰人碰碰人人开房人肉| 日韩精品99久久久久久中文字幕 | 精品国产乱码久久久影院| A啊啊在线观看| 麻豆天美国美国产| 欧美天天插| 午夜色婷婷| 国产三级电影免费观看| 日本丝袜人妻内射| 99re公开精品免费视频| 国产精品一区二区亚洲人成毛片| 亚洲天天操| sewuyueav| 亚洲欧美校园| 亚洲另类色综合网站| 人妻内射一区二区在线视频| 久久天天躁日日躁狠狠躁| 天天综合网国产| 9久超碰| 国产少妇肉丝在线观看| 色999五月色| 欧美性爱精品一区二区| 欧美精品日韩一区二区| 在线99热| 99激情| 亚洲午夜av| 超碰在线国产| 欧美夜夜狠| 国产欧美伊人| 亚洲人在线成线成人| 久久精品免费| 久久久性爱视频| **一级毛片国产| 干b在线性社区| 91高清日| 亚洲男人在线观看天堂 | 96AV精品| 95精品在线| 亚洲精品久久久久久久蜜桃臀| 97精品一区| 黄色av网站在线播放| 操91| 久热无码| 九色 蝌蚪 熟女自 | 熟女这里只有精品6| 日韩一区二区精品视频| 狠狠躁AV| 91爱看| 99精品丰满人妻无码| 久久久三区二区一区| 久久精品成人| 97国产超碰| 操逼无码操逼| 精品性爱一二三区| 丁香五月天激情| 久久久噜噜噜久久久| 亚州综合AⅤ| 欧美伦乱| 性色AV蜜色av色欲av| 日本免费一级AAA大片器| 干婷婷综合网| 97超碰色五月| 97精品97久久| 久久男人天堂| 26uuu欧美| 欧美在线啊啊啊 | 日韩免费高清大片在线| 国内精品伊人久久久久影院会| 熟女丰满人妻一区| 物业黑人 AV一区| 亚洲色人| 欧美成人性爱视频大全| 久久天天躁日日躁狠狠躁| 免费国产| 日本三级A片网站com| 99综合免费视频| 91天天c| 久久久新亚洲AV| 大色综合网| 欧美老妇综合网| 91bbbbbb| 国产精品爽爽va在线观看98| 国产日韩精品一区二区三区| 久久久久久99999国产精品| 国产综合日韩伦理| 六月婷婷综合| 99国内熟女露脸视频| 麻豆天美传媒毛片| 日本久久网| 福利天天都操| 亚洲一级特黄大片在线播放91| 亚洲国产精品乱码在线观看| 密臀成人视频久久久| 老熟妇一区二区三区…| 青青草视频爽一爽| 97干色| 亚洲熟妇自偷自拍另欧美| 欧美亚洲清纯| 夜色AV无码手机在线影院| 美女高潮视频91| 亚洲欧美日韩偷拍色图| 中文字幕高清20页视频| 大鸡巴久久| 欧美做爰无码A片视频| 97精品97久久| 无码免费一区二区三区啪啪| 另类图片欧美激情综合| 五月婷婷六月激情| 欧美美逼| 欧美在线观看综合国产| 亚洲天堂日本| 精品国产一区二区三区香蕉欧美| 天天综合香 ld视频| 欧美色网| 日韩中文字幕熟妇人妻 | 欧美日韩国产另类综合| 日本加靬比网站发布页| 操国产逼| 国产高清不卡视频| wwwxxx日本爽| 久污| 日韩精品在线观看网站| 激情久久日韩精品中文字幕麻豆| 精品成人动漫一区二区| 秋霞福利网| 人人摸人人叼| 青女偷拍网| 91丨九色丨大屁股| 97免费在线视频| 久久av网| 国产一级作爱毛片| 亚洲成人在线乱码色午夜| 99亚洲天堂| 草草电影院| 东北老女人的激情视频| 青青久久手机线视频| 蜜臀一二三区| 人人色97| 中文精品一区二去| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 久久xxxx| 97超碰人人模人人拍人人| 啊啊啊啊啊啊啊好爽不要| 18禁精品网站在线看| 一区超碰一区| 殴美,日韩国产伦精品| 日熟女| 精品二区久久| 91啪9色| 欧美性爱1080p| 国产日韩怡红院| 亚洲欧美色综合| hd成人一区二区在线| 不卡视频一区蜜桃视频 | 在线有码中文字幕| 91蜜臀人妻中文字幕在线| 日韩有码免费视频| 夜夜天天噜狠狠爱2021| 超碰97日韩| 偷拍超碰| 五月婷婷色| 国产Aα| 天天看片青娱乐| 亚洲视频二区 | 天天干人妻| 99免费在线视频| 操逼大黄片| 一区二区三区四区理论片| 精品国产国产AV| 91激情综合| 丁香五月大香蕉| 国产91啪| 襙一襙| 久久9精品| 超碰69| 欧美永久激情一区二区| 天天日夜夜爽| 国产精品免费视频人成| 中文字幕美女91| 好吊色青靑草| 亚洲双插| 亚洲一二三四区在线免费看视频| 欧色综合| 超碰调教97| 婷婷综合激情| 国产1769在线| 伊人网综合在线视频| 亚洲码在线中文在线观看| 四方色播| 日本久久久久久久久久| 色呦色呦色精品| 婷婷情色五月天| 欧美熟妇乱码在线一区| 天天舔天天 | 天天色悠悠激情| 涩五月婷婷| 在线人人人人人人精品超| 国产人妖的免费的视频| 岛国免费视频在线| 日本成人在线不卡一区二区三区| 蜜屁av| 亚洲国产97在线精品一区| 碰超人人在线一区二区三区| 日本精品性生活久久久| 色情亚洲日本成人| 亚洲AV不卡在线观看尤物| 亚洲中文字幕妇伦久久| 麻豆2区1区天美| 中文字幕国产精品1区| 调教熟妇 久久久久久| 中文字幕精品一区二区精品| 超碰在线91| 亚洲综合小说另类图欧美视频激情小说色五月天 | 大香蕉免费中文| 亚洲色吧网| 偷窥自拍亚洲色图| 男人下部插入女人下部| 99国产在线绯色一区| 一区二区三区四区姦女| 久久久中文版| 激情综合网一盗摄| 97中文字幕一区| 蜜臀99久| 国产精品人妻免费精品| 午夜人人操| 人妻少妇被猛烈进入中| 18禁超污无遮挡无码免费网| 成人三级片无码| 亚洲综合另类小说色区亚洲成av人片在www| 伊人五月天婷婷| 狠狠操夜夜| 麻豆啪啪啪视频| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 女性喷水高潮在线观看| 欧美偷拍区| 日韩丝袜二区| 亚洲不卡AV在线| 黄色小说亚洲| 五月天欧美色图| 青娱乐黄色录像| 26UUU欧美日本| caoni国产亚洲av| 婷婷五月丁香五月| 欧美久久毛片基地| 亚洲性综合11| A级国产欧美激情在线| 国产精品久久99日日| 超碰在线国产| 丝袜综合| 亚洲男人天堂网站| 国产精品女生av| 99亚洲精品| 久草男人天堂| 亚洲在线91| 国产成人手机视频激情| 日本精品一区三区| 中文字幕伊人| 91福利网在线观看| 亚洲精品亚洲人成人网| 日韩99神马视频片| 国产精品农村妇女| 天天搞在线综合网| 亚洲不卡不卡中文字幕不卡 | 国产精品视频一区二区三区八戒| 久久精品国产精品亚洲艾通辽熟妇 | www.色婷婷| 亚洲视频二区| 黄色成人网久久久久久| 亚洲人妻av| 人妻超碰青青草98| 日韩极品无码B| 婷婷综合| 超碰97综合网| 台湾成人无码AV| 67194无码不卡| 国产熟女无套内射| 色欲日韩欧美在线一区| 最新av在线| 日韩成年人性爱视频| 色综合色色| 亚洲在钱| 国产亚洲美日韩Aⅴ中文字幕无码成人| 激情四射婷婷四五月天| 久久av一级av少妇av高潮 | 插入粉嫩少妇视频| 先锋影音av先锋一区| 黄色网址久久精品欧美喷水| AV男人天堂网| 国产小黄片在线免费观看| 99热精品国产| 国产精品不卡一区二区三区av| 欧美综合站| 日韩欧美女求操每天更新| 欧美亚洲中文字幕| 玖玖爱综合网| 7777欧美成是人在线观看| 日本精品久久久久久久| 日韩亚洲中文字幕在线| 亚洲有码第一页| 久久久久久日韩| 国产精品久久久999| 欧美极品性爱天天射| 亚洲自拍一区夜夜操| 亚洲天堂五月天国产| 精彩视频日韩| 亚洲人成网站7777| 久久av网| 日韩色欲久久一二三四区| 亚洲天堂人人妻| 国产精品爽爽v| 鸥美极品| 黄片不用下载在线观看| 91老妇女| 四虎AV在线观看| 黑人综合网| av大香蕉网站| 久久久久久69国产一区二区| 九九九九欧美| 亚洲AV无码成人精品久久| 夜夜无码| 蜜臀av一区二区三区免费观看| 国产精品国产精品国产| 亚洲一二三精品久久网 | 91处女在线视频| 伊人五月天| 国产乱子伦久久精品综合一区二区三| 久热69九色熟妇97| 亚洲图片激情综合另类| 欧美综合狠| 99无码| 爱妃国产亚洲视频中文字幕| 噜噜噜久久亚洲精品色情| 多乙久久久久久| 91天堂| 日本A级视频| 91小视频| 国产女大学生AV| 亚洲成人妻日韩在线| 成人av动漫在线观看| 九九碰九九爱97超| 久久99精品九九久久久婷婷| 色九区| 青草草免费网站av| 亚洲97网站| 91超碰人人| 久久一级无码精品毛片6| 亚洲中文字幕一区二区| 久久综合女优| 色五月首页| 自拍偷拍亚洲熟女妇人精品| 欧美色交| 97精品视频网站| 亚洲人妻一区二区三区| 欧美激情另类一区二区| 哈哈操电影| 一本久久精品中文字| 九九色色| 国产网站在线播放| 久久伊人最新网址视频| 国产九九九九九九| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 亚洲综合69| 天天综合~91入口| 亚州AV无码国产精品| 成人一二| 日本大香蕉综合网红本杳社区| 天美欧美国产| 久久熟女人| 日本福利二区视频| 日本三级一区二区 在线| 久操97| av天堂加勒比| 老熟妇一区二区三区啪啪| 老女人日韩美91| 国产伦精品一区二区三区在线观 | 99精品久久久久久久婷婷蜜桃| 蜜乳AV免费观看| 日本506070| 欧美中日韩XXXX| av草草在线电影| 九九九九免费高| 青草香蕉网| 国产精品国产自产拍高清AV| 中文字幕成人| 日本护士高潮| 国产乱码精品一区二区三区四川| 欧美性爱日韩高清| 国产真实子伦对白| 91情色| 78久久| 国产极品馒头逼| 一本久道久久综合狠狠爱一密臀精| 亚洲丰满很很操| 超碰伊人在线| 嗯嗯啊啊日韩精品| 偷拍综合亚洲| 任你干在线视频| 亚洲国产中文字幕| 尤物视频网 刘玥| 日本顶级天天操狠狠操夜夜操中文字幕| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 日韩三级av片| 伊人九九| 99re这里只有精品9| 91九九| 日本不卡一区| 人人干人人操人人爱| 亚洲 欧美 日韩 国产一区二区| 91精品人| 亚洲国产精品成人综合| 看免费的黄片| 双插性欧美一二三区| 亚洲无吗在线视频| 日本性爱网址| 强奸xx国产| 亚洲国产精品久久久久久久久久| 久久麻豆一区二区| 欧美精品在线观看| 综合激情97 | 欧美一级黄色18片免费看| 欧美v亚洲v日韩v最新在线二区| 偷看洗澡一二三区美女| 丁香六月综合激情| 激激五月| 欧亚久久偷拍视频| 国产人妻精品一区二区三区秋霞 | 亚洲成人黄色在线观看| 伊人久久综合影院| 日本在线不卡v二区| www.婷婷| 黄色小说亚洲| 土豪酒店各种姿势玩弄极品幼稚| 97在线观看视频| 亚洲av青草久久一区二区| 牛牛操视频逼| 一区二区三区激情在线观看| 67914亚洲精品| 亚洲永久AV无码精品秋霞| 美女丝袜激情小说| 亚洲图片欧美| 中文字幕一二区二三区人妻专区| 亚洲另类色图片| 久久久久密臀视频| 992大香蕉| 午夜精品久久久久久久久久蜜桃 | 2019亚洲男人天堂| 快灬快灬 一下爽蜜桃在线观看| 亚洲视频中文一区| 亚洲午夜福利在线影院| 超91综合网| 91嫩草在线| 亚洲欧美黄| 国产欧美日韩一区二区三区| 久热免费视频| 97bbn| 亚洲超碰97| 人人干人人操人人..com| 情色日播放AV| 国产91专区| 日韩国产精品人妻无码久久久| 午夜久久无码1000合集| 69AV女优男人的天堂| 啊啊啊轻点在线观看| 秋霞午夜成人福利片片| 日韩性爱高清免费视频| 91在线色| 亚洲色图 欧美| 91呆哥人妻| 欧美A√综合网 | 久久9亚洲| 久9爱精品| 亚洲av影音先锋| 亚洲中文字幕乱码无码一区二区 | 亚洲国产麻豆一区二区三区| 91丝袜美腿网站| 国语精品对白| 国产激情在线| 狠狠色一区二区中文字幕| 亚洲97| 大香交伊人网| 国产精品夜夜夜| 99久久e免费热视| 亚洲天堂自拍| 99久久国产精品免费高潮| 中文字幕 码精品视频网站| 日韩中文字幕宗合在线| 欧美精品23| 亚洲国产综合久久久性感熟妇| 啊啊啊好大好深| 凹凸视频特色日本特黄| 风月影院男女十八禁| 先锋激情∨在线视频播放| 中文字幕日产av人| 超碰95| 亚洲欧美校园另类春色| 91色欧美| 久久婷婷伊人| 99精品九九九九九九| 成人性爱电影一区二区| 日韩中文9| 极品尤物女神在线观看| 国产成人精品午夜福利| 东北丰满熟女国产一区 | 国产高清成人mv在线观看| 久操在97| 97人人操人人摸| 国产第二页| 探花熟女,姿勢到位,體驗感也到位| 乱老熟女一区二区三区| 91色人妻| 91九九九小逼| 九色精品视频导航1| 成人欧美日超碰| 亚洲黄色a级片| 欧洲站一级二级三级h| 亚洲偷拍自拍在线视频| 日本道人妻久久久在线不卡色视频| 欧美日韩国内不卡| 亚洲中文字幕av | 少妇内射视频| 精品国产久热在线观看| 就去色综合| 九色 人妻 大香蕉| 在线人成亚洲视频免费观看| 大香蕉啪啪啪啪在线| 综合久久久久久久综合网| 九九人妻| 99色| 大香蕉免费3| 亚洲情色综合网| www.色婷婷.com| 69视频入口| 色男人色天堂东京热| 久久草在线综合视频| 国产综合久久久麻桃个| 嗯~啊~快点 死我视频| 久久久精品91八戒| 五月天亚洲网| 久久天堂婷婷网| 99re免费视频精品全部| 人妻熟女一区二区| 亚洲av夫妻操穴网| 偷拍亚洲熟女视频播放| 日本高清一本二本免费不卡| 亚洲中文字幕噜噜噜久久久| 伊人五月天婷婷| 久久亚洲日韩国产欧| 亚洲图片 91| 强奸乱伦大香蕉| 人妻第一页| 蜜桃色院一区久久 | 熟妇高潮二区三区| 91九久| 熟女人妇一区二区三区| 综合夜夜| 四虎精品一区| 一区二区首页| 国产99 中文字幕日韩小视频| 欧美亚洲自拍另类人妻| 超碰9 7女人| 欧美中文字幕一区| 青草av在线| 日本免费一级AAA大片器| 亚洲人综合19| 亚洲视频二区| 大稥蕉免费视频这里只有精品| 欧美,日韩综合久久| 大学生美女口爆| 激情文学亚洲| 伊人一区二区三区| 啊啊啊啊一区| 欧美极度丰满熟妇hd| 国产无马在线| 国产人妻久久精品一区二区三区| 人妻人人澡人人爽人人| 免费观看欧美日韩操逼视频| 久草网站免费在线观看| 无遮挡又黄又刺激的视频| 天堂亚洲欧美| 久久精品高清无码一区| 老熟女熟妇| 久久日韩毛| 99热99色| 亚洲精品中文字幕一区在线视频 | 婷婷色色五月天| 深夜激情无码| 国产精品久久久久无码A√| 国产免费一区2区3区| 日韩欧美中文字幕搭讪巨乳美人妻视频| 色哟哟1区2区| 亚洲自拍欧美国产首页网曝 | 国产毛片片精品天天看视频| 亚洲男人在线观看天堂| 少妇熟女视频一二三区| 大香蕉伊人75| 青青草国产一区二区三区| 日日夜夜国产综合| 东北女人av| 九色 人妻 大香蕉| 红杏大香蕉| 久久久久人妻| 婷婷丁香久久| 色九月婷婷| 中文字幕成人| 色婷婷综合视频| 日本中文字幕在线电影| 亚洲精品乱码久久久久久蜜桃麻豆 | 国产福利影视| 思思性爱| 日本护士高潮| 强奸a片网| 国产成人久久久精品免费AV| 无码视频黄色网战| 777奇米影视777四色| 熟妇操花| 91超碰人人操| 免费夜夜爱黄色视频毛片| 亚欧精品久久久久久久久久久| 成人久久久精品| 夜夜国产一区| 亚洲老司机123专区| 日本黄页视频在线观看| 久久精品女同亚洲女同13| 亚洲日韩狠狠撸视频| 日日骚一区二区三区|