NPOI

前言:

NPOI 技术在别人看来可能有点老生长谈了,但是对于我现在处于的这个创业型公司,还是挺前沿的,不知道是前辈们不知道这个技术,还是懒得去对现有的软件进行修改,因为在现有的软件中,几乎所有的数据导入导出都是依赖于:

Excel.Application(设置excel组件,系统权限,然后还得考虑版本一系列的问题)都是坑

基于现有的方法,之前的技术团队在软件没有推广之前可能自我感觉良好,没有进行一些系统性的测试,在加上一些别的因素吧,导致在工程文件中对 Excel.Application 的操作方法,操作类层出不穷,算了,不揭短了。

有的时候向领导提出想对项目框架优化,或者对代码的优化有所动作的时候,总会有层出不穷的原因导致这个动作渐渐的滞后。这只是一个点,可想而知在没有一个真正的技术经理参与的项目中,没有对框架优化,方法重构的发起人,本来不是很复杂的项目,代码的臃肿,堪忧。

算了,不吐槽了,可能是好久没有写博的原因。

数据输出方法:

    /// <summary>
    /// 携带数据导出
     /// </summary>
    /// <param name="dtSource"></param>
    /// <param name="_excelName"></param>
    /// <param name="str_fieldtext"></param>
    public void export(DataTable dtSource, string _excelName, string str_fieldtext)
    {
        HttpContext curContext = HttpContext.Current;
        // 设置编码和附件格式
        curContext.Response.ContentType = "application/ms-excel";
        curContext.Response.ContentEncoding = Encoding.UTF8;
        curContext.Response.Charset = "";
        string fileName = _excelName + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"; //Excel文件名称
        curContext.Response.AppendHeader("Content-Disposition",
            "attachment;filename=" + HttpUtility.UrlEncode(fileName, Encoding.UTF8));
        //调用导出具体方法Export()
        curContext.Response.BinaryWrite(Export(dtSource, _excelName, str_fieldtext).GetBuffer());
        curContext.Response.End();
    }

导出方法:

