国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

poi操作excel,復(fù)制sheet,復(fù)制行,復(fù)制單元格,復(fù)制style

Carl / 1470人閱讀

摘要:緣起最近寫一個(gè)程序,需要操作,遂稍微深入了解下從操作,在需要復(fù)制一個(gè)的時(shí)候,找到三份資料操作,復(fù)制,復(fù)制行,復(fù)制單元格使用操作拷貝導(dǎo)出時(shí)設(shè)置單元格類型為數(shù)值類型問(wèn)題如果在一個(gè)的時(shí)候,需要把樣式也過(guò)去,怎么辦,會(huì)怎樣呢如果像第三份資料中所做,

緣起

最近寫一個(gè)程序,需要操作excel,遂稍微深入了解下poi從操作,

在需要復(fù)制一個(gè)sheet的時(shí)候,找到三份資料

poi操作excel,復(fù)制sheet,復(fù)制行,復(fù)制單元格

使用POI操作Excel:Sheet拷貝

POI導(dǎo)出Excel時(shí)設(shè)置單元格類型為數(shù)值類型

問(wèn)題

如果在copy一個(gè)cell的時(shí)候,需要把樣式也copy過(guò)去,怎么辦,會(huì)怎樣呢?

如果像第三份資料中所做,會(huì)創(chuàng)建太多的style,而這些style又是重復(fù)的 ,毫無(wú)意義,數(shù)據(jù)多了還報(bào)錯(cuò)

如果像第二份資料中所做,前提是同一個(gè)workbook,也不存在copy style 的問(wèn)題,只不過(guò)是不同的cell引用相同的style而已

如果像第一份資料所做,他自己都注釋掉了,因?yàn)閳?bào)錯(cuò)

如何解決 思路

相同的book中,不需要copy

不同的book中,styleTable應(yīng)該不一致,copy的時(shí)候,在目標(biāo)book中創(chuàng)建,最后返回兩個(gè)book中的style index的映射關(guān)系

代碼

暫時(shí)沒(méi)測(cè)試過(guò),寫出來(lái)就迫不及待要分享了。

import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Workbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 提供常用excel操作
*
    *
  • *
*/ public class ExcelOperationUtil { private static Logger logger = LoggerFactory.getLogger(ExcelOperationUtil.class); /** * 把一個(gè)excel中的styleTable復(fù)制到另一個(gè)excel中 * @return StyleMapping 兩個(gè)文件中styleTable的映射關(guān)系 * @see StyleMapping */ public static StyleMapping copyCellStyle(Workbook srcBook, Workbook desBook){ if (null == srcBook || null == desBook) { throw new ExcelExecption("源excel 或 目標(biāo)excel 不存在"); } if (srcBook.equals(desBook)) { throw new ExcelExecption("不要使用此方法在同一個(gè)文件中copy style"); } logger.debug("src中style number:{}, des中style number:{}", srcBook.getNumCellStyles(), desBook.getNumCellStyles()); short[] src2des = new short[srcBook.getNumCellStyles()]; short[] des2src = new short[desBook.getNumCellStyles() + srcBook.getNumCellStyles()]; for(short i=0;i= this.des2srcIndexMapping.length) { throw new ExcelExecption("索引越界:源文件styleNum=" + this.des2srcIndexMapping.length + " 訪問(wèn)位置=" + desIndex); } return this.des2srcIndexMapping[desIndex]; } /** * 根據(jù)源文件的style的index,獲取目標(biāo)文件的style的index * @param srcIndex 源excel中style的index * @return desIndex 目標(biāo)excel中style的index */ public short desIndex(short srcIndex) { if (srcIndex < 0 || srcIndex >= this.src2desIndexMapping.length) { throw new ExcelExecption("索引越界:源文件styleNum=" + this.src2desIndexMapping.length + " 訪問(wèn)位置=" + srcIndex); } return this.src2desIndexMapping[srcIndex]; } } }
完善代碼

工作忙了幾天,終于可以回頭把這件事結(jié)束掉了

        
            org.apache.poi
            poi
            3.17
        
        
            org.apache.poi
            poi-ooxml
            3.17
        
        
            org.apache.poi
            poi-scratchpad
            3.17
        

為啥貼出依賴?因?yàn)槲乙婚_(kāi)始用3.8版本,如果是xls就可以,如果是xlsx死活不行,最后,換掉版本就可以了。

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Iterator;

