国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

解決easyExcel按模板導(dǎo)出xlsx文件打開提示“發(fā)現(xiàn)xxx.xlsx中部分內(nèi)容有問題,是否讓我們盡量嘗試恢復(fù)?”的問題

這篇具有很好參考價(jià)值的文章主要介紹了解決easyExcel按模板導(dǎo)出xlsx文件打開提示“發(fā)現(xiàn)xxx.xlsx中部分內(nèi)容有問題,是否讓我們盡量嘗試恢復(fù)?”的問題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

最近項(xiàng)目一個(gè)需求要求將訂單按照excel模板導(dǎo)出,其中商品有多行,需要?jiǎng)討B(tài)插入行并且存在合并單元格的情況,使用easyExcel官網(wǎng)提供的demo的填充和合并單元格:
官網(wǎng)填充demo
官網(wǎng)合并單元格demo

按模板導(dǎo)出主要代碼:

public class DataToExcel {
	public void exportFile() {
		File filePath = new File("D:\\test\\testMerge.xlsx");
		OutputStream os= Files.newOutputStream(filePath.toPath());
		
		int firstRow = 18;  //從第18行開始合并
		int lastRow = 18;
		int beginRow = 18;
		
		//單元格合并
		List<CellRangeAddress> cellRangeAddressList = new ArrayList<>();
		if (CollectionUtil.isNotEmpty(excelVoList)) {
			if (excelVoList.size() > 1) {
				for (int i = 0; i < excelVoList.size() - 1; i++) {
					cellRangeAddressList.add(new CellRangeAddress(firstRow, lastRow, 1, 4));
					cellRangeAddressList.add(new CellRangeAddress(firstRow, lastRow, 7, 8));
					firstRow++;
					lastRow++;
				}
			}
		}
		
		FillMergeStrategy fillMergeStrategy = new FillMergeStrategy(cellRangeAddressList, beginRow, excelVoList.size() - 1);
		
		//獲取excel模板
		File file = new File("D:\\template\\template01.xlsx");
		InputStream inputStream = Files.newInputStream(file.toPath());
		//InputStream inputStream = new URL(filePath).openStream();
		
		ExcelWriter excelWriter = EasyExcel.write(os).withTemplate(inputStream)
		        .registerWriteHandler(fillMergeStrategy)
				.build();
		WriteSheet writeSheet = EasyExcel.writerSheet().build();
		FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
		
		//參數(shù)集合,直接寫入到Excel數(shù)據(jù)
		excelWriter.fill(paramsMap, writeSheet);
		//列表數(shù)據(jù)
		excelWriter.fill(excelVoList, fillConfig, writeSheet);
		excelWriter.finish();
	}
}

合并單元格的策略為:

public class PiFillMergeStrategy implements RowWriteHandler {

    //合并坐標(biāo)集合
    private List<CellRangeAddress> cellRangeAddress;
    //從哪行開始
    private int beginRow;
    //合并行數(shù)
    private int mergeRows;

    public PiFillMergeStrategy(List<CellRangeAddress> cellRangeAddress, int beginRow, int mergeRows) {
        this.cellRangeAddress = cellRangeAddress;
        this.beginRow = beginRow;
        this.mergeRows = mergeRows;
    }

    @Override
    public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {
        if (CollectionUtil.isNotEmpty(cellRangeAddress)) {
            if (row.getRowNum() >= beginRow && row.getRowNum() <= beginRow + mergeRows) {
                for (CellRangeAddress item : cellRangeAddress) {
                    writeSheetHolder.getSheet().addMergedRegionUnsafe(item);
                }
            }
        }
    }

}

