- 自定义单元格背景颜色。
能吐槽下,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还没来得及实现。