1. 程式人生 > >npoi workbook 的 cellstyle 建立不能超過4000的解決方法

npoi workbook 的 cellstyle 建立不能超過4000的解決方法

利用NPOI進行Excel的工作表(Sheet)複製時,如果複製的工作表(Sheet)較多(100個左右),會報告 workbook 的 cellstyle 建立不能超過4000 的錯誤. The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook

程式碼如下:

public static void CopySheet(ISheet fromSheet, ISheet toSheet, bool copyValueFlag)
        {
            //合併區域處理  
            MergerRegion(fromSheet, toSheet);
            System.Collections.IEnumerator rows = fromSheet.GetRowEnumerator();
            while (rows.MoveNext())
            {

                IRow row = null;
                if (fromSheet.Workbook is HSSFWorkbook)
                    row = rows.Current as HSSFRow;
                else
                    row = rows.Current as HSSFRow;
                IRow newRow = toSheet.CreateRow(row.RowNum);
                CopyRow(fromSheet.Workbook, toSheet.Workbook, row, newRow, copyValueFlag);
                
            }
        }
public static void CopyRow(IWorkbook fromWb, IWorkbook toWb, IRow fromRow, IRow toRow, bool copyValueFlag)
        {
            System.Collections.IEnumerator cells = fromRow.GetEnumerator(); //.GetRowEnumerator();  
            toRow.Height = fromRow.Height;
 
            while (cells.MoveNext())
            {
                
                ICell cell = null;
                //ICell cell = (wb is HSSFWorkbook) ? cells.Current as HSSFCell : cells.Current as NPOI.XSSF.UserModel.XSSFCell;  
                if (toWb is HSSFWorkbook)
                    cell = cells.Current as HSSFCell;
                else
                    cell = cells.Current as HSSFCell;
                ICell newCell = toRow.CreateCell(cell.ColumnIndex);
                CopyCell(fromWb, toWb, cell, newCell, copyValueFlag);
  
                
            }
        }
public static void CopyCell(IWorkbook fromWb,IWorkbook toWb, ICell srcCell, ICell distCell, bool copyValueFlag)
        {
            ICellStyle newstyle = toWb.CreateCellStyle();  
            CopyCellStyle(fromWb,toWb, srcCell.CellStyle, newstyle);
            //樣式  
            distCell.CellStyle = newstyle;
            //評論  
            if (srcCell.CellComment != null)
            {
                distCell.CellComment = srcCell.CellComment;
            }
            // 不同資料型別處理  
            CellType srcCellType = srcCell.CellType;
            distCell.SetCellType(srcCellType);
            if (copyValueFlag)
            {
                if (srcCellType == CellType.Numeric)
                {
                    if (HSSFDateUtil.IsCellDateFormatted(srcCell))
                    {
                        distCell.SetCellValue(srcCell.DateCellValue);
                    }
                    else
                    {
                        distCell.SetCellValue(srcCell.NumericCellValue);
                    }
                }
                else if (srcCellType == CellType.String)
                {
                    distCell.SetCellValue(srcCell.RichStringCellValue);
                }
                else if (srcCellType == CellType.Blank)
                {
                    // nothing21  
                }
                else if (srcCellType == CellType.Boolean)
                {
                    distCell.SetCellValue(srcCell.BooleanCellValue);
                }
                else if (srcCellType == CellType.Error)
                {
                    distCell.SetCellErrorValue(srcCell.ErrorCellValue);
                }
                else if (srcCellType == CellType.Formula)
                {
                    distCell.SetCellFormula(srcCell.CellFormula);
                }
                else
                {
                    // nothing29  
                }
            }
        }