當(dāng)有多行商品導(dǎo)出的excel文件打開時(shí)會(huì)提示:
easyexcel導(dǎo)出文件損壞,java
點(diǎn)擊“是”是可以打開的,但用戶體驗(yàn)很不好,認(rèn)為導(dǎo)出文件有問題!
調(diào)試了下easyExcel代碼,發(fā)現(xiàn)合并單元格的方法主要有兩個(gè):

    /**
	  * 添加單元格的合并區(qū)域(因此這些單元格形成一個(gè))
	  * 參數(shù):region – (rowfrom/colfrom-rowto/colto) 合并
	  * 返回:該地區(qū)的指數(shù)
     */
    int addMergedRegion(CellRangeAddress region);

    /**
     * 添加單元格的合并區(qū)域(因此這些單元格形成一個(gè))。跳過驗(yàn)證。可以創(chuàng)建重疊的合并區(qū)域或創(chuàng)建與多單元格
     * 數(shù)組公式與此公式相交的合并區(qū)域,這可能會(huì)導(dǎo)致工作簿損壞。要在調(diào)用 addMergedRegionUnsafe 后檢
     * 查合并區(qū)域重疊數(shù)組公式或其他合并區(qū)域,請(qǐng)調(diào)用validateMergedRegions() ,它在 O(n^2) 時(shí)間內(nèi)
     * 運(yùn)行。
     * 參數(shù):region ——合并
	 * 返回:該地區(qū)的指數(shù)
	 * 拋出:IllegalArgumentException – 如果區(qū)域包含的單元格少于 2 個(gè)
     */
    int addMergedRegionUnsafe(CellRangeAddress region);

可以看出使用addMergedRegionUnsafe方法合并單元格可能會(huì)導(dǎo)致工作簿損壞,而使用addMergedRegion會(huì)進(jìn)行單元格是否重復(fù)合并的校驗(yàn):

private int addMergedRegion(CellRangeAddress region, boolean validate) {
        if (region.getNumberOfCells() < 2) {
            throw new IllegalArgumentException("Merged region " + region.formatAsString() + " must contain 2 or more cells");
        }
        region.validate(SpreadsheetVersion.EXCEL2007);

        if (validate) {
            // throw IllegalStateException if the argument CellRangeAddress intersects with
            // a multi-cell array formula defined in this sheet
            validateArrayFormulas(region);

            // Throw IllegalStateException if the argument CellRangeAddress intersects with
            // a merged region already in this sheet
            validateMergedRegions(region);
        }

        CTMergeCells ctMergeCells = worksheet.isSetMergeCells() ? worksheet.getMergeCells() : worksheet.addNewMergeCells();
        CTMergeCell ctMergeCell = ctMergeCells.addNewMergeCell();
        ctMergeCell.setRef(region.formatAsString());
        final int numMergeRegions=ctMergeCells.sizeOfMergeCellArray();

        // also adjust the number of merged regions overall
        ctMergeCells.setCount(numMergeRegions);

        return numMergeRegions-1;
    }

校驗(yàn)合并單元格的方法validateMergedRegions(region),如果候選區(qū)域不與此工作表中的現(xiàn)有合并區(qū)域相交就會(huì)報(bào)錯(cuò):

private void validateMergedRegions(CellRangeAddress candidateRegion) {
        for (final CellRangeAddress existingRegion : getMergedRegions()) {
            if (existingRegion.intersects(candidateRegion)) {
                throw new IllegalStateException("Cannot add merged region " + candidateRegion.formatAsString() +
                        " to sheet because it overlaps with an existing merged region (" + existingRegion.formatAsString() + ").");
            }
        }
    }

可以看出addMergedRegionUnsafe會(huì)跳過單元格合并的校驗(yàn),但會(huì)導(dǎo)致文件被損壞,所以導(dǎo)出的文件打開后會(huì)提示文件有問題,如果使用addMergedRegion方法,easyExcel在列表動(dòng)態(tài)添加行excelWriter.fill(excelVoList, fillConfig, writeSheet);時(shí)就會(huì)直接報(bào)上述錯(cuò)誤,導(dǎo)致程序中斷。

我采用的方法是用easyExcel不使用合并策略導(dǎo)出xlsx文件到臨時(shí)文件中,然后使用poi的XSSFWorkbook讀取該臨時(shí)文件,然后用這個(gè)新的臨時(shí)文件進(jìn)行單元格合并,這樣單元格檢查時(shí)就不會(huì)報(bào)錯(cuò)了,順利導(dǎo)出,打開后也不會(huì)有錯(cuò)誤提示!

