利用npoi导出excel

转自:http://www.yongfa365.com/Item/NPOI-MyXls-DataTable-To-Excel-From-Excel.html

  NPOI开源地址:http://npoi.codeplex.com/
  NPOI中文文档:http://www.cnblogs.com/tonyqus/archive/2009/04/12/1434209.html

  MyXls开源地址:http://sourceforge.net/projects/myxls/

NPOI 快速入门例子:

  1. /// <summary>   
  2. /// NPOI简单Demo,快速入门代码   
  3. /// </summary>   
  4. /// <param name="dtSource"></param>   
  5. /// <param name="strFileName"></param>   
  6. /// <remarks>NPOI认为Excel的第一个单元格是:(0,0)</remarks>   
  7. /// <Author>柳永法 http://www.yongfa365.com/ 2010-5-8 22:21:41</Author>   
  8. public static void ExportEasy(DataTable dtSource, string strFileName)   
  9. {   
  10.      HSSFWorkbook workbook = new HSSFWorkbook();   
  11.      HSSFSheet sheet = workbook.CreateSheet();   
  12.   
  13.     //填充表头   
  14.      HSSFRow dataRow = sheet.CreateRow(0);   
  15.     foreach (DataColumn column in dtSource.Columns)   
  16.      {   
  17.          dataRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);   
  18.      }   
  19.   
  20.   
  21.     //填充内容   
  22.     for (int i = 0; i < dtSource.Rows.Count; i++)   
  23.      {   
  24.          dataRow = sheet.CreateRow(i + 1);   
  25.         for (int j = 0; j < dtSource.Columns.Count; j++)   
  26.          {   
  27.              dataRow.CreateCell(j).SetCellValue(dtSource.Rows[i][j].ToString());   
  28.          }   
  29.      }   
  30.   
  31.   
  32.     //保存   
  33.     using (MemoryStream ms = new MemoryStream())   
  34.      {   
  35.         using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))   
  36.          {   
  37.              workbook.Write(fs);   
  38.          }   
  39.      }   
  40.      workbook.Dispose();   
  41. }  

接下来是柳永法(yongfa365)'Blog封装的可以用在实际项目中的类,实现的功能有(仅NPOI):

  1. 支持web及winform从DataTable导出到Excel。
  2. 生成速度很快。
  3. 准确判断数据类型,不会出现身份证转数值等上面提到的一系列问题。
  4. 如果单页条数大于65535时会新建工作表。
  5. 列宽自适应。
  6. 支持读取Excel。
  7. 调用方便,只一调用一个静态类就OK了。

因为测试期间发现MyXls导出速度要比NPOI慢3倍,而NPOI既能满足我们的导出需求,又能很好的满足我们的导入需求,所以只针对NPOI进行全方位功能实现及优化。

NPOI导入导出相关类:

NPOI导入导出相关类:


using System;  
using System.Collections.Generic;  
using System.Data;  
using System.IO;  
using System.Text;  
using System.Web;  
using NPOI;  
using NPOI.HPSF;  
using NPOI.HSSF;  
using NPOI.HSSF.UserModel;  
using NPOI.HSSF.Util;  
using NPOI.POIFS;  
using NPOI.Util;  


