码迷,mamicode.com
首页 > 其他好文 > 详细

NPOI, table string to excel

时间:2016-04-04 14:36:44      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

因为有4000个style的限制。所以加了个class,保存style。。。重复的style不新new,只有是新的style才new一个style. 这样基本不会达到4000个的限制。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;

namespace TestNPOI
{
    public class CellStyle
    {
        public CellStyle(HSSFWorkbook workbook)
        {
            Wk = workbook;
            _cStyle = Wk.CreateCellStyle();
            _font = Wk.CreateFont();
        }
        public static HSSFWorkbook Wk { get; set; }
        public short FillForegroundColor { get; set; }
        public short FontColor { get; set; }
        // left align by default.
        public HorizontalAlignment Alignment { get; set; }
        public string Type { get; set; }
        //public string IsFontBold { get; set; }
        //public string HorizontalAlign { get; set; }
        //public string Underscore { get; set; }
        private ICellStyle _cStyle;
        private readonly IFont _font;

        public ICellStyle CStyle
        {
            get
            {
                _cStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.THIN;
                _cStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.THIN;
                _cStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.THIN;
                _cStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.THIN;
                _cStyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.WHITE.index;
                _cStyle.FillPattern = FillPatternType.SOLID_FOREGROUND;
                _cStyle.FillForegroundColor = this.FillForegroundColor;
                if (Type == "header")
                {
                    _font.Boldweight = (short) FontBoldWeight.BOLD;
                    _cStyle.WrapText = false;
                }
                else
                {
                    _font.Boldweight = (short)FontBoldWeight.None;
                }
                _font.FontName = "verdana";                    //

                //_cStyle.WrapText = true;
                _font.Color = this.FontColor;
                _cStyle.SetFont(_font);
                 _cStyle.Alignment = this.Alignment;   
                return _cStyle;
            }
            set { this._cStyle = value; }
        }

    }

}

  下面的是把html string输出到ezcel,这个是针对我的table的,其他的自己慢慢改吧。。。。

 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Xml.Linq;
using Chilkat;
using NPOI.HSSF.Record.CF;
using NPOI.HSSF.UserModel;
using NPOI.HSSF.Util;
using NPOI.SS.UserModel;

namespace TestNPOI
{
    public class NPOIHelper
    {
        private readonly List<CellStyle>  _userStyleList = new List<CellStyle>();