#region DataTable导出到Excel
    /// <summary>
    /// DataTable导出到Excel的MemoryStream Export()
    /// </summary>
    /// <param name="dtSource">DataTable数据源</param>
    /// <param name="strHeaderText">Excel表头文本</param>
    /// <param name="str_fieldtext"></param>
    public static MemoryStream Export(DataTable dtSource, string strHeaderText, string str_fieldtext)
    {
        HSSFWorkbook workbook = new HSSFWorkbook();

        ISheet sheet = workbook.CreateSheet("Data");

        ISheet sheet2 = workbook.CreateSheet("ShtDictionary");

        //sheet.DisplayGridlines = false;//隐藏网格线

        #region 右击文件 属性信息
        {
            DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
            dsi.Company = "NPOI";
            workbook.DocumentSummaryInformation = dsi;

            SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
            si.Author = "文件作者信息"; //填加xls文件作者信息
            si.ApplicationName = "创建程序信息"; //填加xls文件创建程序信息
            si.LastAuthor = "最后保存者信息"; //填加xls文件最后保存者信息
            si.Comments = "作者信息"; //填加xls文件作者信息
            si.Title = "标题信息"; //填加xls文件标题信息
            si.Subject = "主题信息";//填加文件主题信息
            si.CreateDateTime = System.DateTime.Now;
            workbook.SummaryInformation = si;
        }
        #endregion

        ICellStyle dateStyle = workbook.CreateCellStyle();

        IDataFormat format = workbook.CreateDataFormat();

        dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");

        //取得列宽
        int[] arrColWidth = new int[dtSource.Columns.Count];

        foreach (DataColumn item in dtSource.Columns)
        {
            arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
        }

        for (int i = 0; i < dtSource.Rows.Count; i++)
        {
            for (int j = 0; j < dtSource.Columns.Count; j++)
            {
                int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;

                if (intTemp > arrColWidth[j])
                {
                    arrColWidth[j] = intTemp;
                }
            }
        }
        int rowIndex = 0;

        foreach (DataRow row in dtSource.Rows)
        {
            #region 新建表,填充表头,填充列头,样式
            if (rowIndex == 65535 || rowIndex == 0)
            {
                if (rowIndex != 0)
                {
                    sheet = workbook.CreateSheet();
                }

                #region 表头及样式
                {
                    //IRow headerRow = sheet.CreateRow(0);

                    //headerRow.HeightInPoints = 25;

                    //headerRow.CreateCell(0).SetCellValue(strHeaderText);

                    //ICellStyle headStyle = workbook.CreateCellStyle();

                    //headStyle.Alignment = HorizontalAlignment.Center;

                    //IFont font = workbook.CreateFont();

                    //font.FontHeightInPoints = 20;

                    //font.Boldweight = 700;

                    //headStyle.SetFont(font);

                    //headerRow.GetCell(0).CellStyle = headStyle;

                    //sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1));
                }
                #endregion

                #region 列头及样式
                {
                    IRow headerRow = sheet.CreateRow(0);

                    ICellStyle headStyle = workbook.CreateCellStyle();

                    headStyle.Alignment = HorizontalAlignment.Center;

                    IFont font = workbook.CreateFont();

                    font.FontHeightInPoints = 10;

                    font.Boldweight = 700;

                    headStyle.SetFont(font);

                    headStyle.FillPattern = FillPattern.SolidForeground;

                    headStyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Yellow.Index2;//单元格背景色

                    HSSFPatriarch patr = sheet.CreateDrawingPatriarch() as HSSFPatriarch;

                    HSSFClientAnchor a = new HSSFClientAnchor();

                    a.Dx1 = 0;

                    a.Dy1 = 0;

                    a.Dx2 = 0;

                    a.Dy2 = 0;

                    int colindex = 27;
                    string[] str_text = { };
                    if (str_fieldtext.Length > 0)
                    {
                        str_text = str_fieldtext.Split(‘,‘);
                    }
                    foreach (DataColumn column in dtSource.Columns)
                    {
                        a.Col1 = column.Ordinal + 1;//批注起始位置的纵坐标(当前单元格位置+2)  

                        a.Col2 = column.Ordinal + 3;//批注结束位置的纵坐标  

                        a.Row1 = column.Ordinal + 0;//批注起始位置的横坐标  

                        a.Row2 = column.Ordinal + 4;//批注结束位置的横坐标  

                        HSSFComment co = patr.CreateComment(a);//实例化批注模型

                        co.String = new HSSFRichTextString(Convert.ToString(column.ColumnName));//批注内容

                        co.Author = "大通软件";//批注者
                        if (str_text.Length > 0)
                            headerRow.CreateCell(column.Ordinal).SetCellValue(str_text[column.Ordinal]);//添加单元格内容
                        else
                            headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);//添加单元格内容
                        headerRow.GetCell(column.Ordinal).CellComment = co;//在该单元格是那个添加批注

                        headerRow.GetCell(column.Ordinal).CellStyle = headStyle;//给该单元格添加样式

                        sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);//设置列宽

                        #region 冻结
                        ///下面对CreateFreezePane的参数作一下说明:
                        ///第一个参数表示要冻结的列数;
                        ///第二个参数表示要冻结的行数,这里只冻结列所以为0;
                        ///第三个参数表示右边区域可见的首列序号,从1开始计算;
                        ///第四个参数表示下边区域可见的首行序号,也是从1开始计算,这里是冻结列,所以为0;
                        //sheet.CreateFreezePane(1, 0, 1, 0);//冻结首列

                        sheet.CreateFreezePane(0, 1, 0, 1);//冻结首行
                        #endregion

                        #region 下拉

                        //if (column.Ordinal == 0)
                        //{
                        //    sheet2.CreateRow(0).CreateCell(0).SetCellValue("itemA");

                        //    sheet2.CreateRow(1).CreateCell(0).SetCellValue("itemB");

                        //    sheet2.CreateRow(2).CreateCell(0).SetCellValue("itemC");
                        //}
                        //else
                        //{
                        //    sheet2.GetRow(0).CreateCell(column.Ordinal).SetCellValue("itemA" + column.Ordinal + "");

                        //    sheet2.GetRow(1).CreateCell(column.Ordinal).SetCellValue("itemB" + column.Ordinal + "");

                        //    sheet2.GetRow(2).CreateCell(column.Ordinal).SetCellValue("itemC" + column.Ordinal + "");
                        //}

                        //string colname = string.Empty;

                        //int remainder = 0;

                        //remainder = colindex % 26;

                        //if (remainder == 0) remainder = 26;

                        //colname = Convert.ToString((char)(remainder + 64));

                        //IName range = workbook.CreateName();

                        //range.RefersToFormula = string.Format("{0}!$" + colname + "$1:$" + colname + "${1}", "ShtDictionary", 3);

                        //range.NameName = "dicRange" + column.Ordinal + "";

                        //ISheet sheet1 = workbook.GetSheet("Data");
                        ////碰对了,第四个参数确定每次的下拉放到哪个column.Ordinal列,因缺思停
                        //CellRangeAddressList regions = new CellRangeAddressList(0, 65535, 0, column.Ordinal);

                        //DVConstraint constraint = DVConstraint.CreateFormulaListConstraint("dicRange" + column.Ordinal + "");

                        //HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);

                        //sheet1.AddValidationData(dataValidate);

                        //colindex++;

                        #endregion
                    }
                }
                #endregion

                rowIndex = 1;
            }
            #endregion

            #region 填充内容

            IRow dataRow = sheet.CreateRow(rowIndex);

            foreach (DataColumn column in dtSource.Columns)
            {
                ICell newCell = dataRow.CreateCell(column.Ordinal);

                string drValue = row[column].ToString();

                switch (column.DataType.ToString())
                {
                    case "System.String"://字符串类型
                        newCell.SetCellValue(drValue);

                        break;
                    case "System.DateTime"://日期类型
                        System.DateTime dateV;
                        System.DateTime.TryParse(drValue, out dateV);
                        newCell.SetCellValue(dateV);
                        newCell.CellStyle = dateStyle;//格式化显示
                        break;
                    case "System.Boolean"://布尔型
                        bool boolV = false;
                        bool.TryParse(drValue, out boolV);
                        newCell.SetCellValue(boolV);
                        break;
                    case "System.Int16"://整型
                    case "System.Int32":
                    case "System.Int64":
                    case "System.Byte":
                        int intV = 0;
                        int.TryParse(drValue, out intV);
                        newCell.SetCellValue(intV);
                        break;
                    case "System.Decimal"://浮点型
                    case "System.Double":
                        double doubV = 0;
                        double.TryParse(drValue, out doubV);
                        newCell.SetCellValue(doubV);
                        break;
                    case "System.DBNull"://空值处理
                        newCell.SetCellValue("");
                        break;
                    default:
                        newCell.SetCellValue("");
                        break;
                }
            }

            #endregion

            rowIndex++;
        }
        using (MemoryStream ms = new MemoryStream())
        {
            workbook.Write(ms);
            ms.Flush();
            ms.Position = 0;
            return ms;
        }
    }
    #endregion

