Bootstrap

C#操作Excel文件

C#操作Excel文件

前言
好久没更新博客了,趁着最近经常需要使用到Excel,就随手更新下博客把!由于之前一直使用的是Microsoft.Office.Interop.Excel,但是呢,在使用的过程中遇到过各种问题,比如说对于Office2003和Office2010的时候,需要配置不同的连接字符串,配置完后有些还是会报错,就需要注册dll。于是,就想能不能换个dll继续搞。于是,我们本次的主角Aspose.Cell.dll登场了。

方法

1、操作Excel工作表数据转成DataTable对象

对于.net来说,Excel相当于我们数据库中的数据库,而其中的WorkSheet也就是工作表,相当于我们数据库中的Table,于是,针对我们使用的对象,我们对DataTable的操作还是比较方便的,于是,我们就有了下面的方法。

        #region 从Excel导入数据成DataTable
        /// <summary>
        /// 从Excel导入数据成DataTable
        /// </summary>
        /// <param name="ExcelPath">导入的数据路径</param>
        /// <param name="SheetName">选择的表明 可以用索引0</param>
        /// <returns></returns>
        public static DataTable GetDataTable(string ExcelPath, string SheetName)
        {
            DataTable dt = new DataTable();
            try
            {
                //先获得WorkBook 类似数据集DataSet
                Aspose.Cells.Workbook workbook = new Aspose.Cells.Workbook(ExcelPath);
                //获取数据工作表 可以用数字索引 类似DataTable
                Aspose.Cells.Worksheet sheet = workbook.Worksheets[SheetName];
                //数据范围 默认从第0行 第0列开始
                //最大行 最大列
                //是否读取列字段名
                dt = sheet.Cells.ExportDataTable(0, 0, sheet.Cells.MaxDataRow + 1, sheet.Cells.MaxDataColumn + 1, true);
            }
            catch (Exception)
            {
                dt = null;
            }
            return dt;
        } 
        #endregion

2、DataGridView数据转DataTable对象

我们在数据导出到Excel之前,肯定是要让客户预览表格数据的内容,所以在此需要从DataGridView数据到DataTable数据的一个中转。

		#region DataGridView转换为DataTable
        /// <summary>
        /// DataGridView转换为DataTable
        /// </summary>
        /// <param name="dgv"></param>
        /// <returns></returns>
        public static DataTable GetDgvToTable(DataGridView dgv)
        {
            DataTable dt = new DataTable();
            // 列强制转换
            for (int count = 0; count < dgv.Columns.Count; count++)
            {
                DataColumn dc = new DataColumn(dgv.Columns[count].Name.ToString());
                dt.Columns.Add(dc);
            }
            // 循环行
            for (int count = 0; count < dgv.Rows.Count; count++)
            {
                DataRow dr = dt.NewRow();
                for (int countsub = 0; countsub < dgv.Columns.Count; countsub++)
                {
                    dr[countsub] = Convert.ToString(dgv.Rows[count].Cells[countsub].Value);
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }
        #endregion

3、确保导出文件路径无误

		#region 确保路径无误创建
         public bool CreateDirectory(string directoryPath)
        {
            try
            {
                if (!isExistsDirectory(directoryPath))     // 返回bool类型,存在返回true,不存在返回false
                {
                    Directory.CreateDirectory(directoryPath);      //不存在则创建路径
                    return true;
                }
                else
                {
                    return true;
                }
            }
            catch (Exception ex)
            {
                LogHelper.LogFileHelper.SaveLogForExceptionClient(ex.ToString());
                return false;
            }
        }
        #endregion

4、从DataTable对象导出到Excel数据

也就是我们常用到的数据导出功能

 		#region DataTable数据导出Excel任务文件
        /// <summary>
        /// DataTable数据导出Excel任务文件
        /// </summary>
        /// <param name="data1">DataTable对象</param>
        /// <param name="filePath">文件保存的路径</param>
        /// <param name="ColumnsHeadText">保存的Excel标题名称</param>
        private static void TotalMethod(DataTable data1, string filePath, string[] ColumnsHeadText)
        {
            try
            {
                CreateDirectory(filePath);
                //Workbook book = new Workbook("E:\\test.xlsx"); //打开工作簿
                Workbook book = new Workbook(); //创建工作簿
                Worksheet sheet = book.Worksheets[0]; //创建工作表
                Cells cells = sheet.Cells; //单元格
                //创建标题样式
                Aspose.Cells.Style style = book.Styles[book.Styles.Add()];
                style.Borders[Aspose.Cells.BorderType.LeftBorder].LineStyle = Aspose.Cells.CellBorderType.Thin; //应用边界线 左边界线  
                style.Borders[Aspose.Cells.BorderType.RightBorder].LineStyle = Aspose.Cells.CellBorderType.Thin; //应用边界线 右边界线  
                style.Borders[Aspose.Cells.BorderType.TopBorder].LineStyle = Aspose.Cells.CellBorderType.Thin; //应用边界线 上边界线  
                style.Borders[Aspose.Cells.BorderType.BottomBorder].LineStyle = Aspose.Cells.CellBorderType.Thin; //应用边界线 下边界线   
                style.HorizontalAlignment = TextAlignmentType.Center; //单元格内容的水平对齐方式文字居中
                style.Font.Name = "宋体"; //字体
                style.Font.IsBold = true; //设置粗体
                style.Font.Size = 14; //设置字体大小
                //style.ForegroundColor = System.Drawing.Color.FromArgb(153, 204, 0); //背景色
                //style.Pattern = Aspose.Cells.BackgroundType.Solid; //背景样式
                style.IsTextWrapped = true; //单元格内容自动换行

                //创建内容样式
                Aspose.Cells.Style style1 = book.Styles[book.Styles.Add()];
                style1.Borders[Aspose.Cells.BorderType.LeftBorder].LineStyle = Aspose.Cells.CellBorderType.Thin; //应用边界线 左边界线  
                style1.Borders[Aspose.Cells.BorderType.RightBorder].LineStyle = Aspose.Cells.CellBorderType.Thin; //应用边界线 右边界线  
                style1.Borders[Aspose.Cells.BorderType.TopBorder].LineStyle = Aspose.Cells.CellBorderType.Thin; //应用边界线 上边界线  
                style1.Borders[Aspose.Cells.BorderType.BottomBorder].LineStyle = Aspose.Cells.CellBorderType.Thin; //应用边界线 下边界线   
                style1.HorizontalAlignment = TextAlignmentType.Center; //单元格内容的水平对齐方式文字居中
                style1.Font.Name = "宋体"; //字体
                style1.Font.IsBold = false; //设置粗体
                style1.Font.Size = 11; //设置字体大小
                //style.ForegroundColor = System.Drawing.Color.FromArgb(153, 204, 0); //背景色
                //style.Pattern = Aspose.Cells.BackgroundType.Solid; //背景样式
                style1.IsTextWrapped = true; //单元格内容自动换行
                if (data1.Rows.Count > 0)
                {
                    //表格填充DataTable1数据
                    int Colnum1 = data1.Columns.Count;//表格列数 
                    int Rownum1 = data1.Rows.Count;//表格行数 
                    //生成行 列名行 
                    for (int i = 0; i < Colnum1; i++)
                    {
                        if (i < ColumnsHeadText.Length)
                        {
                            string strTemp = ColumnsHeadText[i];
                            cells[0, i].PutValue(strTemp); //添加表头
                        }
                        else
                        {
                            cells[0, i].PutValue(data1.Columns[i].ColumnName); //添加表头
                        }
                        cells[0, i].SetStyle(style); //添加样式
                        if (i == 5)
                        {
                            cells.SetColumnWidth(i, 100.0); //自定义列宽
                        }
                        else
                        {
                            cells.SetColumnWidth(i, 35); //自定义列宽
                        }
                        cells.SetRowHeight(0, 30); //自定义高
                    }
                    //生成数据行 
                    for (int i = 0; i < Rownum1; i++)
                    {
                        for (int k = 0; k < Colnum1; k++)
                        {
                            cells[1 + i, k].PutValue(data1.Rows[i][k].ToString()); //添加数据
                            cells[1 + i, k].SetStyle(style1); //添加样式
                        }
                    }
                    sheet.AutoFitColumns(); //自适应宽
                    if (!Directory.Exists(filePath))
                    {
                        Directory.CreateDirectory(filePath);
                    }
                    if (Directory.Exists(filePath))
                    {
                        filePath += @"\" + DateTime.Now.ToString("yyyyMMdd_hh_mm") + ".xls";
                    }
                    book.Save(filePath);
                    GC.Collect();
                    MessageBox.Show("导出报表到Excel文件成功");
                }
                else
                {
                    MessageBox.Show("数据源内容为空,不允许导出数据");
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }
        #endregion

结尾
个人是强烈推荐使用Aspose.Cells.dll 因为他在使用的过程中不会因为版本原因和各种单元格格式的问题而报错,且处理速度很快。
需要的筒子们可以自行下载:Aspose.Cell.dll 点击此处即可下载
链接:https://pan.baidu.com/s/11Mic3mnpZjMdRe3vR3jMDw
提取码:o9jx

;