        /// <summary>
        /// write html xml string to excel using npoi.
        /// </summary>
        /// <param name="sHtml"></param>
        public void WriteHtmlToExcel(string sHtml)//byte[] WriteHtmlToExcel(string sHtml)
        {

            //  the most important thing is to get a xml string...
            // 1. remove tags that are not closed (maybe html, but not xml friendly)
            // 2. remove special string...

            List<string> multiplePatterns = new List<string>
            {
                "title=\".*?\"",
                "onmouseover=\".*?\"",
                "ondblclick=\".*?\"",
                "<br>",
                "<BR>",
                "<img border=0 alt=‘Show Attachment‘ src=‘Images/IconImage.gif‘>",
                " ",
                "<img src=\"Images.*?>",
                "<input .*?>",
                //"<td >.*?<input name=\".*?>.*?</td>"
            };

            sHtml = Regex.Replace(sHtml, string.Join("|", multiplePatterns), string.Empty);

            var doc = XDocument.Parse(sHtml);
            HSSFWorkbook wk = new HSSFWorkbook();
            ISheet sheet = wk.CreateSheet("Report1");

            ICellStyle style = wk.CreateCellStyle();
            // initialize workbook color pallette.
            style.FillForegroundColor = HtmltoColorIndex(wk, "#CCCC99");

            string[] styleall = { "background", "align", "color" }; // "text-dec","wrap"

            // get header tr
            var queryheader = doc.Descendants("tr").Take(1);

            // get header th
            int count = queryheader.Descendants().Count();
            IRow row = sheet.CreateRow(0);
            for (int i = 0; i < count; i++)
            {
                ICell cell = row.CreateCell(i);
                XElement xe = queryheader.Descendants().ElementAtOrDefault(i);
                foreach (string s in styleall)
                {
                    GetStyleAll(xe, wk, ref style, s);
                }

                int index = CheckDuplicateUserStyle(style, wk, "header");
                cell.SetCellValue(xe.Value.Trim());
                cell.CellStyle = _userStyleList[index].CStyle;
                
                sheet.AutoSizeColumn(i);
            }


            for (int i = 0; i < doc.Descendants("tr").Count() - 1; i++)
            {
                // get data style
                var dataleft = doc.Descendants("tr").Skip(i + 1).Take(1);
                IRow newRow = sheet.CreateRow(i + 1);
                var datarow = dataleft.Descendants("td");
                for (int j = 0; j < datarow.Count(); j++)
                {
                    XElement dataxe = datarow.ElementAtOrDefault(j);
                    ICell newCell = newRow.CreateCell(j);
                    
                    foreach (string s in styleall)
                    {
                        GetStyleAll(dataxe, wk, ref style, s);
                    }

                    int index = CheckDuplicateUserStyle(style, wk, "data");
                    newCell.SetCellValue(dataxe.Value.Trim());
                    newCell.CellStyle = _userStyleList[index].CStyle;
                    sheet.AutoSizeColumn(i);
                }
            }

            // download scripts
            using (MemoryStream ms = new MemoryStream())
            {
                wk.Write(ms);
                //// from web.
                //HttpContext.Current.Response.ContentType = "application/octet-stream";
                //HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=report.xls");
                //HttpContext.Current.Response.BinaryWrite(ms.ToArray());
                //// from console -> write to file.
                string dt = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss");
                using (FileStream fs = new FileStream(@"C:\Users\Richard\Documents\tools\TestNPOI\TestNPOI\bin\" + dt + ".xls", FileMode.Create))
                {
                    ms.WriteTo(fs);
                }
                //// from web/ console, attached to email.
                //return ms.ToArray();

            }
        }
        public void ConvertCellStyleToUserStyle(ICellStyle cellStyle, CellStyle userCellStyle, HSSFWorkbook wk)
        {
            userCellStyle.FillForegroundColor = cellStyle.FillBackgroundColor;
            userCellStyle.FontColor = cellStyle.GetFont(wk).Color;
            userCellStyle.Alignment = cellStyle.Alignment;
        }

        public int CheckDuplicateUserStyle(ICellStyle cellStyle, HSSFWorkbook wk, string type)
        {
            int index = _userStyleList.FindIndex(t => t.FontColor == cellStyle.GetFont(wk).Color && t.FillForegroundColor == cellStyle.FillForegroundColor && t.Alignment == cellStyle.Alignment);
            if (index >= 0) return index;
            CellStyle user = new CellStyle(wk)
            {
                FontColor = cellStyle.GetFont(wk).Color,
                FillForegroundColor = cellStyle.FillForegroundColor,
                Alignment = cellStyle.Alignment,
                Type = type
            };
            _userStyleList.Add(user);
            return _userStyleList.Count - 1;
        }


        public void GetStyleAll(XElement xe, HSSFWorkbook wk, ref ICellStyle cellStyle, string itemstyle)
        {
            int pos_start = -1;
            int pos_len = -1;

            switch (itemstyle)
            {
                case "background": // background color <-> foreground color in excel
                    pos_start = 17;
                    pos_len = 7;
                    break;
                case "text-dec": // underline... actually, no need to do this... can use regex... but no time to change the code....
                    pos_start = 16;
                    pos_len = 9;
                    break;
                case "color": // font color
                    pos_start = 6;
                    pos_len = 7; // changeable
                    break;
                case "align": // alignment
                    pos_start = 6;
                    pos_len = 4; // changeable
                    break;
                //case "wrap":
                //    break;
                default:
                    pos_start = 0;
                    pos_len = 0;
                    break;
            }

            if (itemstyle == "align")
            {
                if (xe.Attribute("align") != null)
                {
                    string attr = xe.Attribute("align").Value;
                    if (attr == "left")
                    {
                        cellStyle.Alignment = HorizontalAlignment.LEFT;
                    }
                    else if (attr == "right")
                    {
                        cellStyle.Alignment = HorizontalAlignment.RIGHT;
                    }
                    else
                    {
                        cellStyle.Alignment = HorizontalAlignment.CENTER;
                    }
                }
                else
                    cellStyle.Alignment = HorizontalAlignment.LEFT;
            }
            //else if (itemstyle == "wrap")
            //{
            //    if (xe.Attribute("wrap") != null)
            //    {
            //        string attr = xe.Attribute("white-space").Value;
            //        cellStyle.WrapText = attr == "nowrap;";
            //    }
            //    else
            //    {
            //        cellStyle.WrapText = false;
            //    }
            //}
            else if (itemstyle == "text-dec")
            {
                if (xe.Attribute("style") != null && xe.Attribute("style").Value.Contains(itemstyle))
                {
                    GetBackColor(xe.Attribute("style").Value, wk,ref cellStyle, pos_start, pos_len, itemstyle);
                }
            }
            else if (itemstyle == "color" || itemstyle == "background")
            {
                if (xe.Attribute("style") != null && xe.Attribute("style").Value.Contains(itemstyle))
                {
                    GetBackColor(xe.Attribute("style").Value, wk,ref cellStyle, pos_start, pos_len, itemstyle);
                }
                else
                {
                    if (xe.Parent.Attribute("style") != null && xe.Parent.Attribute("style").Value.Contains(itemstyle))
                    {
                        GetBackColor(xe.Parent.Attribute("style").Value, wk,ref cellStyle, pos_start, pos_len, itemstyle);
                    }
                    else
                    {
                        if (itemstyle == "background")
                            cellStyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.WHITE.index;
                    }
                }
            }

        }

        /// <summary>
        /// need to re-write if have time....
        /// </summary>
        /// <param name="attr"></param>
        /// <param name="wk"></param>
        /// <param name="cellStyle"></param>
        /// <param name="posStart"></param>
        /// <param name="posLen"></param>
        /// <param name="type"></param>
        public void GetBackColor(string attr, HSSFWorkbook wk, ref ICellStyle cellStyle, int posStart, int posLen, string type)
        {
            int posDes = 0;
            short npoicolor = 0;
            posDes = attr.IndexOf(type, StringComparison.Ordinal);

            switch (type)
            {
                case "background":
                    //Regex regbackcol = new Regex("background-color:[\\w]+;");
                    string myBackString = string.Empty;

                    Regex regbackcol = new Regex("background-color:*([^;]+)");

                    Match matchbackcol = regbackcol.Match(attr);
                    if (matchbackcol.Success)
                    {
                        string colstr = matchbackcol.Value;

                        if (colstr.Contains("#"))
                        {
                            myBackString = colstr.Substring(posStart, posLen);
                        }
                        else if (colstr.Contains("rgb"))
                        {
                            string col = colstr.Substring(posStart, colstr.Length - posStart).Trim();
                            string colrgb = col.Substring(4, col.Length - 4);
                            int colr = int.Parse(colrgb.Split(‘,‘)[0]);
                            int colg = int.Parse(colrgb.Split(‘,‘)[1]);
                            int colb = int.Parse(colrgb.Split(‘,‘)[2]);
                            myBackString = String.Format("#{0:X2}{1:X2}{2:X2}", colr, colg, colb);
                        }
                        else
                        {
                            string col = colstr.Substring(posStart, colstr.Length - posStart);
                            Color color = Color.FromName(col);
                            myBackString = String.Format("#{0:X2}{1:X2}{2:X2}", color.R, color.G, color.B);
                        }
                        npoicolor = HtmltoColorIndex(wk, myBackString);
                        if (npoicolor != 0)
                        {
                            cellStyle.FillForegroundColor = npoicolor;
                        }
                    }
                    else
                    {
                        cellStyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.WHITE.index;
                    }
                    break;
                case "align":
                    break;
                case "text-dec":
                    IFont fontdec = wk.GetFontAt(0);
                    fontdec.Underline = FontFormatting.U_SINGLE;
                    cellStyle.SetFont(fontdec);
                    break;
                case "color":
                    attr = attr.Replace("-color", "");
                    int posCol = -1;
                    posCol = attr.IndexOf(type);
                    if (posCol >= 0)
                    {
                        if (attr.Contains("#"))
                        {
                            string col = attr.Substring(posDes + posStart, posLen);
                            short index = HtmltoColorIndex(wk, col);
                            IFont font = wk.GetFontAt(0); //////////////////
                            font.Color = index;
                            font.FontName = "verdana";
                            cellStyle.SetFont(font);
                        }
                        else
                        {
                            Regex reg = new Regex("color:[\\w]+");
                            Match match = reg.Match(attr);
                            if (match.Success)
                            {
                                string colstr = match.Value;
                                string col = colstr.Substring(posStart, colstr.Length - posStart);
                                Color color = Color.FromName(col);
                                string myHexString = String.Format("#{0:X2}{1:X2}{2:X2}", color.R, color.G, color.B);
                                short index = HtmltoColorIndex(wk, myHexString);
                                IFont font = wk.GetFontAt(0);///////////////
                                font.Color = index;
                                font.FontName = "verdana";
                                cellStyle.SetFont(font);
                            }
                        }
                    }
                    break;
            }
        }

        public short HtmltoColorIndex(HSSFWorkbook book, string htmlcolor)
        {
            short t = 0;
            System.Drawing.Color color = System.Drawing.ColorTranslator.FromHtml(htmlcolor);
            HSSFPalette palette = book.GetCustomPalette();

            HSSFColor hssfColor = palette.FindColor(color.R, color.G, color.B);

            if (hssfColor == null)
            {
                if (NPOI.HSSF.Record.PaletteRecord.STANDARD_PALETTE_SIZE < 255)
                {
                    if (NPOI.HSSF.Record.PaletteRecord.STANDARD_PALETTE_SIZE < 64)
                    {
                        NPOI.HSSF.Record.PaletteRecord.STANDARD_PALETTE_SIZE = 64;
                        NPOI.HSSF.Record.PaletteRecord.STANDARD_PALETTE_SIZE += 1;
                        hssfColor = palette.AddColor(color.R, color.G, color.B);
                        hssfColor = palette.FindColor(color.R, color.G, color.B);
                    }
                    else
                    {
                        hssfColor = palette.FindSimilarColor(color.R, color.G, color.B);
                    }

                    t = hssfColor.GetIndex();
                }
            }
            else
            {
                t = hssfColor.GetIndex();
            }

            return t;
        }


        public void AttachExcelToEmail(byte[] buff, Email email, string fileName)
        {
            email.AddDataAttachment(fileName, buff);
        }
    }
}

  

NPOI, table string to excel

标签:

原文地址:http://www.cnblogs.com/windy1024/p/5351779.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!