npoi workbook 的 cellstyle 建立不能超過4000的解決方法
程式碼如下:
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 workbook 的 cellstyle 建立不能超過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