public static void CopyCellStyle(IWorkbook fromWb, IWorkbook toWb, ICellStyle fromStyle, ICellStyle toStyle)
        {
            toStyle.Alignment = fromStyle.Alignment;
            //邊框和邊框顏色  
            toStyle.BorderBottom = fromStyle.BorderBottom;
            toStyle.BorderLeft = fromStyle.BorderLeft;
            toStyle.BorderRight = fromStyle.BorderRight;
            toStyle.BorderTop = fromStyle.BorderTop;
            toStyle.TopBorderColor = fromStyle.TopBorderColor;
            toStyle.BottomBorderColor = fromStyle.BottomBorderColor;
            toStyle.RightBorderColor = fromStyle.RightBorderColor;
            toStyle.LeftBorderColor = fromStyle.LeftBorderColor;

            //背景和前景  
            toStyle.FillBackgroundColor = fromStyle.FillBackgroundColor;
            toStyle.FillForegroundColor = fromStyle.FillForegroundColor;

            toStyle.DataFormat = fromStyle.DataFormat;
            toStyle.FillPattern = fromStyle.FillPattern;
            toStyle.IsHidden = fromStyle.IsHidden;
            toStyle.Indention = fromStyle.Indention;//首行縮排  
            toStyle.IsLocked = fromStyle.IsLocked;
            toStyle.Rotation = fromStyle.Rotation;//旋轉  
            toStyle.VerticalAlignment = fromStyle.VerticalAlignment;
            toStyle.WrapText = fromStyle.WrapText;
            //IFont fromFont = fromStyle.GetFont(fromWb);//字型
            //toStyle.SetFont(fromFont);
        }

網上有方法說要把CreateCellStyle放在迴圈外面,這個方法不適用於複製的工作表(Sheet)較多(100個左右)的場景,且不是解決問題的根本方法.

為了最大限度的複用CellStyle,且控制在4000個之內.構造了一個快取物件.來快取建立的CellStyle,所有的CellStyle獲取,先通過從快取取,如果不存在再建立.程式碼如下:

public class CellStyleCache:ArrayList
    {
        public ICellStyle this[ICellStyle fromStyle]
        {
            get
            {
                foreach (object o in this)
                {
                    ICellStyle toStyle = o as ICellStyle;
                    if 
                        (
                            toStyle.Alignment == fromStyle.Alignment
                            //邊框和邊框顏色  
                            && toStyle.BorderBottom == fromStyle.BorderBottom
                            && toStyle.BorderLeft == fromStyle.BorderLeft
                            && toStyle.BorderRight == fromStyle.BorderRight
                            && toStyle.BorderTop == fromStyle.BorderTop
                            && toStyle.TopBorderColor == fromStyle.TopBorderColor
                            && toStyle.BottomBorderColor == fromStyle.BottomBorderColor
                            && toStyle.RightBorderColor == fromStyle.RightBorderColor
                            && toStyle.LeftBorderColor == fromStyle.LeftBorderColor
                            //背景和前景  
                            && toStyle.FillBackgroundColor == fromStyle.FillBackgroundColor
                            && toStyle.FillForegroundColor == fromStyle.FillForegroundColor                            
                            && toStyle.IsHidden == fromStyle.IsHidden                            
                            && toStyle.VerticalAlignment == fromStyle.VerticalAlignment
                            //&& toStyle.WrapText == fromStyle.WrapText
                            //&& toStyle.Indention == fromStyle.Indention//首行縮排  
                            //&& toStyle.IsLocked == fromStyle.IsLocked
                            //&& toStyle.Rotation == fromStyle.Rotation//旋轉  
                            //&& toStyle.DataFormat == fromStyle.DataFormat
                            //&& toStyle.FillPattern == fromStyle.FillPattern 
                        )
                    {
                        return toStyle;
                    }

                }
                return null;
            }
            set
            {
                this.Add(fromStyle);
            }
        }
    }

public static ICellStyle CreateCellStyle(IWorkbook wb,ICellStyle fromStyle)
        {
            ICellStyle newStyle = styleCache[fromStyle];
            if (newStyle == null)
            {
                newStyle = wb.CreateCellStyle();
                styleCache[newStyle] = newStyle;
            }
            //ICellStyle newStyle = wb.CreateCellStyle(); 
            return newStyle;
        }

