- 自定義單元格背景顏色。
能吐槽下,NPOI導出Excel2003和2007時的背景顏色設置完全不一致么?啥也不說,代碼說話。(本來想直接賦值IColor的,結果發現CellStyle的Color居然是只讀屬性,得找時間看看源碼,為什么要設置成只讀的)
/// <summary> /// 根據"#FFFFFF"字符串設置顏色 /// PS:能吐槽下2003和2007的自定義顏色獲取值完全是坑么? /// </summary> /// <param name="workbook"></param> /// <param name="hexString">#FFFFFF</param> /// <param name="cellStyle"></param> /// <returns></returns> private void ChangeColor(IWorkbook workbook, string hexString, ICellStyle cellStyle) { if (!hexString.StartsWith("#") || hexString.Length != 7) { throw new Exception("excel背景顏色設置錯誤,請按照'#FFFFFF'格式設置!"); } byte r = byte.Parse(hexString.Substring(1, 2), NumberStyles.HexNumber); byte g = byte.Parse(hexString.Substring(3, 2), NumberStyles.HexNumber); byte b = byte.Parse(hexString.Substring(5, 2), NumberStyles.HexNumber); if (workbook is XSSFWorkbook) { cellStyle.FillForegroundColor = 0; ((XSSFColor)cellStyle.FillForegroundColorColor).SetRgb(new byte[] { r, g, b }); } else { cellStyle.FillForegroundColor = ((HSSFWorkbook)workbook).GetCustomPalette().FindSimilarColor(r, g, b).GetIndex(); } }
- 導出Excel2003與2007的workbook.Write(Stream stream)接口的實現不一致。
在2003中直接Write完就完了,而2007即XSSFWorkbook這個類Write完之后居然將 我的Stream對象給Dispose掉了!我還需要將這個對象丟給Responce呢,敢不要這樣不~~本來2003跑得很ok,2007就報不能操作已關閉的流,這是想鬧哪樣啊。最終解決辦法是重寫了MemenryStream的Dispose接口,代碼如下:
/// <summary> /// 這是為了避免流被NPOI關閉而實現的流 /// 當CanDispose為false時此流的dispose接口無效,僅當該值為true時有效 /// </summary> public class ExcelStream:System.IO.MemoryStream { protected override void Dispose(bool disposing) { if (CanDispose) { base.Dispose(disposing); } } public bool CanDispose { get; set; } }
使用時如下:
ExcelStream stream = new ExcelStream(); workbook.Write(stream); stream.CanDispose = true;
- 待解決問題:大數據量導出時內存溢出的問題
初步思路是寫文件流,但有一個多用戶並發的問題,還未進行測試。而且我看POI是有一個解決方案的,只是大神Tony還沒來得及實現。