读取excel 数据:

    /// <summary>
    /// 读取excel ,默认第一行为标头(获取DataTable)
    /// </summary>
    /// <param name="strFileName">excel文档路径</param>
    /// <returns></returns>
    public DataTable Import(string strFileName)
    {
        DataTable dt = new DataTable();

        HSSFWorkbook hssfworkbook;

        using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
        {
            hssfworkbook = new HSSFWorkbook(file);
        }
        ISheet sheet = hssfworkbook.GetSheetAt(0);
        System.Collections.IEnumerator rows = sheet.GetRowEnumerator();

        IRow headerRow = sheet.GetRow(0);
        int cellCount = headerRow.LastCellNum;

        for (int j = 0; j < cellCount; j++)
        {
            ICell cell = headerRow.GetCell(j);
            dt.Columns.Add(cell.ToString());
        }

        for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
        {
            IRow row = sheet.GetRow(i);
            DataRow dataRow = dt.NewRow();

            for (int j = row.FirstCellNum; j < cellCount; j++)
            {
                if (row.GetCell(j) != null)
                {
                    if (row.GetCell(j).ToString().Contains(‘/‘))
                    {
                        string[] a = row.GetCell(j).ToString().Split(‘/‘);

                        dataRow[j] = "20" + a[2] + "-" + a[0] + "-" + a[1];
                    }
                    else
                    {
                        dataRow[j] = row.GetCell(j).ToString();
                    }
                }
                else
                {
                    dataRow[j] = null;
                }
            }

            dt.Rows.Add(dataRow);
        }
        return dt;
    }