public static void CopyCell(IWorkbook fromWb,IWorkbook toWb, ICell srcCell, ICell distCell, bool copyValueFlag)
        {
             //ICellStyle newstyle = toWb.CreateCellStyle();  
            ICellStyle newstyle = CreateCellStyle(toWb, srcCell.CellStyle);
            //複製樣式
            CopyCellStyle(fromWb,toWb, srcCell.CellStyle, newstyle);
            //樣式  
            distCell.CellStyle = newstyle;
            //評論  
            if (srcCell.CellComment != null)
            {
                distCell.CellComment = srcCell.CellComment;
            }
            // 不同資料型別處理  
            CellType srcCellType = srcCell.CellType;
            distCell.SetCellType(srcCellType);
            if (copyValueFlag)
            {
                if (srcCellType == CellType.Numeric)
                {
                    if (HSSFDateUtil.IsCellDateFormatted(srcCell))
                    {
                        distCell.SetCellValue(srcCell.DateCellValue);
                    }
                    else
                    {
                        distCell.SetCellValue(srcCell.NumericCellValue);
                    }
                }
                else if (srcCellType == CellType.String)
                {
                    distCell.SetCellValue(srcCell.RichStringCellValue);
                }
                else if (srcCellType == CellType.Blank)
                {
                    // nothing21  
                }
                else if (srcCellType == CellType.Boolean)
                {
                    distCell.SetCellValue(srcCell.BooleanCellValue);
                }
                else if (srcCellType == CellType.Error)
                {
                    distCell.SetCellErrorValue(srcCell.ErrorCellValue);
                }
                else if (srcCellType == CellType.Formula)
                {
                    distCell.SetCellFormula(srcCell.CellFormula);
                }
                else
                {
                    // nothing29  
                }
            }
        }


測試通過.

相關推薦

Windows安裝Anaconda無法建立開始選單解決方法

                        今天在Windo

new ActiveXObject("Scripting.FileSystemObject") 未能建立物件的解決方法

JavaScript中ActiveXObject物件是啟用並返回 Automation 物件的引用。使用方法: newObj = new ActiveXObject( servername.typename[, location]) ActiveXObject 物件語法有這

npoi workbookcellstyle 建立不能超過4000解決方法

利用NPOI進行Excel的工作表(Sheet)複製時,如果複製的工作表(Sheet)較多(100個左右),會報告 workbook 的 cellstyle 建立不能超過4000 的錯誤. The maximum number of cell styles was exce

安卓應用方法超過64k解決辦法:分割Dex

con 文件 jar extends iter 介紹 安卓 只需要 option 你的安卓項目功能很強大,對接了好多第三方開源庫,項目越做越完善,代碼越敲越爽。可是突然有一天報異常了。 錯誤:The number of method references in a .dex

postman設置環境變量,字段值經過json轉換後數值超過類型上限的解決方法

補充 src 引號 解決辦法 超過 com mage 解決 過程 在使用Tests進行環境變量的設置時,遇到這麽一種情況,在返回的responseBody中的userId字段,字段返回的是數值類型,再經過json轉換之後,發現保存的值跟接口返回的值不一致;如下圖: 接口返回

解決安卓中單個dex方法超過65535的方法

ati oid 超過 sta get ble text enabled 方法 1、百度下載 60K-methods.jar包,復制至libs文件夾中,添加到gradle中 2、在build.gradle中的defaultConfig{}下添加 multiDexEnable

Elasticsearch from+size 超過10000結果解決方法

規則 pre 推薦 span cnblogs 足夠 div elastic mic 方法一: 如果需要搜索分頁,可以通過from size組合來進行。from表示從第幾行開始,size表示查詢多少條文檔。from默認為0,size默認為10, 如果搜索size大於10000

[記錄]安裝.Net Framework 4.6.2時出現“無法建立到信任根頒發機構的證書鏈”解決方法

ctr log arr 單元 ica micode blog 下載 otc 在安裝Microsoft .NET Framework 4.6.2脫機包時提示 無法建立到信任根頒發機構的證書鏈 實際上是要安裝一個根證書。解決方案如下(因無法貼鏈接,可百度搜索“ma

android studio:::解決方法超過65536的方法,三步

text app multi 一行代碼 dex ide 解決 andro com 1.在build.gradle(Module: app) 中的defaultConfig{}中添加 multiDexEnabled true 2.在build.gradle(Modul

NPOI “發現 中的部分內容有問題,是否要恢復此工作薄的內容?如果信任此工作薄的來源。。。”的問題的解決方法

解釋 -a book ESS poi 導出 blog sage 內容 網上說的方法是調整Sheet可見和順序:https://blog.csdn.net/hulihui/article/details/21196951 stackoverflow給出的解釋是:單元格存儲數

安裝.Net Framework 4.6.2時出現“無法建立到信任根頒發機構的證書鏈”解決方法

地址 author ros 信任 .com 菜單 就是 計算 單元 在安裝Microsoft .NET Framework 4.6.2脫機包時提示 無法建立到信任根頒發機構的證書鏈 實際上是要安裝一個根證書 MicrosoftRootCertificateAuthority

Eclipse建立的包變成資料夾/資料夾變成包的解決方法

首先,這個問題為什麼會出現,我還不清楚。   包變成資料夾的解決方法: 右擊專案——選擇properties——選擇Java Build Path —— Source ——出現下圖 雙擊Included或者Excluded彈出的是同一個對話方塊(這一點讓我費解了一段時

使用hibernate自動建立Mysql表失敗原因及解決方法

原因: hibernate裡的dialect和Mysql的版本不匹配,SQL語句裡的type=“****”使用在MySQL5.0之前,5.0之後就要是使用engine=“****”。 解決: 修改hibernate.cfg.xml檔案 MySql5.0之前的配置 <property

織夢新增超過兩百個自定義欄位後在使用addfields呼叫自定義欄位出錯的解決方法

dedecsm 自定義模型  新增自定義欄位(個數一百多個),使用addfields  方法呼叫,出現呼叫不出來的情況【addfields  裡面就能新增145個欄位,多了直接亂碼或者無法顯示】 解決方法 分別開啟 include/dedehtml2.class.

建立的maven專案,pom.xml檔案報錯解決方法

eclipse建立的maven專案,pom.xml檔案報錯解決方法 【錯誤原因一:】maven 編譯級別過低 【解決辦法:】 使用 maven-compiler-plugin 將 maven 編譯級別改為 jdk1.6 以上: <!-- java編譯外掛

HTML中關於動態建立的標籤無法繫結js事件的解決方法

小夥伴們在前端頁面的時候,是不是會經常遇到用JavaScript動態創建出來的Button按鈕或其他標籤無法使用點選事件的問題。如下程式碼,使用jquery在body中動態建立一個class為demo的Button按鈕,當點選這個按鈕時無法觸發點選事件。 <script> $(fun

MapReduce配置遇到的問題和ubuntu 16.04下使用eclipse建立工程時卡死的解決方法

1、左邊欄的Project Explorer裡一直不出現DFS Locations.   發現在把hadoop-eclipse-plugin-2.6.0.jar放到eclipse下的pluins資料夾下並且eclipse -clean之後依舊不顯示,後來找到問題所在。   在Linux虛擬機器裡換了新的E

laravel框架學習(四)執行建立中介軟體後,提示無法找到該中介軟體的解決方法

按照官方提供的文件:http://laravelacademy.org/post/7812.html 1.建立中介軟體:先宣告中介軟體, php artisan make:middleware AdminMiddleware 會自動在app/Http/Middlewar

利用Vue構造器建立Form元件的通用解決方法

在前端平常的業務中,無論是官網、展示頁還是後臺運營系統都離不開表單,它承載了大部分的資料採集工作。所以如何更好地實現它,是平常工作中的一個重要問題。 在應用Vue框架去開發業務時,會將頁面上每個獨立的可視/可互動區域拆分為一個元件,再通過多個元件的自由組合來組成新的頁面。例如 <template>

解決mysql連線錯誤次數超過限制的方法

9pkeju池撇椎沽渡合《http://baobao.baidu.com/question/fa457c9cdc805d08225f597ff9b552a8?nzw=tyU》 s8x0kb站噶痙佑壯致《http://baobao.baidu.com/question/309f