/**
 * 提供常用excel操作
*
    *
  • *
*/ public class ExcelOperationUtil { private static Logger logger = LoggerFactory.getLogger(ExcelOperationUtil.class); /** * sheet 復(fù)制,復(fù)制數(shù)據(jù)、如果同一個(gè)文件,復(fù)制樣式,不同文件則只復(fù)制數(shù)據(jù)
* 如果是同book中復(fù)制,建議使用workbook中的cloneSheet()方法
* *
建議用于 不同book間只復(fù)制數(shù)據(jù) * */ public static void copySheet(Sheet srcSheet, Sheet desSheet) { copySheet(srcSheet, desSheet, true, true, null); } /** * sheet 復(fù)制,如果同一個(gè)文件,復(fù)制樣式,不同文件則不復(fù)制
* *
建議用于 同book中,只復(fù)制樣式,不復(fù)制數(shù)據(jù)
* eg: copySheet(srcSheet, desSheet, false) * * @param copyValueFlag 控制是否復(fù)制數(shù)據(jù) */ public static void copySheet(Sheet srcSheet, Sheet desSheet, boolean copyValueFlag) { copySheet(srcSheet, desSheet, copyValueFlag, true, null); } /** * sheet 復(fù)制,復(fù)制數(shù)據(jù)、樣式
* *
建議用于 不同book間復(fù)制,同時(shí)復(fù)制數(shù)據(jù)和樣式
* eg: copySheet(srcSheet, desSheet, mapping) * * @param mapping 不同文件間復(fù)制時(shí),如果要復(fù)制樣式,必傳,否則不復(fù)制樣式 */ public static void copySheet(Sheet srcSheet, Sheet desSheet, StyleMapping mapping) { copySheet(srcSheet, desSheet, true, true, mapping); } /** * sheet 復(fù)制,復(fù)制數(shù)據(jù)
* *
建議用于 同book中,只復(fù)制數(shù)據(jù),不復(fù)制樣式
* eg: copySheet(srcSheet, desSheet, false, null) * * @param srcSheet * @param desSheet * @param copyStyleFlag * @param mapping */ public static void copySheet(Sheet srcSheet, Sheet desSheet, boolean copyStyleFlag, StyleMapping mapping) { copySheet(srcSheet, desSheet, true, copyStyleFlag, mapping); } /** * sheet 復(fù)制, 靈活控制是否控制數(shù)據(jù)、樣式
* *
不建議直接使用 * * @param copyValueFlag 控制是否復(fù)制數(shù)據(jù) * @param copyStyleFlag 控制是否復(fù)制樣式 * @param mapping 不同book中復(fù)制樣式時(shí),必傳 */ public static void copySheet(Sheet srcSheet, Sheet desSheet, boolean copyValueFlag, boolean copyStyleFlag, StyleMapping mapping) { if (srcSheet.getWorkbook() == desSheet.getWorkbook()) { logger.warn("統(tǒng)一workbook內(nèi)復(fù)制sheet建議使用 workbook的cloneSheet方法"); } //合并區(qū)域處理 copyMergedRegion(srcSheet, desSheet); //行復(fù)制 Iterator rowIterator = srcSheet.rowIterator(); int areadlyColunm = 0; while (rowIterator.hasNext()) { Row srcRow = rowIterator.next(); Row desRow = desSheet.createRow(srcRow.getRowNum()); copyRow(srcRow, desRow, copyValueFlag, copyStyleFlag, mapping); //調(diào)整列寬(增量調(diào)整) if (srcRow.getPhysicalNumberOfCells() > areadlyColunm) { for (int i = areadlyColunm; i < srcRow.getPhysicalNumberOfCells(); i++) { desSheet.setColumnWidth(i, srcSheet.getColumnWidth(i)); } areadlyColunm = srcRow.getPhysicalNumberOfCells(); } } } /** * 復(fù)制行 */ public static void copyRow(Row srcRow, Row desRow) { copyRow(srcRow, desRow, true, true, null); } /** * 復(fù)制行 */ public static void copyRow(Row srcRow, Row desRow, boolean copyValueFlag) { copyRow(srcRow, desRow, copyValueFlag, true, null); } /** * 復(fù)制行 */ public static void copyRow(Row srcRow, Row desRow, StyleMapping mapping) { copyRow(srcRow, desRow, true, true, mapping); } /** * 復(fù)制行 */ public static void copyRow(Row srcRow, Row desRow, boolean copyStyleFlag, StyleMapping mapping) { copyRow(srcRow, desRow, true, copyStyleFlag, mapping); } /** * 復(fù)制行 */ public static void copyRow(Row srcRow, Row desRow,boolean copyValueFlag, boolean copyStyleFlag, StyleMapping mapping) { Iterator it = srcRow.cellIterator(); while (it.hasNext()) { Cell srcCell = it.next(); Cell desCell = desRow.createCell(srcCell.getColumnIndex()); copyCell(srcCell, desCell, copyValueFlag, copyStyleFlag, mapping); } } /** * 復(fù)制區(qū)域(合并單元格) */ public static void copyMergedRegion(Sheet srcSheet, Sheet desSheet) { int sheetMergerCount = srcSheet.getNumMergedRegions(); for (int i = 0; i < sheetMergerCount; i++) { desSheet.addMergedRegion(srcSheet.getMergedRegion(i)); CellRangeAddress cellRangeAddress = srcSheet.getMergedRegion(i); } } /** * 復(fù)制單元格,復(fù)制數(shù)據(jù),如果同文件,復(fù)制樣式,不同文件則不復(fù)制樣式 */ public static void copyCell(Cell srcCell, Cell desCell) { copyCell(srcCell, desCell, true, true,null); } /** * 復(fù)制單元格, 如果同文件,復(fù)制樣式,不同文件則不復(fù)制樣式 * @param copyValueFlag 控制是否復(fù)制數(shù)據(jù) */ public static void copyCell(Cell srcCell, Cell desCell, boolean copyValueFlag) { copyCell(srcCell, desCell, copyValueFlag, true, null); } /** * 復(fù)制單元格,復(fù)制數(shù)據(jù),復(fù)制樣式 * @param mapping 不同文件間復(fù)制時(shí),如果要復(fù)制樣式,必傳,否則不復(fù)制樣式 */ public static void copyCell(Cell srcCell, Cell desCell, StyleMapping mapping) { copyCell(srcCell, desCell, true, true, mapping); } /** * 復(fù)制單元格,復(fù)制數(shù)據(jù) * @param copyStyleFlag 控制是否復(fù)制樣式 * @param mapping 不同文件間復(fù)制時(shí),如果要復(fù)制樣式,必傳,否則不復(fù)制樣式 */ public static void copyCell(Cell srcCell, Cell desCell, boolean copyStyleFlag, StyleMapping mapping) { copyCell(srcCell, desCell, true, copyStyleFlag, mapping); } /** * 復(fù)制單元格 * @param copyValueFlag 控制是否復(fù)制單元格的內(nèi)容 * @param copyStyleFlag 控制是否復(fù)制樣式 * @param mapping 不同文件間復(fù)制時(shí),如果需要連帶樣式復(fù)制,必傳,否則不復(fù)制樣式 */ public static void copyCell(Cell srcCell, Cell desCell, boolean copyValueFlag, boolean copyStyleFlag, StyleMapping mapping) { Workbook srcBook = srcCell.getSheet().getWorkbook(); Workbook desBook = desCell.getSheet().getWorkbook(); //復(fù)制樣式 //如果是同一個(gè)excel文件內(nèi),連帶樣式一起復(fù)制 if (srcBook == desBook && copyStyleFlag) { //同文件,復(fù)制引用 desCell.setCellStyle(srcCell.getCellStyle()); } else if (copyStyleFlag) { //不同文件,通過(guò)映射關(guān)系復(fù)制 if (null != mapping) { short desIndex = mapping.desIndex(srcCell.getCellStyle().getIndex()); desCell.setCellStyle(desBook.getCellStyleAt(desIndex)); } } //復(fù)制評(píng)論 if (srcCell.getCellComment() != null) { desCell.setCellComment(srcCell.getCellComment()); } //復(fù)制內(nèi)容 desCell.setCellType(srcCell.getCellTypeEnum()); if (copyValueFlag) { switch (srcCell.getCellTypeEnum()) { case STRING: desCell.setCellValue(srcCell.getStringCellValue()); break; case NUMERIC: desCell.setCellValue(srcCell.getNumericCellValue()); break; case FORMULA: desCell.setCellFormula(srcCell.getCellFormula()); break; case BOOLEAN: desCell.setCellValue(srcCell.getBooleanCellValue()); break; case ERROR: desCell.setCellValue(srcCell.getErrorCellValue()); break; case BLANK: //nothing to do break; default: break; } } } /** * 把一個(gè)excel中的styleTable復(fù)制到另一個(gè)excel中
* 如果是同一個(gè)excel文件,就不用復(fù)制styleTable了 * @return StyleMapping 兩個(gè)文件中styleTable的映射關(guān)系 * @see StyleMapping */ public static StyleMapping copyCellStyle(Workbook srcBook, Workbook desBook){ if (null == srcBook || null == desBook) { throw new ExcelException("源excel 或 目標(biāo)excel 不存在"); } if (srcBook.equals(desBook)) { throw new ExcelException("不要使用此方法在同一個(gè)文件中copy style,同一個(gè)excel中復(fù)制sheet不需要copy Style"); } if ((srcBook instanceof HSSFWorkbook && desBook instanceof XSSFWorkbook) || (srcBook instanceof XSSFWorkbook && desBook instanceof HSSFWorkbook)) { throw new ExcelException("不支持在不同的版本的excel中復(fù)制樣式)"); } logger.debug("src中style number:{}, des中style number:{}", srcBook.getNumCellStyles(), desBook.getNumCellStyles()); short[] src2des = new short[srcBook.getNumCellStyles()]; short[] des2src = new short[desBook.getNumCellStyles() + srcBook.getNumCellStyles()]; for(short i=0;i= this.des2srcIndexMapping.length) { throw new ExcelException("索引越界:源文件styleNum=" + this.des2srcIndexMapping.length + " 訪問(wèn)位置=" + desIndex); } return this.des2srcIndexMapping[desIndex]; } /** * 根據(jù)源文件的style的index,獲取目標(biāo)文件的style的index * @param srcIndex 源excel中style的index * @return desIndex 目標(biāo)excel中style的index */ public short desIndex(short srcIndex) { if (srcIndex < 0 || srcIndex >= this.src2desIndexMapping.length) { throw new ExcelException("索引越界:源文件styleNum=" + this.src2desIndexMapping.length + " 訪問(wèn)位置=" + srcIndex); } return this.src2desIndexMapping[srcIndex]; } } }

