使用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