换一种方式:

    /// <summary>
    /// 导出excel 模板
     /// </summary>
    /// <param name="str_fieldid"></param>
    /// <param name="str_fieldtext"></param>
    /// <returns></returns>
    public void export(string _excelName, string str_fieldid, string str_fieldtext)
    {
        HSSFWorkbook workbook = new HSSFWorkbook();

        ISheet sheet = workbook.CreateSheet("Data");

        #region 右击文件 属性信息
        {
            DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
            dsi.Company = "NPOI";
            workbook.DocumentSummaryInformation = dsi;

            SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
            si.Author = "文件作者信息"; //填加xls文件作者信息
              si.ApplicationName = "创建程序信息"; //填加xls文件创建程序信息
              si.LastAuthor = "最后保存者信息"; //填加xls文件最后保存者信息
              si.Comments = "作者信息"; //填加xls文件作者信息
              si.Title = "标题信息"; //填加xls文件标题信息
              si.Subject = "主题信息";//填加文件主题信息
              si.CreateDateTime = System.DateTime.Now;
            workbook.SummaryInformation = si;
        }
        #endregion

        ICellStyle dateStyle = workbook.CreateCellStyle();

        IDataFormat format = workbook.CreateDataFormat();

        dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");

        int rowIndex = 0;

        #region 新建表,填充表头,填充列头,样式
        if (rowIndex == 65535 || rowIndex == 0)
        {
            if (rowIndex != 0)
            {
                sheet = workbook.CreateSheet();
            }

            #region 列头及样式
            {
                IRow headerRow = sheet.CreateRow(0);

                ICellStyle headStyle = workbook.CreateCellStyle();

                headStyle.Alignment = HorizontalAlignment.Center;

                IFont font = workbook.CreateFont();

                font.FontHeightInPoints = 10;

                font.Boldweight = 700;

                headStyle.SetFont(font);

                headStyle.FillPattern = FillPattern.SolidForeground;

                headStyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Yellow.Index2;//单元格背景色

                HSSFPatriarch patr = sheet.CreateDrawingPatriarch() as HSSFPatriarch;

                HSSFClientAnchor a = new HSSFClientAnchor();

                a.Dx1 = 0;

                a.Dy1 = 0;

                a.Dx2 = 0;

                a.Dy2 = 0;

                string[] str_text = { };

                string[] str_field = { };

                if (str_fieldtext.Length > 0)
                {
                    str_text = str_fieldtext.Split(‘,‘);
                }

                if (str_fieldid.Length > 0)
                {
                    str_field = str_fieldid.Split(‘,‘);
                }

                //取得列宽
                int[] arrColWidth = new int[str_text.Length];

                for (int i = 0; i < str_text.Length; i++)
                {
                    a.Col1 = i + 1;//批注起始位置的纵坐标(当前单元格位置+2)  

                    a.Col2 = i + 3;//批注结束位置的纵坐标  

                    a.Row1 = i + 0;//批注起始位置的横坐标  

                    a.Row2 = i + 4;//批注结束位置的横坐标  

                    HSSFComment co = patr.CreateComment(a);//实例化批注模型

                    co.String = new HSSFRichTextString(Convert.ToString(str_field[i]));//批注内容

                    co.Author = "大通软件";//批注者
                    if (str_text.Length > 0)
                        headerRow.CreateCell(i).SetCellValue(str_text[i]);//添加单元格内容
                    else
                        headerRow.CreateCell(i).SetCellValue(str_field[i]);//添加单元格内容
                    headerRow.GetCell(i).CellComment = co;//在该单元格是那个添加批注

                    headerRow.GetCell(i).CellStyle = headStyle;//给该单元格添加样式

                    sheet.SetColumnWidth(i, 20 * 256);//设置列宽

                    //sheet.SetColumnWidth(i, 250);

                    #region 冻结

                    sheet.CreateFreezePane(0, 1, 0, 1);//冻结首行

                    #endregion
                }
            }
            #endregion

            rowIndex = 1;
        }
        #endregion

        using (MemoryStream ms = new MemoryStream())
        {
            workbook.Write(ms);
            ms.Flush();
            ms.Position = 0;
            ExportOut(ms, _excelName);
        }
    }

    /// <summary>
    /// 输出方法
    /// </summary>
    /// <param name="ms"></param>
    /// <param name="_excelName"></param>
    public void ExportOut(MemoryStream ms, string _excelName)
    {
        HttpContext curContext = HttpContext.Current;
        // 设置编码和附件格式
         curContext.Response.ContentType = "application/ms-excel";
        curContext.Response.ContentEncoding = Encoding.UTF8;
        curContext.Response.Charset = "";
        string fileName = _excelName + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"; //Excel文件名称
          curContext.Response.AppendHeader("Content-Disposition",
            "attachment;filename=" + HttpUtility.UrlEncode(fileName, Encoding.UTF8));
        //调用导出具体方法Export()
        curContext.Response.BinaryWrite(ms.GetBuffer());
        curContext.Response.End();
    }

NPOI组件:    http://files.cnblogs.com/files/houlin/NPOI.zip

后言:

以上就是一些方法来自园子里好多前辈的博文,我自己没有做什么优化,目前只做记录,备忘,不喜勿喷。

时间: 2024-10-11 00:21:27

NPOI的相关文章

到处到Excel中NPOI

源地址:http://www.cnblogs.com/dreamof/archive/2010/06/02/1750151.html\ 1.NPOI官方网站:http://npoi.codeplex.com/ 可以到此网站上去下载最新的NPOI组件版本 2.NPOI在线学习教程(中文版): http://www.cnblogs.com/tonyqus/archive/2009/04/12/1434209.html 感谢Tony Qu分享出NPOI组件的使用方法 3..NET调用NPOI组件导入导

用NPOI从DataBase到Excel &#39;2

NPOI的C# Helper代码2 1 public static MemoryStream ExportXls(DataTable dt) 2 { 3 HSSFWorkbook wk = new HSSFWorkbook(); 4 ISheet sheet = null; 5 6 string sheetName = "Sheet1"; 7 if (!string.IsNullOrEmpty(dt.TableName)) 8 { 9 sheetName = dt.TableName;

用NPOI从DataBase到Excel

NPOI的C# Helper代码 1 public static void WriteExcel(DataTable dt, string filePath) 2 { 3 if (!string.IsNullOrEmpty(filePath) && dt.Rows.Count > 0) 4 { 5 HSSFWorkbook wk = new HSSFWorkbook(); 6 ISheet sheet = wk.CreateSheet(dt.TableName); 7 8 //列头

基于NPOI的Excel数据导入

从Excel导入数据最令人头疼的是数据格式的兼容性,特别是日期类型的兼容性.为了能够无脑导入日期,折腾了一天的NPOI.在经过测试确实可以导入任意格式的合法日期后,写下这篇小文,与大家共享.完整代码请移步:https://github.com/xuanbg/Utility 概述: 这个帮助类是一个泛型类,泛型参数对应的实体类还起到模板的作用.如果你的Excel文件使用与实体类不同的列标题的话,可以通过给属性加上Alias特性,将列标题和属性进行对应.例如: Excel格式如图: 实体类: 1 u

NPOI.dll 用法。单元格,样式,字体,颜色,行高,宽度。读写excel

1.25 NPOI.dll using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; using NPOI.HSSF.UserMod

Npoi导出Excel 实战篇(Webform)

废话不多说,直接上遇到的问题 需求:在这个界面点击导出,导出页面数据,苦于没有做过webfrom项目,弄了半天还是没想到原生态的好方法,所以在网上看了下有没有导出的好例子,结果发现有人推荐使用Npoi,抱着强烈的好奇心,就去查了下这个东东,发现果然强大,哈哈,里面集成了很多东西,下面直接进入解决问题正题: 实现过程(仅供参考) ①发现项目里面接口方法返回DataTable是带参数的,所以新增了一个无参数的方法 ②实现这个方法,重点是将查询到的结果集放大DataTable中 ③先去官网:http:

Topshelf+Quartz.net+Dapper+Npoi(一)

背景 前段时间公司有个需求(每天给业务导出一批数据,以excel的形式通过邮件发送给他).A说:直接写个服务,判断等于某个时间点,执行一下sql语句,生成excel,写个EmaiHelper发送给他不就得了,这有什么麻烦的?B说:我了个亲娘来,还写服务呢?你还需要搞个timer去判断时间点?多费劲啊,直接写个控制台程序,添加个任务计划,不就搞定了吗?我只想说:你们都是大神,每次都不加点新的东西,还写什么代码,多么没劲啊,前两天看到了topshelf+quartz.net这个东东,可以做个练习了.

第三方库NPOI,EPPlus,MyXls导出Excel性能比较

测试平台 CPU:i5 6500 内存:2x4G .NET4.0 测试结果如下: 性能上通过对比很容易得出结论,各方面npoi是最优选择.epplus在列数不是很多的情况下,性能也不错,但是当数据多了的情况下, 对比npoi就有不小的差距了.至于MyXls在测试过程中,当数据较多时,内存不够支撑,直接崩溃了. 性能比较结果: npoi>epplus>Myxls 功能比较结果: npoi是最全的,即能导出2003的.xls格式也能导出2007以后的.xlsx格式.MyXls只能导出.xls,ep

使用NPOI的优势

(一)传统操作Excel遇到的问题: 1.如果是.NET,需要在服务器端装Office,且及时更新它,以防漏洞,还需要设定权限允许.NET访问COM+,如果在导出过程中出问题可能导致服务器宕机. 2.Excel会把只包含数字的列进行类型转换,本来是文本型的,Excel会将其转成数值型的,比如编号000123会变成123. 3.导出时,如果字段内容以“-”或“=”开头,Excel会把它当成公式进行,会报错. 4.Excel会根据Excel文件前8行分析数据类型,如果正好你前8行某一列只是数字,那它