public class DataToExcel {
	public void exportFile() {
		File filePath = new File("D:\\test\\testMerge.xlsx");
		OutputStream os= Files.newOutputStream(filePath.toPath());
		
		int firstRow = 18;  //從第18行開始合并
		int lastRow = 18;
		int beginRow = 18;
		
		//單元格合并
		List<CellRangeAddress> cellRangeAddressList = new ArrayList<>();
		if (CollectionUtil.isNotEmpty(excelVoList)) {
			if (excelVoList.size() > 1) {
				for (int i = 0; i < excelVoList.size() - 1; i++) {
					cellRangeAddressList.add(new CellRangeAddress(firstRow, lastRow, 1, 4));
					cellRangeAddressList.add(new CellRangeAddress(firstRow, lastRow, 7, 8));
					firstRow++;
					lastRow++;
				}
			}
		}
		
		//將easyExcel生成的文件保存在臨時(shí)文件中待poi進(jìn)一步做合并單元格
		File tmpFile = new File("D:\\tmp\\tmpFile.xlsx");
		OutputStream tmpOutputStream = Files.newOutputStream(tmpFile.toPath());
		//獲取excel模板
		File file = new File("D:\\template\\template01.xlsx");
		InputStream inputStream = Files.newInputStream(file.toPath());
		
		//將easyExcel生成的文件保存在臨時(shí)文件中待poi進(jìn)一步做合并單元格
		//File tmpFile = new File("/tmp/" + "tmp_file.xlsx");
		//OutputStream tmpOutputStream = Files.newOutputStream(tmpFile.toPath());
		//獲取excel模板
		//InputStream inputStream = new URL(filePath).openStream();
		
		ExcelWriter excelWriter = EasyExcel.write(tmpOutputStream).withTemplate(inputStream)
		//      .registerWriteHandler(fillMergeStrategy)  //不采用合并策略
				.build();
		WriteSheet writeSheet = EasyExcel.writerSheet().build();
		FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
		
		//參數(shù)集合,直接寫入到Excel數(shù)據(jù)
		excelWriter.fill(paramsMap, writeSheet);
		//列表數(shù)據(jù)
		excelWriter.fill(excelVoList, fillConfig, writeSheet);
		excelWriter.finish();
		
		//使用poi合并單元格,使用registerWriteHandler合并單元格會(huì)與fill方法中創(chuàng)建單元格后校驗(yàn)合并單元格沖突而引發(fā)報(bào)錯(cuò)
		InputStream in = Files.newInputStream(tmpFile.toPath());
		XSSFWorkbook workbook = new XSSFWorkbook(in);
		XSSFSheet sheet = workbook.getSheetAt(0);
		if (CollectionUtils.isNotEmpty(cellRangeAddressList)) {
			for (CellRangeAddress cellAddresses : cellRangeAddressList) {
				//合并單元格
				sheet.addMergedRegion(cellAddresses);
				//設(shè)置單元格樣式,解決合并單元格后邊框缺失問題
				setRegionStyle(sheet, cellAddresses, setDefaultStyle(workbook));
			}
		}
		workbook.write(os);
		os.flush();
		os.close();
	}
	
	//使用poi設(shè)置合并單元格后的樣式
	public void setRegionStyle(XSSFSheet sheet, CellRangeAddress region, XSSFCellStyle xssfCellStyle) {
		for (int i = region.getFirstRow(); i <= region.getLastRow(); i++) {
			XSSFRow row = sheet.getRow(i);
			if (null == row) row = sheet.createRow(i);
			for (int j = region.getFirstColumn(); j <= region.getLastColumn(); j++) {
				XSSFCell cell = row.getCell(j);
				if (null == cell) cell = row.createCell(j);
				cell.setCellStyle(xssfCellStyle);
			}
		}
	}
	
