使用NPOI導出Excel2007時遇到的問題


  • 自定義單元格背景顏色。

  能吐槽下,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還沒來得及實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM