MyXls导出Excel (适用于Winform/WebForm)

Excel文章我已经写了两篇,有时间的可以去看一看。今天再说一种实现导出Excel的第三方组件MyXls组件。

我引用百度百科对它的描述:

MyXls是一个操作Excel的开源类库,支持设置字体、列宽、行高(由BOSSMA实现)、合并单元格、边框、背景颜色、数据类型、自动换行、对齐方式等,通过众多项目的使用表现,

证明MyXls对于创建
简单格式的Excel文件十分快捷方便。 MyXLS是一个导出Excel的好工具,速度快,体积小,而且也不用担心使用Com生成Excel时资源释放的问题了

 

有机会可以去官方下载相关代码,我这里直接给出这个dll的下载地址

MyXls.dll下载

我还根据前两篇文章的实现功能,使用MyXls来实现一下。

如果没有看前两启篇文章的我再说一下实现功能:

(1)Excel行数的限制,office2003的行数为65536行。如果超过这个行数应该再来一个sheet

(2)导出数据慢的问题

(3)如果用微软的Excel插件,还必须在服务器安装office,用此插件就可以解决了。

 

代码实现开始:

(1)下载dll,在你的程序中添加引用,并用引用命名空间

using org.in2bits.MyXls;
using System.IO;

(2)创建Excel工单薄

 XlsDocument xls = new XlsDocument();

  Worksheet sheet = xls.Workbook.Worksheets.Add("新Sheet");

(3)添加内容到sheet中

sheet.Cells.Add(插入单元格的行,插入单元格的列, 插入的值);

例如:

sheet.Cells.Add(1,1, "我是第一行第一列的值");

它的Add方法有四个重载,我这里只讲本例中用到的方法。        

(4)保存

//第一种保存方式:适用于Winform / WebForm
                    string strFilePath = System.AppDomain.CurrentDomain.BaseDirectory;
                    xls.FileName =sheetName;
                    xls.Save(strFilePath);               
                    xls = null;


                //第二种保存方式适用于WebForm,可以选择保存路径
                    using (MemoryStream ms = new MemoryStream())
                    {
                        xls.Save(ms);
                        ms.Flush();
                        ms.Position = 0;

                        xls = null;
                        HttpResponse response = System.Web.HttpContext.Current.Response;
                        response.Clear();
                        response.Charset = "UTF-8";
                        response.ContentType = "application/vnd-excel";//"application/vnd.ms-excel";   
                        System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment; filename=" + xlsname));
                        //System.Web.HttpContext.Current.Response.WriteFile(fi.FullName);                    
                        byte[] data = ms.ToArray();
                        System.Web.HttpContext.Current.Response.BinaryWrite(data);
                    }

基本代码要点,解释完毕,我把完整代码贴出来,供大家参考:

/// <summary>
        /// 第三方插件MyXls导出Excel数据
        /// </summary>
        /// <param name="dt">数据源</param>
        /// <param name="sheetName">sheet表单名称</param>
        /// <param name="xlsname">生成Excel的名称</param>
        /// <returns>返回是否成功信息</returns>
        public static string DataTableToExcel(System.Data.DataTable dt,string sheetName, string xlsname)
        {
            string msg = "";           
            XlsDocument xls = new XlsDocument();
            try
            {              
                //最大行限制
                int MaxRowCount = 60000;

                int rowCount = dt.Rows.Count;
                int colCount = dt.Columns.Count;


                if (rowCount > 0 && rowCount <= MaxRowCount)
                {
                    Worksheet sheet = xls.Workbook.Worksheets.Add(sheetName);
                   
                    for (int j = 0; j < colCount; j++)
                    {
                        sheet.Cells.Add(1, j + 1, dt.Columns[j].ColumnName.ToString());     
                        
                    }

                    for (int j = 0; j < rowCount; j++)
                    {
                     
                        for (int k = 0; k < colCount; k++)
                        {
                            sheet.Cells.Add(j + 2, k + 1, dt.Rows[j][k].ToString());                            
                        }
                    }
                }
                else //超过sheet表单的就再创适sheet表单
                {
                    int sheetCount = 1; //sheet表单个数
                    if (rowCount % MaxRowCount == 0)
                    {
                        sheetCount = rowCount / MaxRowCount;
                    }
                    else
                    {
                        sheetCount = rowCount / MaxRowCount + 1;
                    }

                    int Flag = 1;
                    for (var m = 0; m < sheetCount; m++)
                    {
                        //添加一个sheet表单                       
                        Worksheet sheet = xls.Workbook.Worksheets.Add("" + (m + 1) + "页数据");
                        //如果不是最后一个表单的话 并且最后一个sheet表单数据不等于60000
                        if (Flag == sheetCount && (rowCount % MaxRowCount != 0))
                        {
                            int newrowCount = rowCount - ((Flag - 1) * MaxRowCount); //最后一个sheet的数据


                            int RowIndex = 0;
             
                            for (int j = 0; j < colCount; j++)
                            {   
                                sheet.Cells.Add(1, j + 1, dt.Columns[j].ColumnName.ToString());                  
                            }



                            int startIndex = (Flag - 1) * MaxRowCount;
                            for (int n = startIndex; n < startIndex + newrowCount; n++)
                            {                               
                                for (int t = 0; t < colCount; t++)
                                {
                                    sheet.Cells.Add(RowIndex + 2, t + 1, dt.Rows[n][t].ToString());                 
                                }

                                RowIndex++;
                            }

                        }
                        else
                        {                         
                            for (int j = 0; j < colCount; j++)
                            {               
                                sheet.Cells.Add(1, j + 1, dt.Columns[j].ColumnName.ToString());      
                            }
                            int startIndex = (Flag - 1) * MaxRowCount;
                            int rowIndex = 0;
                            for (int n = startIndex; n < startIndex + MaxRowCount; n++)
                            {
                               
                                for (int t = 0; t < colCount; t++)
                                {
                                    sheet.Cells.Add(rowIndex + 2, t + 1, dt.Rows[n][t].ToString());                 
                                }
                                rowIndex++;
                            }

                        }
                        Flag++;
                    }

                }

                #region 客户端保存
                //第一种保存方式:适用于Winform / WebForm
                    string strFilePath = System.AppDomain.CurrentDomain.BaseDirectory;
                    xls.FileName =sheetName;
                    xls.Save(strFilePath);               
                    xls = null;

                //第二种保存方式适用于WebForm,可以选择保存路径
                    //using (MemoryStream ms = new MemoryStream())
                    //{
                    //    xls.Save(ms);
                    //    ms.Flush();
                    //    ms.Position = 0;

                    //    xls = null;
                    //    HttpResponse response = System.Web.HttpContext.Current.Response;
                    //    response.Clear();
                    //    response.Charset = "UTF-8";
                    //    response.ContentType = "application/vnd-excel";//"application/vnd.ms-excel";   
                    //    System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment; filename=" + xlsname));
                    //    //System.Web.HttpContext.Current.Response.WriteFile(fi.FullName);                    
                    //    byte[] data = ms.ToArray();
                    //    System.Web.HttpContext.Current.Response.BinaryWrite(data);
                    //}
                #endregion
                
            }
            catch
            {
                xls = null;
                GC.Collect();
                return "出现异常";
            }
            finally
            {
                xls = null;
                GC.Collect();
            }

            return msg;
        }

转载地址:http://www.cnblogs.com/yxhblog/archive/2012/06/07/2539894.html

posted @ 2014-09-01 11:36  Alex.Net  阅读(215)  评论(0编辑  收藏  举报