一個(gè)自定義異常類

public class ExcelException extends RuntimeException {

    public ExcelException() {
    }

    public ExcelException(String message) {
        super(message);
    }

    public ExcelException(String message, Throwable cause) {
        super(message, cause);
    }

    public ExcelException(Throwable cause) {
        super(cause);
    }

    public ExcelException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/71194.html

相關(guān)文章

  • 基于POIExcel工具類

    摘要:一般訂單打印紙高度毫米字母或半角字符判斷是否為全角全角符號(hào)及中文連續(xù)出現(xiàn),認(rèn)為是單詞組成部分的字符和間單頁(yè)的票據(jù)右端聯(lián)頁(yè)寬占用的寬度回退一行每減一次少一行實(shí)際高度的距離補(bǔ)足行高拉高的行內(nèi)容要調(diào)整使用靠上對(duì)齊補(bǔ)充 import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.Region; import ...

    sevi_stuo 評(píng)論0 收藏0
  • 從零開(kāi)始,SpreadJS新人學(xué)習(xí)筆記【第5周】

    摘要:復(fù)制粘貼單元格格式和單元格類型本周,讓我們一起來(lái)學(xué)習(xí)的復(fù)制粘貼單元格格式和單元格類型,希望我的學(xué)習(xí)筆記能夠幫助你們,從零開(kāi)始學(xué)習(xí),并逐步精通。 復(fù)制粘貼、單元格格式和單元格類型 本周,讓我們一起來(lái)學(xué)習(xí)SpreadJS 的復(fù)制粘貼、單元格格式和單元格類型,希望我的學(xué)習(xí)筆記能夠幫助你們,從零開(kāi)始學(xué)習(xí) SpreadJS,并逐步精通。 在此前的學(xué)習(xí)筆記中,相信大家已經(jīng)學(xué)會(huì)并熟練掌握了Sprea...