	public XSSFCellStyle setDefaultStyle(XSSFWorkbook workbook) {
		XSSFCellStyle cellStyle = workbook.createCellStyle();
		// 邊框
		cellStyle.setBorderBottom(BorderStyle.THIN);
		cellStyle.setBorderLeft(BorderStyle.THIN);
		cellStyle.setBorderRight(BorderStyle.THIN);
		cellStyle.setBorderTop(BorderStyle.THIN);
		// 居中
		cellStyle.setAlignment(HorizontalAlignment.CENTER);
		cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
		// 字體
		XSSFFont font = workbook.createFont();
		font.setFontName("Calibri");
		font.setFontHeightInPoints((short) 10);
		cellStyle.setFont(font);
		return cellStyle;
	}
}

如果有更好的解決方式,歡迎再評(píng)論區(qū)留言哦!

參考文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-641455.html

到了這里,關(guān)于解決easyExcel按模板導(dǎo)出xlsx文件打開提示“發(fā)現(xiàn)xxx.xlsx中部分內(nèi)容有問題,是否讓我們盡量嘗試恢復(fù)?”的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • easyexcel根據(jù)模板導(dǎo)出Excel文件,表格自動(dòng)填充問題

    同事在做easyexcel導(dǎo)出Excel,根據(jù)模板導(dǎo)出的時(shí)候,發(fā)現(xiàn)導(dǎo)出的表格,總會(huì)覆蓋落款的內(nèi)容。 這就很尷尬了,表格居然不能自動(dòng)填充,直接怒噴工具,哈哈。 然后一起看了一下這個(gè)問題。 我找了自己的系統(tǒng)中關(guān)于表格導(dǎo)出的頁(yè)面,導(dǎo)出了一下,發(fā)現(xiàn)可以正常擴(kuò)充。 于是排查問

    2024年02月06日
    瀏覽(28)
  • 【Java結(jié)合EasyExcel,模板文件填充并導(dǎo)出Excel】

    【Java結(jié)合EasyExcel,模板文件填充并導(dǎo)出Excel】

    需求描述: 客戶網(wǎng)頁(yè)上填一個(gè)Excel表格,數(shù)據(jù)存到數(shù)據(jù)庫(kù),這個(gè)導(dǎo)出接口要做的就是從數(shù)據(jù)庫(kù)中的獲取數(shù)據(jù)并填充到模板文件,最后通過response返給前端一個(gè)下載鏈接,用戶即可獲取填充好的Excel文件。 方案一: 一開始使用的是easypoi,發(fā)現(xiàn)當(dāng)填充一行數(shù)據(jù)時(shí)是OK的,但是如果

    2024年02月09日
    瀏覽(28)
  • Excel無(wú)法打開文件新建 XLSX 工作表.xlsx,因?yàn)槲募袷交蛭募U(kuò)展名無(wú)效。請(qǐng)確定文件未損壞解決辦法【筆記】

    Excel無(wú)法打開文件新建 XLSX 工作表.xlsx,因?yàn)槲募袷交蛭募U(kuò)展名無(wú)效。請(qǐng)確定文件未損壞解決辦法【筆記】

    使用問題: 右鍵新建Microsoft Excel工作表,雙擊打開表格文件提示以下內(nèi)容: “Excel無(wú)法打開文件新建 XLSX 工作表.xlsx,因?yàn)槲募袷交蛭募U(kuò)展名無(wú)效。請(qǐng)確定文件未損壞,并且文件擴(kuò)展名與文件的格式匹配” 。 確認(rèn)了以下路徑的文件正常打開 C:Program FilesMicrosoft Officero

    2024年02月11日
    瀏覽(54)
  • word轉(zhuǎn)化為ftl格式文件模板,導(dǎo)出后office提示文件錯(cuò)誤

    word轉(zhuǎn)化為ftl格式文件模板,導(dǎo)出后office提示文件錯(cuò)誤

    使用模板,導(dǎo)出word文件,最近在做這個(gè)需求,本地環(huán)境用的是wps,結(jié)合本地的環(huán)境快速完成了開發(fā)需求之后,有一天客戶發(fā)現(xiàn)office打開報(bào)錯(cuò),本人深感不接,wps都能打開,各個(gè)在線文檔也都支持,為何office就不支持,環(huán)境不同。 wps是按照office版本迭代開發(fā),照理說office是w

    2024年02月12日
    瀏覽(62)
  • EasyExcel導(dǎo)出工具類(支持模板導(dǎo)出多Sheet導(dǎo)出)

    EasyExcel導(dǎo)出工具類(支持模板導(dǎo)出多Sheet導(dǎo)出)

    最近寫需求發(fā)現(xiàn)沒有順手excel導(dǎo)出工具類, 于是自己造了個(gè)小輪子, 鏈?zhǔn)揭籠\\".\\\"到底, 代碼既注釋 特點(diǎn): 支持多sheet 支持從模板導(dǎo)出 支持分頁(yè)拿數(shù)據(jù), 避免數(shù)據(jù)量過大一次拿出導(dǎo)致內(nèi)存溢出 數(shù)據(jù)類型支持業(yè)務(wù)實(shí)體類或Map, 無(wú)需easyExcel的注解, 低侵入 ? over

    2024年02月16日
    瀏覽(27)
  • python中使用pandas 導(dǎo)出到excel ,打開excel有錯(cuò)誤,錯(cuò)誤的提示為:發(fā)現(xiàn)“***”中的部分內(nèi)容問題,是否讓我們盡量嘗試修復(fù)?如果您信任此工作簿的源,請(qǐng)單擊“是”。

    python中使用pandas 導(dǎo)出到excel ,打開excel有錯(cuò)誤,錯(cuò)誤的提示為:發(fā)現(xiàn)“***”中的部分內(nèi)容問題,是否讓我們盡量嘗試修復(fù)?如果您信任此工作簿的源,請(qǐng)單擊“是”。

    目錄 ?問題及解決辦法 發(fā)現(xiàn)問題出現(xiàn)的原因?yàn)椋何募貜?fù)保存? 解決問題的方法為:注釋掉writer.save() 完美解決?。?!生成的表格打開便不會(huì)再有警告提示。 pd.ExcelWriter() 是 Pandas 庫(kù)中的一個(gè)函數(shù),用于創(chuàng)建一個(gè) Excel 文件的寫入器(Excel writer)對(duì)象,可以用來(lái)將數(shù)據(jù)寫入 Ex

    2024年02月06日
    瀏覽(21)
  • POI及EasyExcel操作xls,xlsx文件

    POI及EasyExcel操作xls,xlsx文件

    Apache POI 是基于 Office Open XML 標(biāo)準(zhǔn)(OOXML)和 Microsoft 的 OLE 2 復(fù)合文檔格式(OLE2)處理各種文件格式的開源項(xiàng)目。 可以使用 Java 讀寫 MS Excel 文件,可以使用 Java 讀寫 MS Word 和 MS PowerPoint 文件。 HSSF - 提供讀寫 Microsoft Excel XLS 格式 (Microsoft Excel 97 (-2003)) 檔案的功能。 XSSF - 提

    2024年02月11日
    瀏覽(20)
  • easyexcel poi根據(jù)模板導(dǎo)出Excel

    easyexcel poi根據(jù)模板導(dǎo)出Excel

    參考:https://blog.csdn.net/weixin_45742032/article/details/119593288?spm=1001.2101.3001.6650.1utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-119593288-blog-86538258.235%5Ev38%5Epc_relevant_anti_t3_basedepth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-11959328

    2024年02月10日
    瀏覽(32)
  • 使用easyexcel填充模板數(shù)據(jù),并導(dǎo)出excel

    使用easyexcel填充模板數(shù)據(jù),并導(dǎo)出excel

    導(dǎo)出excel功能非常場(chǎng)景,本片文章記錄如何使用模板填充數(shù)據(jù)后再導(dǎo)出。因直接導(dǎo)出excel數(shù)據(jù)樣式不符合要求,所以做了模板填充然后再導(dǎo)出excel。 效果如下: 注意:列表數(shù)據(jù)變量名前面要寫點(diǎn){.id},如果單條數(shù)據(jù)可以不寫。 使用表單提交: 實(shí)體代碼: controller代碼: 只對(duì)je

    2024年03月11日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包