public class ExcelHelper  
{  
    /// <summary>  
    /// DataTable导出到Excel文件  
    /// </summary>  
    /// <param name="dtSource">源DataTable</param>  
    /// <param name="strHeaderText">表头文本</param>  
    /// <param name="strFileName">保存位置</param>  
    /// <Author>柳永法 http://www.yongfa365.com/ 2010-5-8 22:21:41</Author>  
    public static void Export(DataTable dtSource, string strHeaderText, string strFileName)  
    {  
        using (MemoryStream ms = Export(dtSource, strHeaderText))  
        {  
            using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))  
            {  
                byte[] data = ms.ToArray();  
                fs.Write(data, 0, data.Length);  
                fs.Flush();  
            }  
        }  
    }  

    /// <summary>  
    /// DataTable导出到Excel的MemoryStream  
    /// </summary>  
    /// <param name="dtSource">源DataTable</param>  
    /// <param name="strHeaderText">表头文本</param>  
    /// <Author>柳永法 http://www.yongfa365.com/ 2010-5-8 22:21:41</Author>  
    public static MemoryStream Export(DataTable dtSource, string strHeaderText)  
    {  
        HSSFWorkbook workbook = new HSSFWorkbook();  
        HSSFSheet sheet = workbook.CreateSheet();

        #region 右击文件 属性信息  
        {  
            DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();  
            dsi.Company = "http://www.yongfa365.com/";  
            workbook.DocumentSummaryInformation = dsi;  

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

        HSSFCellStyle dateStyle = workbook.CreateCellStyle();  
        HSSFDataFormat 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 表头及样式  
                {  
                    HSSFRow headerRow = sheet.CreateRow(0);  
                    headerRow.HeightInPoints = 25;  
                    headerRow.CreateCell(0).SetCellValue(strHeaderText);  

                    HSSFCellStyle headStyle = workbook.CreateCellStyle();  
                    headStyle.Alignment = CellHorizontalAlignment.CENTER;  
                    HSSFFont font = workbook.CreateFont();  
                    font.FontHeightInPoints = 20;  
                    font.Boldweight = 700;  
                    headStyle.SetFont(font);  

                    headerRow.GetCell(0).CellStyle = headStyle;  

                    sheet.AddMergedRegion(new Region(0, 0, 0, dtSource.Columns.Count - 1));  
                    headerRow.Dispose();  
                }
                #endregion


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


                    HSSFCellStyle headStyle = workbook.CreateCellStyle();  
                    headStyle.Alignment = CellHorizontalAlignment.CENTER;  
                    HSSFFont font = workbook.CreateFont();  
                    font.FontHeightInPoints = 10;  
                    font.Boldweight = 700;  
                    headStyle.SetFont(font);  


                    foreach (DataColumn column in dtSource.Columns)  
                    {  
                        headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);  
                        headerRow.GetCell(column.Ordinal).CellStyle = headStyle;  

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

                    }  
                    headerRow.Dispose();  
                }
                #endregion  

                rowIndex = 2;  
            }
            #endregion


            #region 填充内容  
            HSSFRow dataRow = sheet.CreateRow(rowIndex);  
            foreach (DataColumn column in dtSource.Columns)  
            {  
                HSSFCell newCell = dataRow.CreateCell(column.Ordinal);  

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

                switch (column.DataType.ToString())  
                {  
                    case "System.String"://字符串类型  
                        newCell.SetCellValue(drValue);  
                        break;  
                    case "System.DateTime"://日期类型  
                        DateTime dateV;  
                        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;  

            sheet.Dispose();  
           //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet  
            return ms;  
        }  

    }  


    /// <summary>  
    /// 用于Web导出  
    /// </summary>  
    /// <param name="dtSource">源DataTable</param>  
    /// <param name="strHeaderText">表头文本</param>  
    /// <param name="strFileName">文件名</param>  
    /// <Author>柳永法 http://www.yongfa365.com/ 2010-5-8 22:21:41</Author>  
    public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName)  
    {  

        HttpContext curContext = HttpContext.Current;  

        // 设置编码和附件格式  
        curContext.Response.ContentType = "application/vnd.ms-excel";  
        curContext.Response.ContentEncoding = Encoding.UTF8;  
        curContext.Response.Charset = "";  
        curContext.Response.AppendHeader("Content-Disposition",   
            "attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8));  

        curContext.Response.BinaryWrite(Export(dtSource, strHeaderText).GetBuffer());  
        curContext.Response.End();  

    }  


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

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

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

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

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

            for (int j = row.FirstCellNum; j < cellCount; j++)  
            {  
                if (row.GetCell(j) != null)  
                    dataRow[j] = row.GetCell(j).ToString();  
            }  

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

参考地址:

NPOI导出Excel表功能实现(多个工作簿):http://www.cnblogs.com/zhengjuzhuan/archive/2010/02/01/1661103.html
在 Server 端存取 Excel 檔案的利器:NPOI Library:http://msdn.microsoft.com/zh-tw/ee818993.aspx
ASP.NET使用NPOI类库导出Excel:http://www.cnblogs.com/niunan/archive/2010/03/30/1700706.html

总结:

  通过以上分析,我们不难发现,用NPOI或MyXls代替是Excel是很明智的,在发文前,我看到NPOI及MyXls仍然在活跃的更新中。在使用过程中发现这两个组件极相似,以前看过文章说他们使用的内核是一样的。还有NPOI是国人开发的,且有相关中文文档,在很多地方有相关引用,下载量也很大。并且它支持Excel,看到MyXls相关问题基本上没人回答,所以推荐使用NPOI。MyXls可以直接Cell.Font.Bold操作,而NPOI得使用CellType多少感觉有点麻烦。

转载于:https://www.cnblogs.com/shanglei/archive/2011/03/19/1988590.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值