    shadowbook 評(píng)論0 收藏0
  • 使用ApachePOI生成XLSXExcel文檔大數(shù)據(jù)量導(dǎo)出

    摘要:最近在做使用進(jìn)行大數(shù)據(jù)量導(dǎo)出,現(xiàn)在把其整理成工具類供大家參考。版本增加了前綴為相關(guān)的類,主要用于大數(shù)據(jù)量的寫入與讀取。 最近在做使用POI進(jìn)行大數(shù)據(jù)量導(dǎo)出,現(xiàn)在把其整理成工具類供大家參考。Apache POI 3.8版本增加了前綴為SXSSF相關(guān)的類,主要用于大數(shù)據(jù)量的寫入與讀取。關(guān)于ApachePOI導(dǎo)出Excel基本的使用我這里就不詳解了,具體參考: Apache POI官方網(wǎng)站...

    Shihira 評(píng)論0 收藏0
  • python 中 xlwt 操作excel

    摘要:中使用操作非常方和使用調(diào)框架相比這就是天堂啊一安裝模塊二簡(jiǎn)單使用導(dǎo)入模塊創(chuàng)建對(duì)象創(chuàng)建工作表往表中寫內(nèi)容第一各參數(shù)行第二個(gè)參數(shù)列第三個(gè)參數(shù)內(nèi)容保存表為在中使用操作在創(chuàng)建對(duì)象的時(shí)候就需要寫好表名創(chuàng)建對(duì)象完成后這個(gè)表就已經(jīng)存在但是使用需要在最后 python中使用xlwt操作excel非常方,和Java使用調(diào)框架apache poi相比這就是天堂啊一.安裝xlwt模塊 pip3 instal...

    張巨偉 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Carl

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<