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

資訊專欄INFORMATION COLUMN

poi操作excel,復制sheet,復制行,復制單元格,復制style

Carl / 1458人閱讀

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

緣起

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

在需要復制一個sheet的時候,找到三份資料

poi操作excel,復制sheet,復制行,復制單元格

使用POI操作Excel:Sheet拷貝

POI導出Excel時設置單元格類型為數(shù)值類型

問題

如果在copy一個cell的時候,需要把樣式也copy過去,怎么辦,會怎樣呢?

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

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

如果像第一份資料所做,他自己都注釋掉了,因為報錯

如何解決 思路

相同的book中,不需要copy

不同的book中,styleTable應該不一致,copy的時候,在目標book中創(chuàng)建,最后返回兩個book中的style index的映射關系

代碼

暫時沒測試過,寫出來就迫不及待要分享了。

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); /** * 把一個excel中的styleTable復制到另一個excel中 * @return StyleMapping 兩個文件中styleTable的映射關系 * @see StyleMapping */ public static StyleMapping copyCellStyle(Workbook srcBook, Workbook desBook){ if (null == srcBook || null == desBook) { throw new ExcelExecption("源excel 或 目標excel 不存在"); } if (srcBook.equals(desBook)) { throw new ExcelExecption("不要使用此方法在同一個文件中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 + " 訪問位置=" + desIndex); } return this.des2srcIndexMapping[desIndex]; } /** * 根據(jù)源文件的style的index,獲取目標文件的style的index * @param srcIndex 源excel中style的index * @return desIndex 目標excel中style的index */ public short desIndex(short srcIndex) { if (srcIndex < 0 || srcIndex >= this.src2desIndexMapping.length) { throw new ExcelExecption("索引越界:源文件styleNum=" + this.src2desIndexMapping.length + " 訪問位置=" + srcIndex); } return this.src2desIndexMapping[srcIndex]; } } }
完善代碼

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

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

為啥貼出依賴?因為我一開始用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 復制,復制數(shù)據(jù)、如果同一個文件,復制樣式,不同文件則只復制數(shù)據(jù)
* 如果是同book中復制,建議使用workbook中的cloneSheet()方法
* *
建議用于 不同book間只復制數(shù)據(jù) * */ public static void copySheet(Sheet srcSheet, Sheet desSheet) { copySheet(srcSheet, desSheet, true, true, null); } /** * sheet 復制,如果同一個文件,復制樣式,不同文件則不復制
* *
建議用于 同book中,只復制樣式,不復制數(shù)據(jù)
* eg: copySheet(srcSheet, desSheet, false) * * @param copyValueFlag 控制是否復制數(shù)據(jù) */ public static void copySheet(Sheet srcSheet, Sheet desSheet, boolean copyValueFlag) { copySheet(srcSheet, desSheet, copyValueFlag, true, null); } /** * sheet 復制,復制數(shù)據(jù)、樣式
* *
建議用于 不同book間復制,同時復制數(shù)據(jù)和樣式
* eg: copySheet(srcSheet, desSheet, mapping) * * @param mapping 不同文件間復制時,如果要復制樣式,必傳,否則不復制樣式 */ public static void copySheet(Sheet srcSheet, Sheet desSheet, StyleMapping mapping) { copySheet(srcSheet, desSheet, true, true, mapping); } /** * sheet 復制,復制數(shù)據(jù)
* *
建議用于 同book中,只復制數(shù)據(jù),不復制樣式
* 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 復制, 靈活控制是否控制數(shù)據(jù)、樣式
* *
不建議直接使用 * * @param copyValueFlag 控制是否復制數(shù)據(jù) * @param copyStyleFlag 控制是否復制樣式 * @param mapping 不同book中復制樣式時,必傳 */ 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)復制sheet建議使用 workbook的cloneSheet方法"); } //合并區(qū)域處理 copyMergedRegion(srcSheet, desSheet); //行復制 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(); } } } /** * 復制行 */ public static void copyRow(Row srcRow, Row desRow) { copyRow(srcRow, desRow, true, true, null); } /** * 復制行 */ public static void copyRow(Row srcRow, Row desRow, boolean copyValueFlag) { copyRow(srcRow, desRow, copyValueFlag, true, null); } /** * 復制行 */ public static void copyRow(Row srcRow, Row desRow, StyleMapping mapping) { copyRow(srcRow, desRow, true, true, mapping); } /** * 復制行 */ public static void copyRow(Row srcRow, Row desRow, boolean copyStyleFlag, StyleMapping mapping) { copyRow(srcRow, desRow, true, copyStyleFlag, mapping); } /** * 復制行 */ 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); } } /** * 復制區(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); } } /** * 復制單元格,復制數(shù)據(jù),如果同文件,復制樣式,不同文件則不復制樣式 */ public static void copyCell(Cell srcCell, Cell desCell) { copyCell(srcCell, desCell, true, true,null); } /** * 復制單元格, 如果同文件,復制樣式,不同文件則不復制樣式 * @param copyValueFlag 控制是否復制數(shù)據(jù) */ public static void copyCell(Cell srcCell, Cell desCell, boolean copyValueFlag) { copyCell(srcCell, desCell, copyValueFlag, true, null); } /** * 復制單元格,復制數(shù)據(jù),復制樣式 * @param mapping 不同文件間復制時,如果要復制樣式,必傳,否則不復制樣式 */ public static void copyCell(Cell srcCell, Cell desCell, StyleMapping mapping) { copyCell(srcCell, desCell, true, true, mapping); } /** * 復制單元格,復制數(shù)據(jù) * @param copyStyleFlag 控制是否復制樣式 * @param mapping 不同文件間復制時,如果要復制樣式,必傳,否則不復制樣式 */ public static void copyCell(Cell srcCell, Cell desCell, boolean copyStyleFlag, StyleMapping mapping) { copyCell(srcCell, desCell, true, copyStyleFlag, mapping); } /** * 復制單元格 * @param copyValueFlag 控制是否復制單元格的內(nèi)容 * @param copyStyleFlag 控制是否復制樣式 * @param mapping 不同文件間復制時,如果需要連帶樣式復制,必傳,否則不復制樣式 */ public static void copyCell(Cell srcCell, Cell desCell, boolean copyValueFlag, boolean copyStyleFlag, StyleMapping mapping) { Workbook srcBook = srcCell.getSheet().getWorkbook(); Workbook desBook = desCell.getSheet().getWorkbook(); //復制樣式 //如果是同一個excel文件內(nèi),連帶樣式一起復制 if (srcBook == desBook && copyStyleFlag) { //同文件,復制引用 desCell.setCellStyle(srcCell.getCellStyle()); } else if (copyStyleFlag) { //不同文件,通過映射關系復制 if (null != mapping) { short desIndex = mapping.desIndex(srcCell.getCellStyle().getIndex()); desCell.setCellStyle(desBook.getCellStyleAt(desIndex)); } } //復制評論 if (srcCell.getCellComment() != null) { desCell.setCellComment(srcCell.getCellComment()); } //復制內(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; } } } /** * 把一個excel中的styleTable復制到另一個excel中
* 如果是同一個excel文件,就不用復制styleTable了 * @return StyleMapping 兩個文件中styleTable的映射關系 * @see StyleMapping */ public static StyleMapping copyCellStyle(Workbook srcBook, Workbook desBook){ if (null == srcBook || null == desBook) { throw new ExcelException("源excel 或 目標excel 不存在"); } if (srcBook.equals(desBook)) { throw new ExcelException("不要使用此方法在同一個文件中copy style,同一個excel中復制sheet不需要copy Style"); } if ((srcBook instanceof HSSFWorkbook && desBook instanceof XSSFWorkbook) || (srcBook instanceof XSSFWorkbook && desBook instanceof HSSFWorkbook)) { throw new ExcelException("不支持在不同的版本的excel中復制樣式)"); } 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 + " 訪問位置=" + desIndex); } return this.des2srcIndexMapping[desIndex]; } /** * 根據(jù)源文件的style的index,獲取目標文件的style的index * @param srcIndex 源excel中style的index * @return desIndex 目標excel中style的index */ public short desIndex(short srcIndex) { if (srcIndex < 0 || srcIndex >= this.src2desIndexMapping.length) { throw new ExcelException("索引越界:源文件styleNum=" + this.src2desIndexMapping.length + " 訪問位置=" + srcIndex); } return this.src2desIndexMapping[srcIndex]; } } }

一個自定義異常類

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);
    }
}

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

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71194.html

相關文章

  • 基于POIExcel工具類

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

    sevi_stuo 評論0 收藏0
  • 從零開始,SpreadJS新人學習筆記【第5周】

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

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

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

    Shihira 評論0 收藏0
  • python 中 xlwt 操作excel

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

    張巨偉 評論0 收藏0

發(fā)表評論

0條評論

Carl

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<