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

ARTICLE DETAIL

資訊詳情

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

Apache POI全攻略:Excel/Word/PPT解析、讀寫與性能優(yōu)化

Apache POI全攻略:Excel/Word/PPT解析、讀寫與性能優(yōu)化 做Java后端這幾年只要碰到解析Excel、生成Word報(bào)表、提取PPT內(nèi)容這類需求十有八九繞不開Apache POI。這個(gè)庫(kù)就像Office文檔世界里的萬(wàn)能轉(zhuǎn)換器xls、xlsx、doc、docx、ppt、pptx……只要你想讀想寫它基本都能接得住。這篇文章我就把用POI處理常見文件類型的經(jīng)驗(yàn)整理一遍從選型、讀寫實(shí)操到排查問(wèn)題一次說(shuō)透。不管你是剛接觸POI的新手還是已經(jīng)被大文件內(nèi)存溢出折磨過(guò)的老手都能在這里找到點(diǎn)有用的東西。我的建議是先花幾分鐘把組件選型和對(duì)象模型搞清楚再去看代碼。很多人一上來(lái)就寫new HSSFWorkbook()等到文件稍微大點(diǎn)就OOM其實(shí)就是第一步選型就沒(méi)想明白。1. 內(nèi)容整體設(shè)計(jì)與思路拆解1.1 POI的組件劃分與文件格式對(duì)應(yīng)關(guān)系POI不是一個(gè)大而全的單一庫(kù)它是按Office文檔類型拆成好幾個(gè)組件的。核心的幾塊POIFSOLE2復(fù)合文檔的底層解析庫(kù)HSSF和HWPF都依賴它。HSSF處理.xls也就是Excel 97-2003格式。XSSF處理.xlsx也就是Excel 2007的OOXML格式。SXSSFXSSF的流式版本專門用來(lái)寫超大Excel文件內(nèi)存占用極低。HWPFXWPF分別處理.doc和.docx。HSLFXSLF分別處理.ppt和.pptx。這里最需要注意的一點(diǎn)是HSSF只認(rèn).xlsXSSF只認(rèn).xlsx兩者API雖然長(zhǎng)得像但對(duì)象體系是平行的不能混用。你拿HSSFWorkbook去讀xlsx運(yùn)行時(shí)會(huì)直接拋異常。所以在設(shè)計(jì)工具類時(shí)我通常用WorkbookFactory.create(InputStream)這個(gè)入口它會(huì)根據(jù)文件流的前幾個(gè)字節(jié)自動(dòng)判斷是HSSF還是XSSF然后把對(duì)應(yīng)的工作簿對(duì)象返回給你。雖然這會(huì)在上層多做一層instanceof判斷但至少避免了手動(dòng)指定格式帶來(lái)的誤判。1.2 為什么要用POI而不是別的方式有段時(shí)間網(wǎng)上流行用EasyExcel或FastExcel這兩個(gè)框架確實(shí)封裝得很舒服尤其是阿里開源的EasyExcel寫起來(lái)比原生POI短很多。但我的看法是EasyExcel解決的是“Excel讀寫”這一個(gè)場(chǎng)景而POI解決的是“Office文檔”這一整個(gè)面。你遲早會(huì)遇到這樣幾個(gè)需求讀取Word文檔里的段落和表格。批量替換PPT模板里的占位符文本。解析docx里嵌入的OLE對(duì)象。操作Excel里的圖表、圖片、數(shù)據(jù)透視表。這些需求就目前來(lái)看EasyExcel做不到只有POI能覆蓋。而且很多框架內(nèi)部底層用的還是POI只是套了新殼。所以就算你的日常需求只是讀寫Excel我也建議從POI的API入手把基礎(chǔ)認(rèn)知建立起來(lái)后面學(xué)什么封裝框架都很快。2. 選型沒(méi)錯(cuò)Excel讀寫才算入門2.1 三種Excel操作模式的取舍Excel操作涉及HSSF、XSSF、SXSSF三個(gè)模式初學(xué)者經(jīng)常糾結(jié)用哪個(gè)。我的建議很直接讀文件用WorkbookFactory.create()自動(dòng)判斷不需要手動(dòng)指定。寫.xls小文件用HSSFWorkbook簡(jiǎn)單內(nèi)存可接受。寫.xlsx小文件用XSSFWorkbook數(shù)據(jù)量在幾萬(wàn)行以內(nèi)都沒(méi)問(wèn)題。寫超大.xlsx文件用SXSSFWorkbook通過(guò)滑動(dòng)窗口控制內(nèi)存。很多人沒(méi)有意識(shí)到的點(diǎn)是XSSFWorkbook寫入時(shí)所有行對(duì)象和數(shù)據(jù)都駐留在內(nèi)存里當(dāng)你寫到10萬(wàn)行以上內(nèi)存占用輕松超過(guò)幾百M(fèi)B嚴(yán)重的直接OOM。而SXSSFWorkbook通過(guò)一個(gè)“窗口”來(lái)控制駐留內(nèi)存的行數(shù)窗口之外的行會(huì)被刷寫到磁盤臨時(shí)文件內(nèi)存占用一下就降下來(lái)了。模式對(duì)應(yīng)格式內(nèi)存特征適用場(chǎng)景HSSF.xls全部駐留內(nèi)存少量數(shù)據(jù)兼容老格式XSSF.xlsx全部駐留內(nèi)存常規(guī)Excel操作樣式復(fù)雜SXSSF.xlsx窗口內(nèi)駐留內(nèi)存超出寫磁盤大數(shù)據(jù)量導(dǎo)出報(bào)表生成另外要提醒一句SXSSFWorkbook只支持寫入不支持讀取。如果你想邊讀邊寫超大文件不能指望SXSSF幫你完成讀取操作讀取還是得靠XSSF。2.2 對(duì)象模型從工作簿到單元格的四級(jí)結(jié)構(gòu)POI的Excel模型是清晰的四級(jí)結(jié)構(gòu)寫代碼之前先把這個(gè)結(jié)構(gòu)在腦子里過(guò)一遍Workbook整個(gè)Excel文件一個(gè)文件對(duì)應(yīng)一個(gè)Workbook實(shí)例。Sheet一個(gè)工作簿里的某個(gè)工作表。一個(gè)Workbook可以包含多個(gè)Sheet。Row工作表中的一行坐標(biāo)從0開始。Cell行中的一個(gè)單元格坐標(biāo)也是從0開始。實(shí)際操作中很容易犯的錯(cuò)是直接拿row.getCell(0)不做空值判斷。在Excel里一個(gè)行對(duì)象即使某些單元格沒(méi)寫內(nèi)容行本身是存在的但如果你用sheet.getRow(5)第5行如果完全沒(méi)被使用過(guò)getRow會(huì)返回null。同樣的row.getCell(2)在單元格內(nèi)容為空時(shí)也可能返回null。我的習(xí)慣是封裝一個(gè)工具方法private Cell getCellOrEmpty(Row row, int index) { Cell cell row.getCell(index); return cell ! null ? cell : row.createCell(index); }讀的時(shí)候用getCell拿到就直接用避免NPE寫的時(shí)候用這個(gè)工具方法確保單元格一定存在。這個(gè)習(xí)慣幫我省了不少調(diào)試時(shí)間。3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)3.1 讀取Excel的關(guān)鍵細(xì)節(jié)類型判斷與日期處理讀取表格的時(shí)候大多數(shù)人第一步就踩坑。直接用cell.getStringCellValue()去取值如果這個(gè)單元格是數(shù)字類型直接拋異常。所以讀取之前一定要判斷單元格類型。POI提供了CellType枚舉常見的值有STRING、NUMERIC、BOOLEAN、FORMULA、BLANK等。這里最坑的是日期。在POI里日期和數(shù)字在底層都是NUMERIC類型區(qū)分它們的唯一方法是DateUtil.isCellDateFormatted(cell)。這個(gè)方法通過(guò)檢查單元格的數(shù)字格式來(lái)判斷它是不是日期格式。所以在讀單元格時(shí)我的標(biāo)準(zhǔn)寫法是switch (cell.getCellType()) { case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd HH:mm:ss); value sdf.format(cell.getDateCellValue()); } else { value String.valueOf(cell.getNumericCellValue()); } break; case STRING: value cell.getStringCellValue(); break; case BOOLEAN: value String.valueOf(cell.getBooleanCellValue()); break; case FORMULA: value cell.getCellFormula(); break; default: value ; }另外一個(gè)容易被忽視的點(diǎn)是getNumericCellValue()返回的是double如果你拿它去拼接字符串遇到長(zhǎng)數(shù)字ID比如業(yè)務(wù)編號(hào)、手機(jī)號(hào)會(huì)被轉(zhuǎn)成科學(xué)計(jì)數(shù)法。比如1.2345678E7這種形式給前端肯定是不能用的。解決辦法是先用BigDecimal.valueOf(cell.getNumericCellValue()).toPlainString()轉(zhuǎn)成普通字符串或者直接判斷單元格的格式類型后再處理。3.2 寫入Excel的關(guān)鍵細(xì)節(jié)樣式、日期與單元格類型寫入Excel比讀取稍微簡(jiǎn)單但依然有講究。第一是樣式對(duì)象復(fù)用。POI里創(chuàng)建樣式是一個(gè)相對(duì)重的操作每創(chuàng)建一個(gè)CellStyle就對(duì)應(yīng)底層一個(gè)樣式記錄。如果你在循環(huán)里每一行都新建樣式文件體積會(huì)暴漲而且生成速度肉眼可見地變慢。正確做法是把需要用的幾種樣式提前創(chuàng)建好循環(huán)里直接給單元格setStyle。CellStyle headerStyle workbook.createCellStyle(); Font headerFont workbook.createFont(); headerFont.setBold(true); headerFont.setColor(IndexedColors.WHITE.getIndex()); headerStyle.setFont(headerFont); headerStyle.setFillForegroundColor(IndexedColors.DARK_BLUE.getIndex()); headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);第二是日期寫入。直接cell.setCellValue(new Date())也能寫入但顯示出來(lái)可能是一串?dāng)?shù)字。原因是默認(rèn)單元格格式不是日期格式。正確的做法是創(chuàng)建一個(gè)日期格式的CellStyleCellStyle dateStyle workbook.createCellStyle(); dateStyle.setDataFormat(workbook.createDataFormat().getFormat(yyyy-MM-dd HH:mm:ss)); cell.setCellStyle(dateStyle); cell.setCellValue(new Date());第三是單元格類型先設(shè)后寫。寫字符串之前最好先cell.setCellType(CellType.STRING)寫數(shù)字之前設(shè)成NUMERIC。雖然POI很多時(shí)候會(huì)自動(dòng)轉(zhuǎn)換但手動(dòng)設(shè)置類型能防止一些老版本兼容問(wèn)題。3.3 表格公式與單元格引用的處理POI支持寫入公式寫入方式很簡(jiǎn)單cell.setCellFormula(SUM(A1:A10))。但有個(gè)坑是用POI寫入公式后打開文件時(shí)舊版Office會(huì)顯示0不會(huì)自動(dòng)計(jì)算。這是因?yàn)镻OI寫入的公式單元格沒(méi)有緩存計(jì)算結(jié)果。解決辦法有幾種在寫入公式后用workbook.getCreationHelper().createFormulaEvaluator().evaluateAll()手動(dòng)計(jì)算結(jié)果并緩存。如果不需要?jiǎng)討B(tài)計(jì)算直接在POI生成文件前計(jì)算好結(jié)果把結(jié)果值寫入單元格這樣最穩(wěn)妥。設(shè)置Workbook.setForceFormulaRecalculation(true)強(qiáng)制Office打開文件時(shí)重新計(jì)算。實(shí)測(cè)下來(lái)用evaluateAll()在大多數(shù)情況下能解決顯示問(wèn)題但如果公式本身依賴跨Sheet引用建議做一次完整的打開驗(yàn)證。這個(gè)我后面在問(wèn)題排查部分還會(huì)提到。4. 實(shí)操過(guò)程與核心環(huán)節(jié)實(shí)現(xiàn)Excel大數(shù)據(jù)導(dǎo)出與服務(wù)端解析4.1 大數(shù)據(jù)量導(dǎo)出SXSSFWorkbook的滑動(dòng)窗口原理與調(diào)優(yōu)先直接說(shuō)我測(cè)試過(guò)的場(chǎng)景某次模擬項(xiàng)目需要導(dǎo)出50萬(wàn)行、20列的Excel業(yè)務(wù)流水。用XSSFWorkbook寫寫到大概20萬(wàn)行時(shí)內(nèi)存就已經(jīng)飆到將近1.5GB再往后直接拋出OutOfMemoryError。換成SXSSFWorkbook之后內(nèi)存穩(wěn)定在200MB以內(nèi)。SXSSF的核心機(jī)制是“滑動(dòng)窗口”new SXSSFWorkbook(windowSize)中的windowSize表示內(nèi)存中保留的行數(shù)。每新增一行超過(guò)windowSize范圍的行就會(huì)被刷寫到臨時(shí)文件。windowSize默認(rèn)是100但我在實(shí)際項(xiàng)目里通常設(shè)置成1000因?yàn)镾XSSF的行對(duì)象本身比較輕1000這個(gè)數(shù)量級(jí)對(duì)內(nèi)存影響不大又能減少頻繁刷盤帶來(lái)的I/O開銷。SXSSFWorkbook workbook new SXSSFWorkbook(1000); SXSSFSheet sheet workbook.createSheet(流水?dāng)?shù)據(jù)); // 寫表頭 Row headerRow sheet.createRow(0); // ... 設(shè)置表頭樣式和內(nèi)容 // 寫數(shù)據(jù)50萬(wàn)行數(shù)據(jù)循環(huán)寫入 int rowNum 1; for (SomeData data : largeDataList) { Row row sheet.createRow(rowNum); row.createCell(0).setCellValue(data.getId()); row.createCell(1).setCellValue(data.getName()); // ... } // 關(guān)鍵把臨時(shí)文件刷到輸出流然后清理臨時(shí)文件 workbook.write(outputStream); workbook.dispose();這里的dispose()很多人會(huì)漏掉。SXSSFWorkbook在寫完后會(huì)留下臨時(shí)文件如果不顯式調(diào)用dispose()臨時(shí)文件不會(huì)被清理可能造成磁盤空間持續(xù)被占用。我見過(guò)一個(gè)生產(chǎn)環(huán)境出問(wèn)題就是沒(méi)調(diào)dispose每次導(dǎo)出都留下幾十MB的臨時(shí)文件跑了幾個(gè)月磁盤滿了。還有一個(gè)調(diào)優(yōu)點(diǎn)是sheet.trackAllColumnsForAutoSizing()。如果你用了sheet.autoSizeColumn()系統(tǒng)需要掃描每一列的所有行來(lái)計(jì)算列寬。在大數(shù)據(jù)量下這個(gè)操作會(huì)嚴(yán)重影響性能。我的建議是大數(shù)據(jù)導(dǎo)出根本不要用autoSizeColumn直接在代碼里根據(jù)業(yè)務(wù)數(shù)據(jù)長(zhǎng)度計(jì)算最大列寬然后setColumnWidth就完了。4.2 服務(wù)端做Excel解析的全流程文件流、WorkbookFactory與流關(guān)閉服務(wù)端接收上傳的Excel文件解析入庫(kù)這是一個(gè)非常常見的場(chǎng)景。完整的流程并不復(fù)雜但細(xì)節(jié)決定成敗。首先是文件流的問(wèn)題。很多人喜歡把上傳的MultipartFile直接轉(zhuǎn)成InputStream丟給POI這本身沒(méi)錯(cuò)但要注意POI的XSSF解析器在解析xlsx時(shí)底層使用的是ZipInputStream解析過(guò)程中會(huì)從流里讀取大量數(shù)據(jù)。如果你傳入的InputStream網(wǎng)絡(luò)不穩(wěn)定或者沒(méi)有緩沖很容易出現(xiàn)IOException。所以我在傳流之前都會(huì)先把他包裝成BufferedInputStream給IO加一層緩沖。try (InputStream fis new BufferedInputStream(file.getInputStream())) { Workbook workbook WorkbookFactory.create(fis); // 解析邏輯... }然后是Workbook使用完必須關(guān)閉。HSSFWorkbook和XSSFWorkbook都實(shí)現(xiàn)了Closeable不關(guān)閉會(huì)占著文件句柄不釋放。特別是在Windows環(huán)境下不關(guān)閉工作簿Excel文件會(huì)被鎖定后續(xù)刪除文件會(huì)提示“文件被占用”。解析時(shí)的核心邏輯是按行遍歷但要注意空行。用戶隨手敲了幾行空格POI里sheet.getRow()會(huì)返回null或者Row對(duì)象存在但所有單元格都是空的。所以解析循環(huán)里要加一個(gè)判斷for (Row row : sheet) { if (row null || isRowEmpty(row)) { continue; } // 處理業(yè)務(wù)邏輯 } private boolean isRowEmpty(Row row) { for (int c row.getFirstCellNum(); c row.getLastCellNum(); c) { Cell cell row.getCell(c); if (cell ! null cell.getCellType() ! CellType.BLANK) { return false; } } return true; }4.3 樣式讀取與合并單元格處理讀Excel時(shí)業(yè)務(wù)上偶爾需要讀出單元格的合并范圍或者背景色。合并單元格的判斷用sheet.getMergedRegions()返回的是一個(gè)CellRangeAddress列表。遇到合并單元格時(shí)POI的規(guī)則是合并區(qū)域中只有左上角的單元格是有值的其他右下區(qū)域都是空白。如果你遍歷所有單元格去取值合并區(qū)域里非左上角的單元格會(huì)拿到null或空字符串。這時(shí)候需要先構(gòu)建一個(gè)合并區(qū)域到值的映射再去填數(shù)據(jù)否則解析出來(lái)的表格內(nèi)容會(huì)缺一塊。MapString, String mergedValueMap new HashMap(); for (CellRangeAddress range : sheet.getMergedRegions()) { int firstRow range.getFirstRow(); int firstCol range.getFirstColumn(); Cell cell sheet.getRow(firstRow).getCell(firstCol); String value getCellValue(cell); for (int r range.getFirstRow(); r range.getLastRow(); r) { for (int c range.getFirstColumn(); c range.getLastColumn(); c) { mergedValueMap.put(r _ c, value); } } }這樣后面取值時(shí)先看單元格本身有沒(méi)有值沒(méi)有就到這個(gè)映射里查基本能保證合并單元格的內(nèi)容不丟。這個(gè)技巧在處理復(fù)雜報(bào)表時(shí)非常實(shí)用。5. Word與PPTPOI的另一半能力5.1 XWPF處理docx讀取段落、表格、修訂內(nèi)容很多人以為POI只能弄Excel實(shí)際上Word處理也是POI的主場(chǎng)。處理.docx用的是XWPF組件核心對(duì)象是XWPFDocument。一個(gè)文檔由若干個(gè)XWPFParagraph段落和XWPFTable表格組成。讀取Word段落文本代碼非常簡(jiǎn)單XWPFDocument document new XWPFDocument(new FileInputStream(xxx.docx)); for (XWPFParagraph paragraph : document.getParagraphs()) { System.out.println(paragraph.getText()); }表格解析稍微復(fù)雜一點(diǎn)for (XWPFTable table : document.getTables()) { for (XWPFTableRow row : table.getRows()) { for (XWPFTableCell cell : row.getTableCells()) { System.out.println(cell.getText()); } } }這里有個(gè)實(shí)際工作里經(jīng)常遇到的坑Word里的段落不只有正文表格里的內(nèi)容也會(huì)被拆分到document.getParagraphs()里嗎答案是不會(huì)。表格內(nèi)容在getTables()里正文在getParagraphs()里但如果表格跑到文本框里或者嵌套在頁(yè)眉頁(yè)腳里這兩個(gè)方法都可能拿不到。遇到復(fù)雜的docx我一般用document.getBodyElements()遍歷所有body元素再逐個(gè)判斷是段落還是表格。寫入Word相對(duì)簡(jiǎn)單創(chuàng)建XWPFParagraph然后paragraph.createRun().setText(內(nèi)容)就能寫入文本。但要注意POI對(duì)docx的樣式支持比較弱如果你需要復(fù)雜的排版比如頁(yè)眉頁(yè)腳、分頁(yè)符、目錄POI寫起來(lái)會(huì)非常痛苦。我的經(jīng)驗(yàn)是如果只是生成簡(jiǎn)單文本報(bào)告POI完全夠用如果是要生成精美合同或正式公文建議用模板引擎配合docx4j或者干脆用Word模板填充的方式。5.2 XSLF處理pptx從幻燈片里提取文本與批量替換PPT的讀取也是常見需求尤其是“從幾十個(gè)PPT里批量提取全部文字”這種工作。XSLF組件處理.pptx核心對(duì)象是XMLSlideShow。一個(gè)演示文稿包含多個(gè)XSLFSlide每個(gè)slide里有多個(gè)XSLFShape可能是文本框、圖片、表格等。XMLSlideShow ppt new XMLSlideShow(new FileInputStream(xxx.pptx)); for (XSLFSlide slide : ppt.getSlides()) { for (XSLFShape shape : slide.getShapes()) { if (shape instanceof XSLFTextShape) { XSLFTextShape textShape (XSLFTextShape) shape; System.out.println(textShape.getText()); } } }批量替換PPT模板里的占位符文本時(shí)也有一個(gè)坑PPT里的文本框可能包含多個(gè)文本段落每個(gè)段落里有多個(gè)Run直接把占位符字符串塞進(jìn)setText()會(huì)丟失樣式和段落格式。正確做法是遍歷每個(gè)XSLFTextParagraph再遍歷每個(gè)XSLFTextRun在run級(jí)別做字符串替換。這樣替換后能保留原來(lái)字體、大小、顏色等格式。if (shape instanceof XSLFTextShape) { XSLFTextShape textShape (XSLFTextShape) shape; for (XSLFTextParagraph paragraph : textShape.getTextParagraphs()) { for (XSLFTextRun run : paragraph.getTextRuns()) { String rawText run.getRawText(); if (rawText ! null rawText.contains(${name})) { run.setText(rawText.replace(${name}, 某開發(fā)者)); } } } }這個(gè)方案實(shí)測(cè)穩(wěn)定生成的文件在Office和WPS里都能正常打開。如果是處理.ppt老格式用HSLF組件API和XSLF基本對(duì)稱同樣適用。6. 常見問(wèn)題與排查技巧實(shí)錄6.1 問(wèn)題速查表癥狀、原因、解法癥狀原因解法打開POI生成的Excel提示文件損壞寫入過(guò)程中未關(guān)閉Workbook或?qū)懭牒笪磃lush輸出流確保使用try-with-resources關(guān)閉Workbook并在關(guān)閉前調(diào)用workbook.write日期單元格讀出來(lái)是數(shù)字單元格格式類型不是日期格式DateUtil.isCellDateFormatted返回false檢查源文件的單元格格式或者在代碼里加一層自定義日期判斷邏輯長(zhǎng)數(shù)字ID顯示為科學(xué)計(jì)數(shù)法getNumericCellValue()返回double后直接轉(zhuǎn)字符串用BigDecimal.valueOf(...).toPlainString()處理公式單元格顯示0POI寫入公式但沒(méi)有緩存計(jì)算結(jié)果使用FormulaEvaluator.evaluateAll()計(jì)算結(jié)果或設(shè)置setForceFormulaRecalculation(true)大文件寫入OOM使用XSSFWorkbook而非SXSSFWorkbook數(shù)據(jù)量大時(shí)改用SXSSFWorkbook并設(shè)置合理窗口大小解析得到的合并單元格數(shù)據(jù)缺失合并區(qū)域只有左上角有值構(gòu)建合并區(qū)域到值的映射POI導(dǎo)入依賴后方法找不到版本沖突引了低版本的POI依賴統(tǒng)一POI版本排除傳遞性依賴檢查版本號(hào)6.2 版本依賴沖突這個(gè)隱形殺手POI項(xiàng)目里的坑有一大半不是代碼問(wèn)題而是依賴問(wèn)題。POI的包拆得很細(xì)poi、poi-ooxml、poi-ooxml-schemas、poi-scratchpad還有個(gè)xmlbeans。這些包的版本必須嚴(yán)格對(duì)應(yīng)否則運(yùn)行時(shí)會(huì)遇到各種NoClassDefFoundError或NoSuchMethodError排查起來(lái)非常絕望。我的建議是用Maven管理依賴時(shí)POI相關(guān)的所有包全部統(tǒng)一到一個(gè)版本并且用BOM或父POM的dependencyManagement來(lái)約束。如果項(xiàng)目里還有其他依賴間接引用了舊版POI一定要用exclusion排除掉。dependency groupIdorg.apache.poi/groupId artifactIdpoi/artifactId version5.2.5/version /dependency dependency groupIdorg.apache.poi/groupId artifactIdpoi-ooxml/artifactId version5.2.5/version /dependency dependency groupIdorg.apache.poi/groupId artifactIdpoi-scratchpad/artifactId version5.2.5/version /dependency從我實(shí)測(cè)的版本來(lái)看5.x系列在性能和穩(wěn)定性上明顯優(yōu)于3.x系列。如果還在用3.17之類的老版本建議升級(jí)。升級(jí)后需要改的主要是各枚舉常量的命名比如Cell.CELL_TYPE_STRING這種常量改為CellType.STRING枚舉方法簽名上也有部分變化但整體遷移成本不大。6.3 關(guān)于性能實(shí)測(cè)的一些經(jīng)驗(yàn)數(shù)據(jù)有同學(xué)會(huì)問(wèn)POI到底能跑多快這個(gè)沒(méi)法給一個(gè)固定的數(shù)字因?yàn)楹蜋C(jī)器、JVM參數(shù)、數(shù)據(jù)結(jié)構(gòu)復(fù)雜度都有關(guān)。但我可以給幾組我在同樣環(huán)境下的對(duì)比數(shù)據(jù)供參考寫入10萬(wàn)行、10列純字符串XSSFWorkbook耗時(shí)約8秒內(nèi)存峰值約600MB。寫入50萬(wàn)行、10列純字符串SXSSFWorkbook耗時(shí)約35秒內(nèi)存峰值約200MB。讀取10萬(wàn)行、10列數(shù)據(jù)并做簡(jiǎn)單解析XSSFWorkbook耗時(shí)約3秒。這些數(shù)據(jù)的意義在于如果只是萬(wàn)級(jí)數(shù)據(jù)量XSSF和SXSSF差別不大你可以隨便選但到了十萬(wàn)級(jí)以上的導(dǎo)出需求SXSSF就是唯一合理選擇。JVM參數(shù)上也建議導(dǎo)出場(chǎng)景加大堆內(nèi)存比如設(shè)置-Xms512m -Xmx1024m不要在默認(rèn)堆大小下跑大數(shù)據(jù)量操作否則即使SXSSF也扛不住。6.4 排查問(wèn)題的一個(gè)標(biāo)準(zhǔn)姿勢(shì)POI運(yùn)行時(shí)報(bào)錯(cuò)很多人第一反應(yīng)是去搜錯(cuò)誤信息搜半天可能也找不到對(duì)應(yīng)的解決方案。我的排查方法比較固定第一步看異常的第一行是哪個(gè)類拋出來(lái)的。如果類名里帶org.apache.poi那問(wèn)題基本就是POI自身如果是java.lang.NoClassDefFoundError那一定是依賴沖突。第二步看異常的最后一個(gè)Caused by那個(gè)才是底層根本原因。POI的異常經(jīng)常被包裝好幾層只看外層信息完全沒(méi)有意義。第三步如果是讀文件報(bào)錯(cuò)先確認(rèn)文件本身能不能用Office打開。有時(shí)候文件被加密、損壞、或者根本不是真的Excel文件只是改了后綴名的HTML文件POI報(bào)錯(cuò)是正常的這時(shí)候應(yīng)該先跟前端確認(rèn)文件格式規(guī)范。7. POI處理文件類型的一些擴(kuò)展玩法除了Excel、Word、PPT老三樣POI還支持Visio.vsd、Publisher.pub等格式但這些邊緣格式在實(shí)際項(xiàng)目中很少用到我就不展開了。更值得關(guān)注的是POI在項(xiàng)目里的一些擴(kuò)展玩法國(guó)際化Excel導(dǎo)出通過(guò)Locale和日期格式綁定自動(dòng)給不同語(yǔ)言環(huán)境生成對(duì)應(yīng)格式的日期、貨幣列。結(jié)合模板生成報(bào)表提前做一份帶樣式和公式的xlsx模板用POI打開后只填數(shù)據(jù)區(qū)域保留模板里的原有樣式。這個(gè)方案能省去大量樣式代碼做出來(lái)的報(bào)表外觀也最靠譜。讀取PPT備注信息XSLFSlide.getNotes()能讀取演講者備注可以做“批量提取所有PPT備注并匯總成文檔”的小工具實(shí)測(cè)效率極高。導(dǎo)出加密ExcelPOI支持對(duì)Workbook設(shè)置密碼workbook.writeProtectWorkbook(password, username)或sheet.protectSheet(password)。這里注意這個(gè)保護(hù)級(jí)別比較低只能防君子不能防小人如果需求是強(qiáng)加密建議用poi-ooxml底層的加密方式來(lái)寫。這些擴(kuò)展玩法里我實(shí)際落地最多的還是模板填數(shù)據(jù)方案。做月度數(shù)據(jù)報(bào)表時(shí)把模板樣式、頁(yè)眉、Logo都提前在Excel里調(diào)好POI只負(fù)責(zé)寫入數(shù)據(jù)行。這樣不管業(yè)務(wù)怎么改樣式開發(fā)這邊基本不用動(dòng)代碼改模板就夠了交付效率和維護(hù)成本都比純代碼生成樣式好太多。8. 實(shí)操中反復(fù)踩過(guò)的幾個(gè)坑最后分享幾個(gè)我在項(xiàng)目里真正踩過(guò)、并且導(dǎo)致線上事故的細(xì)節(jié)。這些不算高深技術(shù)但非常容易忽略。第一個(gè)是Workbook關(guān)閉順序。我見過(guò)有人把workbook.write(outputStream)放在finally塊里但outputStream還沒(méi)flush就關(guān)了Workbook結(jié)果文件缺失末尾數(shù)據(jù)。正確順序是先寫完Workbook再關(guān)閉Workbook最后關(guān)閉輸出流。用try-with-resources嵌套就可以保證這個(gè)順序。try (Workbook workbook new XSSFWorkbook(); ByteArrayOutputStream out new ByteArrayOutputStream()) { // 填充數(shù)據(jù) workbook.write(out); // out.toByteArray() 寫入文件或返回給前端 }第二個(gè)是SXSSF的臨時(shí)文件目錄。SXSSFWorkbook寫臨時(shí)文件默認(rèn)使用系統(tǒng)臨時(shí)目錄在某些容器環(huán)境里臨時(shí)目錄權(quán)限受限會(huì)拋出java.io.IOException: No such file or directory。遇到這個(gè)問(wèn)題可以用System.setProperty(java.io.tmpdir, /自定義目錄)或者顯式配置SXSSFWorkbook的臨時(shí)目錄來(lái)規(guī)避。第三個(gè)是關(guān)于內(nèi)存監(jiān)控。我建議在POI處理的代碼里加一個(gè)輕量級(jí)的內(nèi)存日志用Runtime.getRuntime().totalMemory() - freeMemory()算一下當(dāng)前堆內(nèi)存占用處理前后各打一條。這樣在上線后就能直觀看到文件操作對(duì)內(nèi)存的影響不會(huì)等到OOM了才后知后覺(jué)。個(gè)人經(jīng)驗(yàn)是POI這個(gè)東西上手容易精通需要積累。大部分人在初期都會(huì)把時(shí)間花在死磕API上但真正決定項(xiàng)目穩(wěn)定性的往往是版本管理、流關(guān)閉、內(nèi)存控制和異常處理這些看起來(lái)不起眼的細(xì)節(jié)。只要這幾個(gè)點(diǎn)都處理好了POI在絕大多數(shù)場(chǎng)景下都能交出讓人滿意的答卷。如果你正在為某個(gè)Office文件處理需求選型從一個(gè)小的工具類開始用POI練手我覺(jué)得是最快的入門路徑。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩天天本| 九热中文字幕| 国语对白在线播放视频| 国产自制av蜜乳| 老熟女熟妇| 成人免费不卡在线视频| 亚洲av无码成电影在线播放| 4tube欧美女厕所| 性欧美体内射精| 成人亚欧免费视频| 欧美 精品国产制服第一页| 五月开心久久AV官网| 亚洲二区精品在线观看| 先锋影音av先锋一区| 久久久无码精品人妻二区| 伊色综合天堂色97| 伊人婷婷五月天| 日日躁夜夜躁狠狠躁超爽| 夜夜爽77777| 日韩国产在线观看av| 91亚洲影视| 亚洲一区二区 麻豆传媒| 少妇滛荡视频| 亚洲乱伦图片视频| 熟女这里只有精品6| 人妻激情视频| 亚洲。天堂。日本在线观看| 欧美A√综合网| 日韩另类| 国产精品大香蕉| www.av在线视频| 国产精品视屏| 97超碰久久| 玖玖综合视频| 青青青草伊人精品| 久久婷婷一区| 人人妻人人爱人人玩| 97欧美日韩精品| 超碰综合97在线| 亚洲色9| 狠狠狠狠狠狠| 色激情五月天| 精品中文字幕一区二区l - 百度| 男女做爰猛烈动高潮A片免费应用| 四季av一区二区凹凸精品小说| 夜夜操天天肏| 亚洲精品欧美专业| 日本不卡码黄色| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 久久久久国产精品喷潮免费观看臀| 啊啊嗯嗯好爽| 综合久久久久久久久91| 国产精品久久久无码aV去| 91精品国产91久久福利| 91丰满| 97超碰伊人| 久久久草草精品| 97情超碰色| 色哟哟av网址| 玖玖资源视频一区二区三区| 日韩有码中文字幕女同性恋| 久久超碰com| 久久精品一区二区三区四区五区| 亚洲欧美综合网| 97超碰香蕉| 在线观看中文字幕| 91精品微拍福利| 一起草日韩| 成人免费在线网站| 中出789在线视频| 大香蕉青青9| 亚洲男人天堂2013| 777超碰| 国产97在线 | 亚洲| 97在线免费看视频| 日韩在线地址一| 天天躁日日躁AAA片李宗瑞| 99久久精品无码一区二区毛片免费 | 久久午夜伦| 性一交一乱一交A片久久四色| 黄网在线播放| 91综合熟女| 蜜臀久久99精品久久久久久无删减 | 大香蕉日亚洲日本亚大| 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 蜜臀久久99精品久久久久久无删减| 精品视频一区二区| 亚欧无码在线| 国产农村妇女精品一| 中文字幕人妻色偷偷久久皮| 久久久免费高清中文视频| 九九热av| 日韩欧美成人午夜福利| 亚洲情色91| 蜜桃狠狠色伊人亚洲综合 | 欧美大色交| 日日躁天天躁狠狠躁| 青青草一区二区高清无码视频| 91丝袜在线观看| 97 九色| 久久久九九| 色香欲综合| 国产日产精品久久快鸭的功能介绍| 国产无马视频| 国产精品一级二级在线| 欧美性生活男人的天堂| 五月丁香啪啪| 91殴美| 肉嘟嘟www视频在线观看高清| 天天综合网站| 亚洲中文字幕一区二区| 97摸视频| 美女的肌被草喷水视频| 青草地一本线一区二区三区| 亚洲国产一区二区三区四区国产| 亚州色图片在线色| 囯戸精品高潮呻吟旡码| 欧色综合| 欧美一级A一级a爱片久久| 欧美日韩国内不卡| 国内精品久9| 大香蕉黄色一级片免费看| 久久久久成人蜜桃精品| 国产农村妇女毛片精品久久| 日韩精品99999| 超碰到97情色| 综合色图区| 伊人在线大香蕉视频久久| 免费的黄片有限公司| 一区二区你上我| 四虎884| 大香蕉久| 91美女视频。| 伊人久久艹| 天天拍天| 欧美顶级黄片AAAAA在线免费看| 蘋果手機免費看成人Av| 91精品国产综合久久久蜜臀酒店| 熟女人妻一区二区三区| 亚洲AV成人精品网站在AV| 韩国成人精品久久久免费看 | 亚洲骚男同com| 大肥女高潮bbwbbwhd视频| 超碰 另类 欧美| 啊啊啊啊啊啊啊网址在线观看| 色网站导航大全| 久久国99999| 无码 黑人一区二区三区| 伊人97色天使| 亚洲熟女性高潮久久久| 欧美玖玖爱免费玖玖| 91人妻精华帖| 老鸭窝在线视频播放| 综合一区中亚洲国产成人综合精品| 97超碰总站| 亚洲黄网在哪免费看| 国产2.3.4区| 狠狠操狠狠爱| 熟妇综合一区二区三区| 啪啪视频亚洲第一| 97超碰这里只有精品| 久久av成人无码免费| 人妻内射一区二区在线视频| 91狠婷| 极品国产内射| 亚洲AV不卡在线观看| 人人操人人狠狠操| 激情文学88| 秋霞鲁丝午夜无码一区二区三| 五月丁香激情啪啪| 久久毛卡| 色操逼网| 天天综合-91入口| 在线综合 亚洲 欧美中文字幕| 人人操人人摸人人看人人插| 加勒比色99999| 天天综合91在线| 国产精品 久久久精品一牛| 丰满熟妇大乳做爰| 一区二区三区色综合| 久草五月| 麻花传媒免费网站在线观看| 中国AV美女| 欧美成人贴图| 亚洲限制级| www.夜夜| 激情综合亚洲| 久久直播国产| 性爱网站一区二区| 亚洲情色欧美| 搡老女人老91二区| 2017天天插| 欧美91精彩| 亚洲精品男人的天堂| 亚欧毛片基地国产毛片基地| 97极品无码| 色偷综合| 亚洲人妻熟妇三十三区| 丁香六月天| 99精品视频在线观看免费| 嗯啊不要在线| 欧美日韩岛国大片在线观看| 欧美综合娱乐久久| 日韩精品国产一区二区| 中文字幕丰满人妻日本| 久久人妻熟女一区二区| 97伊人超碰| 欧美性综合| 青青草伊人久久| 九九激情网| 日本女优在线视频福利| 欧美亚洲色图另类国产| 日本性爰一道本| 久久丁香久草综合网| 伊人超碰97| 99久在线精品99re8| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊| 欧美第38页| 91蜜臀在线久久久久| 大地资源在线观看中文第二页| 四虎国产精品永久地址入口| 乱伦a片视频| 午夜福利激情在线视频| 男女日B国产| 蜜臀久久99精品久久久久久无删减 | 视频在线中文字幕| 中文字幕无码不卡啪啪| 蜜臀99久久国产| 久久久精品,3| 尤物av网站免费在线播放| 91精品91久久久中77777| 91狠狠狠| 九九九九九九九九九国产精品| 99热18这里只有精品| 久久久99999久网站| 97操在线| 亚洲精品熟妇1区2区3区。| 91九色丰满高潮| 久久性爱网站| 四虎影院成年人片| 九九九九九九九精品视频| 午夜乱轮操逼视频免费看| 亚洲色图尤物视频 | 蜜臀99999| 久久伊人青青草| 天美精品一区二区三区四区在线观看| 国产精品丝袜久久亚洲不卡| 抽插一区二区视频| 97视频在线| 国产福利电影| 性爱av在线免费观看| 乱伦熟女区| 亚洲午夜免费狠狠干| 91neishe| 97视频在线观看网站| 久久精品女同亚洲女同13| 日曰骚久久精品| 国产免费一区2区3区| 性爱综合一区二区| 秋霞欧美性爰视频| 欧美一级欧美三级在线观看| aV中文麻| 人人操人人操人人操人人操人人操人人人11.CM | 操逼逼无码| 91色艳| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | wwwxxx日本爽| 色综合九九| 亚射在线| 日天天九九天堂666| 20cm女自慰在线日韩欧美| 国产欧美精选自拍一区| 亚洲人妻一区二区三区| 中出人妻中文字幕91在线| 中文字幕在线免费观看2| 欧美强奸乱能| 欧美日韩淫加| 偷拍亚洲| 五月婷婷激情| 97超级久久| 中文字幕一二区二三区人妻专区| 精品国产乱码久久久久A| 色拍偷亚洲| 青娱乐手机日韩在线视频| 欧美精品69性爱| 亚洲综合嫩| 亚洲一区制服诱惑| 嗯嗯啊啊啊好爽| 久久这里只有精品9| 天天躁日日躁狠狠躁| 色呦呦国产精品免费看| 色综合久久88色综合久久天天| 日韩色| 精品国产乱码久久久久久口爆网站 | 性夜影院爽黄A爽免费动漫| 黄色成年| 青娱乐休闲视频在线观看| www.亚洲黄色| 蜜臀少妇一区二区| 天天情欲宗合网| 国产精品久久久| 天天干夜夜操网| 亚洲高潮少妇| 亚洲中文字幕一区| 日韩中文字幕国产| 后入美女国产| 日本天天干天天操一区| 久久久久国产一区二| 久久中出在线| 78m啪啪啪| 国产av波波国产精品| 性一交一乱一交A片久久四色| 啊啊啊操一区| 亚洲精品97久久| 国产又粗又长又爽又色| 欧美色爱综合| 色丁香五月婷婷| 九九av| 热久久国产| 色性综合| 午夜120视频在线观看| 欧美少妇高潮久久91| 国语对白露脸XXXXXX| 熟妇人妻一区二区| 午夜小电影在线插入淫高潮| 成人情色一区二区| 欧美亚洲宗合色性图| 99这里只有精品国产| 久久久9视频| 午夜爽爽爽| 日本天天色| 欧美日韩色| 美女视频尤物网在线看| 久久精品人体| 国产精品69人妻无码久久久| 激情在线青青操| 天天综合精品| 亚洲国产成人7777| 天天操人人操骚逼网站| 美女啊啊啊啊啊| 精品久久久无码| 欧美黄页| 国产91丝袜 在线播放| 黑丝自慰喷水网站| 色女免费在线观看视频网址| 丁香婷婷久久 | 天天操天天舔| 性色av大全| 亚洲日本大香蕉1| 欧美偷拍区| 高清国产性猛交xxxx乱大交| 久久久久成人亚洲国产| 青青草中文-久久青草精品一区二区三| 大香蕉 222| 欧美影音在线| 97超碰香蕉| 国产成人无码啪| 91 亚洲情侣偷拍 久久| 97超级久久强资源| 大香蕉综合| 国产三级资源在线观看| 久久精品一区一起草| 日本一级性爱| 日韩另类| 国产成人网址| 色色99| 日韩欧美经典在线观看| 特级特黄一级毛片免费| 东北少妇高潮zzzz| 成年人黄色小视频网站| 亚洲AV麻豆Aⅴ无码电影一| 亚洲美欧999| 亚洲色综合| 国语av最新自产拍在线观看| 色999;丁香五月| 午夜精品一区二区三区三上悠亚| 久久久com| 久久天堂婷婷网| 五月丁香啪啪网| 亚洲夜夜欢无码一区二区| 视频在线观看免费一区二区三区| 欧美日韩999| 性爱综合网| 日韩人妻一区二区| 97超碰超| 91少妇| 国产精品自拍xxxx| 国产熟码AV| 麻豆精品三区视频| 中文字幕精品一区二区精品| 中文字幕88av在线| 欧美亚洲宗合色性图| 麻豆久久久久久久久丝袜| 嗯嗯啊啊操死我| 97久久国产亚洲精品超碰热| 91人妻久久久久久久久久久久久| 欧美亚州色的图| 久久亚洲AV无码白度| 国产女人91精品嗷嗷嗷嗷| 国产欧美一区激情交| 欧美日韩大陆黑人少妇99| 九九英色视频| 亚洲天堂在线怕怕视频| 96AV久久久| 自拍鲍鱼一区在线高清观看免费| 亚洲少妇视频| 欧美日韩午夜精品一区二区三区 | 玖玖爱伊人玖玖爱| 欧美精品97| 91亚洲网站| 欧美精品99久久久**| 一起草欧美| 97香蕉碰碰人妻国产欧美| 欧美在线干| 色一色综合网| 婷婷人妻激情| 岛国毛片手机在线观看| 嗯嗯啊啊好疼| 免费观看网黄| 日韩av熟女一区二区三区成人| 99色网| 花野真衣| 波多野42部无码喷潮在线观看 | 天天影视91看看| www.人人cao| 精品久久久久久久久久久久 | 六月激情婷婷| 色狠狠一区二区三区香蕉| A片 AV一级在线播放观看免费 | 熟妇高潮精品一区二区三区下载| 日韩av一级黄片| 亚洲人妻色图| 天堂伊人久久| 亚洲 欧美 手机在线观看| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 99人妻| av资源在线观看少妇| 97超碰9| 欧美亚洲激情小说| 色哟哟AⅤ| 亚洲熟久久| 99这里都是精品| 日本精品中文字幕视频| 女人一区| 黑丝91视频| 日韩精品黄片免费观看| 亚洲日韩av专区无码| 久久熟女久| 99e久久国产精品| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 人人搞人人插人人操| 91人妻尻屄视频| 国产一区二区在线播放| 激情五月天婷婷| 色欲久久久久综合网| 欧美 色 亚洲| 91搡老女人老妇女老熟女歌词翻译| 欧美特大黄一级片片免费| 国产成人免费观看在线视频| 日本精品成人无码| 偷拍亚洲视频一区二区三区四区| 久9久9久9久9久9久9| 熟女欧美日韩综合婷婷| 麻豆国产av网| 亚洲国产欧美日韩人妻日中文| 成人蜜乳小视频网站| 久艹视频在线| 吊色| 亚洲91射| 日日摸日日弄日日拍| 国产日逼视频| 中文字幕一区二区三区四五区| 欧美色97| 果冻传媒A片一二三区| 99热8| 久久婷婷欧美| 久久色AV线| 综合熟妇一区二区三区| 亚洲成人美女无吗| 欧亚不卡| 91综合熟女| 八戒午夜福利理论片| 亚洲精品97| 日韩亚洲精品一区二区| 91精品无码人妻系列| 亚洲无码?第一页| 久久曰曰| 中文97国产| 国产传媒av天美传媒在线| 国产400孕妇孕交群| 免费家庭乱伦视频| 日本高清一区二区在线| 97超碰天天爱天天爱| 亚洲精品天天影视综合网 | 国产伦精品免编号公布| 97久久久久| 蜜乳av一区二区三区| 国产在线观看一区二区三区| 色噜噜人妻av 中文字幕| 婷婷综合在线| 伦理第一页| 色欧美亚洲| AV综合中文字幕干| 天天日天天屌天天操| 欧洲亚洲人妻无码久久三区四区| 国产精品盗摄 偷窥盗摄| 国产成人+综合亚洲+天堂| 亚洲AV资源| 成人草草视频| 中日韩欧美精品无码AⅤ一区二区| 亚州色交| 伊人麻豆传媒| 中文字幕成人理论在线| 亚洲色9| 一本色道久久综合精品婷婷| 日韩无码视频黄色| 欧美视频激情久久久久久| 黑人精品XXX一区一二区| 五月婷婷六月丁香| 久久久久白虎| 97久久精品不卡| 欧美在线伊人色| 极品少妇久久久久| 狠狠色婷婷7777久| 天天操福利视频综合网站| 日本三级一区二区 在线| 久久久久密| 久久精品一区一起草| 校园春色制服丝袜中文字亚洲| 性色生活片久久毛片婬片免费放女人一级毛片| www.99中文字幕| 国产农村妇女精品一二区| 亚洲色图A| 夜夜一区二区| 国产精品视频麻豆入口| 青青欧洲黑| 欧美人妻精品一区二区| 热热色青青草| 91精品丝袜久久久久久无码人妻| 日本人妻伦在线中文字幕| 91人妻做a观看视频| 亚洲综合贴图91| 97av,com| 精品一区二区综合熟妇| 欧美日韩在线视频网站| 欧美性爱一区二区三区| 亚洲精品天天影视综合网| 为用户提供免费看黄网址在线观看| 亚洲自拍欧美国产首页网曝 | 国产精品人妻无码久久久互動交流 | 91制服丝袜| 九九九久千久久激情蜜桃在线看 | 日本黄色天堂| 一区=区三区视频| 男人天堂一区二区| 婷婷四五区| 岛国色情视频在线观看| 天天干18禁| 欧美中文狠| 性色高清在线| 97色五月天完| 亚洲欧美日韩综合在线尤物 | 五月香婷婷| 亚洲福利中文字幕在线| 女人被添高潮免费视频| 日本五十路熟女一区二区| 亚洲男人久久综合天堂| 9999久久久| 99色热| 亚洲久久天堂| 日本不卡一区二区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 后入 亚洲 美女 射| 丰满人妻一区二区三区| 男男H黄动漫啪啪无遮挡网站| 18禁的网站在线| 五月丁香狠狠爱| 嗯啊不要在线| 色网在线| 91n免费处女| 人妻出轨一区二区三区| 欧美综合色综合| 免费视频一二三区| 你懂的在线观看区国产| 为用户提供免费看黄网址在线观看| 日本一区不卡| 国产在线视视频有精品| 操久久久久久| 久久超碰98| julia ann久久| 东北女人性交| 国产女人与拘做受视频免费| 一个人免费HD91视频| 免费A V在线| 色噜噜人妻丝袜a∨先锋影| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 嗯嗯啊在线视频| 人妻超碰青青草98| 亚洲脚交| 人妻啪| 婷婷五月天丁香| 国产青视频| 蜜臀久久99精品久久久久久无删减 | 视频一区二区免费在线| 在线不卡视频| 欧美洲精品一级| 日日操免费视频| 久久草在线综合视频| 亚洲drav色图| 亚洲欧美国产其他二区| 日日干夜夜骑| 色99999| 丝袜AV一区二区三区| 免费观看的av| 美女网站91| 久久久18| 国产日韩怡红院| 老色69| 久久九九97| 青草av在线| 久久一区二区加油站| 国产乱伦性爱区| AV老汉| 日韩图区 偷拍| 亚洲 欧美 小说| 人人操人人色网| 国产天美欧美| 尤物黄色在线观看网站| 欧美暴力猛交| 中文字幕 国产区| 少妇综合网| 欧美日韩青操| 日韩A优精品在线观看| 青青操视频在线| 狠狠色噜噜狠狠狠狠狠色综合久久| 日韩综合第八区国产精品| 精品国产乱码久久久久久口爆网站| 国产欧美日韩臀| a在线观看| 91久久| 色综合 加勒比| 性色一线| 亚洲精品成人激情在线| 久久αⅴ| 欧美体内射精| 女一区二区| 97人人草| 久久男人精品| 九九九热| 无遮挡男女激烈动态图| 伊人九九| 亚洲人妻久久久| 亚洲美女精品| 日韩丝袜人妻AV| 你想操日本小逼吗| 国产一区二区三区高清视频| 亚洲综合69| 美腿丝袜高跟网免费视频免费视频| 8050无码八戒| 国产自产自拍| 成年女人黄网站| AV网站高清无码在线观看| 青娱乐国产剧情av一区| 婷婷超| 欧美一区二区一级岛国大片| av亚欧| 女生久久网| 啊啊啊骚| 久久精品一区二区三区四区五区| 97色欧洲| 加勒比伊人影院| 熟女中出视频| 人妻在线臀日韩| 97超碰天天爱天天爱| 国产夜夜艹| 97色色,97综合| 天堂综合| 黑人综合网| 永久免费观看的毛片的网站| 亚洲午夜未满十八勿入网站日本又色又爽又黄| 97超碰超碰| 天天干夜夜操一区二区| 色悠久| 张柏芝国产一区在线观看| 日韩免费在线观看不卡| 密臀视频三区免费网站| 亚洲性高潮| 欧美1区二区三区公司| 蜜乳av首页| 天堂蜜桃无码视频一区二区| 丁香六月激情| 亚洲乱色视频一区、二区在线| 中文字幕交换人妻| 色香综合| 操b网站亚洲无码| 加勒比久久av| 国产99999| 秋霞成人做爱| 亚洲美女黄色| 亚洲做性| 久久99午夜精品一区人妻| 久久久久久精品免费看A级| 久久综合99| 亚洲一区制服诱惑| 麻豆精品一区二区三区四区免费观看| 国产一区二区三区白丝| 91暧暧| 偷拍亚洲| 黄色av一区二区在线| 宅男91视频在线播放| 天天亚洲| 偷窥自拍亚洲天堂网爆| 99色骚| 最新av中文字幕高清| 黄片com.| 91日产欧美| 精品亚洲国产成人av网站| 国产精品丝袜久久亚洲不卡| 综合伊人激情| 日韩激情视频| 国产精品免费美女视频| 久久精品中文| 少妇毛片久久| 三级特黄60分钟播放| 色色色色日本| 超碰在线免费一区二区三区| 亚洲欧美综合色| 加勒比综合网| 97国产超碰| ?亚洲伊人伊成久久人综合网| 夜夜嗨av午夜成人| 精品无码秘 人妻一区二区| 亚洲情色婷婷五月天| 草草影院日本第一页| 乱理日韩中文| 国产精品无码论坛| 亚洲97在线观看| 天天综合网91入口| 久久人人爽人人爽人人片Ⅴ| 亚洲欧洲日韩中文字幕一区| 色爽爽文学| 911粉嫩人妻| 啊啊啊啊啊啊好多水| 色偷综合| 国产操偷| 欧美人妻少妇| 91美女国产在线| 综合久久欧美| 久久无码电影| 自拍视频一区在线观看| 精品九九九九| 国产999精品久久久| 九九热超碰| 免费看黄片现成| 久久9精品| 屌逼传媒| 色嘟嘟人妻天堂网| 亚洲国产午夜真人一级片中文字幕精品黄网站| 色欲色香天天天综合网www-亚洲综合国| 9久热| 91精品人妻电影| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 黄色片G G G| 日韩少妇丰满亚洲| 免費人妻夜夜爽天天爽爽一区| 丝袜足交视频| 男女日B国产| 欧美精品23| 伊人97| 国产蜜臀在线| 成人国产二区三区在线,男女精品。| 91AV天美在线视频| 久草色悠悠在线视频| 97免费免费视频网| 欧美爆操91| 九九色精品| 欧美日韩夜夜| 亚洲综合113页| 欧美综合97www| 亚洲精品色| 一区二区精品更新提醒| 99青青草国产视频| 日韩欧美~中文字| 精品无码产区一区二| 老熟乱一区二区三区四区| 精品人妻一区二区三区日产| 美女丝袜激情小说| 国产视频人人网| 亚洲av综合色| 日本三级小说中文字幕| 亚洲诱惑天堂| 91呆哥人妻| 欧洲中文字幕| 欧美女同在线| 肉动漫无遮挡h在线观看| WWW操逼| 怡红院一区二区熟女人妻| 另类天堂| 婷婷五月天无码 | 蜜臀AV网站| 久久久一热在线播放| 后入福利| 中文字幕精品日韩中文字幕| 日韩中字av一区| 色性荡荡荡荡视频| 欧美成人色| 青青久久久| 日本熟妇人妻中出视频| 久久超碰亚洲人| 欧美劲爆第一页| 日本一级性爱| 欧美色图亚洲特色| 欧美成人免费在线观看| 久久婷婷色综合一区二区三区| 久久华人网| 欧美 日韩 亚洲 春色| 色婷婷影院| 91色噜噜狠狠| 秋霞怕怕片| www.高清无码诱惑一区.com | 开心五月天激情网| 99re在线精品78| 午夜人人操| 亚洲精品欧洲精品| 国产色产精品在线观看| 人妻蜜桃臀| 中文字幕乱在线伦视频中文字幕乱码在线 | 男人的天堂久久狠| 日本一区二区三区四区免费观看| 日本一区视频在线观看| 激情抓乳插进去啪啪啪日韩 | 国产原创精品| 情色五月天就去干| 日本成人免费一区二区三区| 美女高潮视频91| 人人 操人人 操人人| 大香网伊人久久综合网eew| 亚洲国产欧美另类自拍| 日日妻色网| 成人网站 免费观看| 婷婷8月天青娱乐| 中文字幕老熟妇黄色视频| 超碰国产精品无码| 欧美亚洲特P| 国产精品一区二区三区免费视频| 青青草十区九区爱夜| 日韩乱伦视频| 国产品精品自在在线午夜免费| 亚洲欧美日韩国产丝袜自拍中文| 天天躁日日躁AAAXX| 免费福利视频中文字幕| 九九热精品视频六| 欧美A√综合网| 免费看日产一区二区三区| 国产在线播放成人免费| 91精品国久久久久久无码| 日本一二区免费| 狠狠久久亚洲欧美专区| 欧美AAAA黄片| 久久精品成人一区二区三区蜜臀| 久久婷婷视频| 国产AV无码AV| 欧美综合娱乐久久| www国产天美久久久| 天天网综合| 东京热熟女亚洲视频网站| 国产超碰| 国产精品区在线12p| 亚洲色欧| 蜜屁av| 一区二区三区一亚洲中文字幕、综合区灬| 亚洲日韩97| 日韩欧美女求操每天更新| 精品二区三四区五电影 | 亚洲国产精品无码AV久久| 大香蕉专区| 国产农村妇女精品一| 亚州熟女乱伦| 99re8免费高清在线| 91丨九色丨国产丨人妻在线 | 亚洲 欧美日韩 另类| 亚洲素人综合| 激情综合五月| 一级片视频啪啪| 操死我了嗯嗯嗯| 日韩性爱小视频在线观看| 亚洲精品国产拍免费91在线| 久久久久久国产精品| 精品国产乱码久久久久久久| 中文字幕在线播放2中文字幕在线观看2| 91春色| 久久av网| 人妻日日干| 国产乱不卡| 国产精品秘 福利姬在线观看| 亚洲精品一卡二卡三卡福利视频网站| 极品尤物女神在线观看| 唯美清纯 妖精视频| 五月激情视频| 色呦呦国产精品免费看| 91 国产丝袜在线播放-百度| 激情综合五月| 综合久久久久久久综合网| 青娱乐大香蕉| 久久伊人大香蕉| 日韩操逼性鲍| 亚洲天堂另类| 东北女人| 人人人人人人少妇| 欧美极品性爱天天射| 日本 情色 1区2区3区| 久久久蜜桃一区二区三区| 国产成年女黄特黄| 后入式五六区| 激情小说五月天| 日本不卡三级网在线播放| 国产亚洲精品美女久久久久久2021| 亚洲第二页| 国产高清1234区| 91人妻尻屄视频| 欧美色图第一页| 97色欧州| 国产不卡免费在线视频| 亚洲综合九九| 加勒比色99999| 北京美女一区二区| 色色色999| 天天做日日做| 不卡中文字幕aⅴ在线| 国产精品久久蜜乳av| 国产小炒后入式| 久久久久9| 天天做天天爱| 久热这里| 骚乳在线| 熟女精品一区二区三区| 97视频在线免费| 熟女天天干| 久久熟女人| 熟妇熟女亚洲天堂网| 国产成年精品高清在线观看91| 国产精品扒开腿做爽爽爽视频| 国内精品久9| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 高潮毛片无遮挡高清免费| 91青青草| 日日爱99| 欧亚日韩一区在线| 欧成人精品H无码| 青青青青青手机视频| 97操97干| 日韩无码服务区| 亚洲玖玖爱| 97精品一区| 亚洲综合色图欧美| 在线洲亚线| 午夜操一视频一区| 日本一线产区和二线产区伦理片| 人人操超碰在线| 青草伊人网| 欧美色图校园春色| 熟女熟妇一区二区三四区| 草草草视频| 9999久久久| 美女天天干| 操逼逼一区视频| 黄色激情电影在线观看| 亚洲小电影免费涩涩成人在线高清| 黄色激情电影在线观看| 久久黄色性爱视频| 免费A V在线播放| 女人爽到高潮潮喷18禁网站| 99精品在线观看| 95精品在线| 亚洲图片欧美制度| 伊人991| 无码九九| 黄页| 国产极品粉嫩馒头一线天av| 五月婷婷六月丁香网址| 国产探花精品在线| 欧美精品99久久久**| 中文久久爆乳| 色狠狠综合| 亚洲色图 欧美热图 清纯唯美 另类自拍| 精品大久久| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊 | 久久综合亚洲色1080p| 国产动漫操逼视频| 嗯嗯啊在线视频| 欧亚第一综合网| 精品综合久久久久久97| 丝袜美腿射精91| 精品一区二区三区蜜桃| 91精品无码久久久久久久| 粉嫩av久久一区二区三区| 郑州宾馆老熟女露脸啪啪| 婷婷操逼| 97色色国产视频| 日韩本不卡视频在线观看| 日语五十路和六十路亚洲国产精品 | 亚洲欧洲精品视频发布| 综合五月婷婷| 另类av天堂| 日本一二三免费久久| 午夜国产综合视频在线观看| 台湾成人无码AV| 91国产精品在线看| 中文字幕精品乱码| 婷婷综合伊人一区| 男人 天堂 日 亚洲| 性生活性生大爱77AV国产 | 强奸乱伦动态污图免费| 天美av在线观看| 久久最新视频免费观看| 91免费看中出视频| 天天操天天射天天日| 亚洲男人bt天堂| 九九九九免费视频| 自拍偷拍 日韩欧美| 99天堂网| 性色乱AV一区二区| 成人青青草原伊人| 亚洲高清国产理伦片| 国产欧美一区激情交| 91国产美女丝袜足交精品视频 | 日韩精品人妻系列无码天堂| 熟女少妇视频| 久久综合激情| 丝袜美腿操av| 久久99视频| 欧美色亚洲色| 第一高清av中文字幕| 久久熟女嫩草成人片免费| 可能人人看人人摸| 亚洲综合贴图91 | 久久久久久久六六 | 丁香九月激情啪| 久久夜精品一区二区三区| 青娱乐999| 欧美亚洲国内自拍| 麻豆91熟妇人妻中文字幕茄子| 亚洲国产麻豆一区二区三区| 亚洲国产第一页综合视频| 青青青艹在线视频| 国模私拍一区二区三区神乳| 蜜桃视频精品一区二区| 亚洲AV在线资源| 日本操大逼| 性爱AV天堂| 眼镜人妻101.com| caopeng97人妻| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 操逼网站视频漫画国产| 色欧洲97| 看一级特黄a大一片| 久热久| 日韩亚洲中文有码视频| 99久久无色码| 久久久久久久强迫| 精品大久久| 91国产操逼视频| 大香蕉色网| 高清国产性猛交xxxx乱大交| 天天做天天爽| 天天久久| 97玖玖人妻| 亚洲精品一区二区精品| 久久蜜色情在线视频xxx免费观看| 四虎国产精品永久入口| 嗯嗯啊啊视频在线看| 婷婷人妻激情| 天天干,夜夜爽| 色777999综合| 精品久热| 99热在线观看| 第四色亚洲色图| 精品无码秘 人妻一区二区| 久久大香蕉| 97久久精品| 欧美色图成人网一区二区| 天天摸夜夜添无码小视频| 亚洲欧美日韩中文久久自慰| 脫衣舞一区二区三区| 2003天天干夜夜操| 亚洲天堂,男人| 一级性爱网| 1024午夜激情男人的天堂| 国产精品亚洲免费| 人人妻人人爽人人精品| 超碰在线在公开超碰在线在公开| 明星性猛交ⅹxxx乱大交| 老女人老91妇女老热女| 九九热视频在线观看| 6080YYY午夜理论片在线观看| 亚洲美腿丝袜香蕉影视欧美成人| 亚洲欧洲小说图片视频| 久久久久九九九| 男女激情黄色网址| 欧美亚洲天堂| 男人的天堂三级| 美日韩一卡二卡三卡免费人妻精品| 亚洲精美粉嫩嫩泬在线观看 | 亚洲熟伦熟妇AV无码春色| 色偷偷人人玩人人舔人人操人人摸人人爽| 六月婷婷综合| 国产三级中文有码在线视频| 亚洲不卡三级手机播放| 男人的天堂三级| 亚洲精品美女操逼| 夜夜爽妓女| 可以免费观看的AV| 国产懂色精品国产av| 日韩综合成人免费视频| 亚洲全色网| 国产日本顶级一区二区三区| 91日产欧美| 97超碰天天爱天天爱| 人妻熟女字幕一区二区| 97最新在线播放视频| 国产精品久久99日日| 亚洲国产精品成人综合| 狠狠超| 男女啊啊啊啊啊| 亚洲美女高潮喷水视频| 午夜无码熟妇丰满人妻| 欧美一区二区成人一卡| 91色黑人少妇| 久久综合18p| 亚洲有码 欧美精品| 国产伦精品一区二区三区在线观| 人人摸人人添人人操| 久久国产免费激情视频| 偷拍偷窥与盗摄视频专区| 日韩大香蕉| 亚洲欧洲激情卡通另类文学四射小说网站 | 高潮嗯啊性感美女久久久| 日韩情色视频| 五月天丁香欧洲日韩| 精品一区二区3区| 亚洲有薄码区日本系列中文字幕| 九月婷婷久久| 九九性视频| 天天操夜夜操| 亚洲 图片 综合91| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 玖玖资源中文字幕制服丝袜| 高树玛利亚无码流出| 欧美三级免费伊人| 青青草精玖玖69精品| 啊啊啊在线观看免费视频| 午夜福利区| 91麻豆一二三区| 精彩久久中文| 少妇熟女视频一区二区三区| 中日韩久久久免费看| 97色欧洲| 久草午夜| 国产一区二区在线播放量| 精品久久久高清无码|