zoukankan      html  css  js  c++  java
  • 对Aspose.Cells Excel文件操作的扩展

                      工作中对Excel操作的需求很是常见,今天其他项目组的同事在进行Excel数据导入时,使用Aspose.Cells Excel 遇到了些问题。

                      刚好闲来不忙,回想自己用过的Excel文件操作,有NPOI /自己封装的 ExcelHelper(基于AccessDatabaseEngine.exe)/ MyXls / Aspose.Cells ,多而杂。自己本地有时做数据处理常常使用自己的ExcelHelper做数据处理,因为很方便,可以拿当Excel当数据库一

    样来用。 但唯一不爽的是首先电脑上得安装 AccessDatabaseEngine.exe ,那么如果是服务器,多台服务器,如都使用了基于 这种方法的Excel ,还得再给服务器安装 AccessDatabaseEngine.exe,甚是麻烦。

                     看看自己的ExcelHelper ,自己想固定一种封装好自己的常用Excel文件操作方式,前段时间用了Aspose.Cells 操作Excel ,也感觉甚是方便,结合自己的ExcelHelper ,就有了新的想法:如果Aspose.Cells 还有自己不习惯用的地方,那我就扩展。

           分享下我常用的ExcelHelper:http://git.oschina.net/lztkdr/codes/nr9z153jtq7xvbm28fwkg

         下面分享下,我新封装的基于Aspose.Cells的 扩展方法:  

         1. GetSheetNames 获取Excel文件的所有 sheetName。

         2. GetColumnNames 获取当前所有 工作表的所有列。

         3. GetSheetData 像Sql查询一样,对已经工作表的数据 查询筛选。

                    4. GetAllSheetData 得到Excel 文件的所有 工作表数据。  

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    
    namespace Aspose.Cells
    {
    
        /// <summary>
        /// Aspose.Cells Excel文件操作 扩展
        /// </summary>
        public static class AsposeCellsExtensions
        {
    
            /// <summary>
            /// 快速创建一个含有指定列的DataTable
            /// </summary>
            /// <param name="data">new DataTable().CreateDataTable</param>
            /// <param name="columnNames">列名</param>
            /// <returns></returns>
            public static DataTable CreateDataTable(this DataTable data, params string[] columnNames)
            {
                data = data ?? new DataTable();
                if (columnNames != null && columnNames.Length > 0)
                {
                    data.Columns.AddRange(columnNames.Select(t => new DataColumn(t)).ToArray());
                }
                return data;
            }
    
    
            /// <summary>
            /// 获取当前Exel的所有SheetName
            /// </summary>
            /// <param name="this"></param>
            /// <returns></returns>
            public static List<string> GetSheetNames(this Workbook @this)
            {
                if (@this == null) throw new ArgumentNullException("@this");
                return @this.Worksheets.Select(t => t.Name).ToList();
            }
    
            /// <summary>
            /// 获取当前Sheet的所有 列名(注:第一行是列名标题,不作为数据使用)
            /// </summary>
            /// <param name="this"></param>
            /// <returns>获取所有列名</returns>
            public static List<string> GetColumnNames(this Worksheet @this)
            {
                if (@this == null) throw new ArgumentNullException("@this");
                List<string> lstColNames = new List<string>();
                for (int j = 0; j <= @this.Cells.MaxDataColumn; j++)
                {
                    lstColNames.Add(@this.Cells[0, j].DisplayStringValue);
                }
                return lstColNames;
            }
    
            /// <summary>
            /// 查询表中的数据,查询指定行,过滤指定值(注:第一行是列名标题,不作为数据使用)
            /// </summary>
            /// <param name="this"></param>
            /// <param name="sheetName">表名</param>
            /// <param name="selectColumns">列名,多列名用逗号(",")隔开</param>
            /// <param name="whereFilter">过滤行数据的 表达式</param>
            /// <returns></returns>
            public static DataTable GetSheetData(this Workbook @this, string sheetName, string selectColumns = "*", string whereFilter = "")
            {
                if (@this == null) throw new ArgumentNullException("@this");
                Worksheet wsh = @this.Worksheets[sheetName];
                if (wsh == null) throw new ArgumentNullException("未找到【" + sheetName + "");
    
                string[] columnNames = { };
                if (selectColumns != "*")
                {
                    columnNames = selectColumns.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                    if (columnNames.Length <= 0)
                    {
                        throw new ArgumentException("查询的列头不正确【" + selectColumns + "");
                    }
                }
    
                DataTable data = null;
                if (selectColumns == "*")
                {
                    data = wsh.Cells.ExportDataTable(0, 0, wsh.Cells.MaxDataRow + 1, wsh.Cells.MaxDataColumn + 1);
                }
                else
                {
                    #region 查到 列名 所在 位置
                    List<int> lstIndex = new List<int>();
                    for (int j = 0; j <= wsh.Cells.MaxDataColumn; j++)
                    {
                        Cell cell = wsh.Cells[0, j];
                        if (columnNames.Contains(cell.DisplayStringValue, StringComparer.OrdinalIgnoreCase))
                        {
                            lstIndex.Add(cell.Column);
                        }
                    }
                    #endregion
                    data = wsh.Cells.ExportDataTable(0, 0, wsh.Cells.MaxDataRow + 1, columnNames.Length, new ExportTableOptions() { Indexes = lstIndex.ToArray() });
                }
    
                #region 第一行数据的值 即是 当前的列名称
                for (int j = 0; j < data.Columns.Count; j++)
                {
                    data.Columns[j].ColumnName = data.Rows[0][j].ToString();
                }
                data.Rows.RemoveAt(0);
                #endregion
    
                if (!string.IsNullOrWhiteSpace(whereFilter))
                {
                    var dv = data.DefaultView;
                    dv.RowFilter = whereFilter;
                    data = dv.ToTable();
                }
                return data;
            }
    
    
            /// <summary>
            /// 获取所有数据
            /// </summary>
            /// <param name="this">Excel Workbook 对象</param>
            /// <param name="HDR_YES">第一行是列名标题,不作为数据使用</param>
            /// <returns>表名对应的数据 集合</returns>
            public static Dictionary<string, DataTable> GetAllSheetData(this Workbook @this,bool HDR_YES = true)
            {
                if (@this == null) throw new ArgumentNullException("@this");
                Dictionary<string, DataTable> dict = new Dictionary<string, DataTable>();
                var lstName = GetSheetNames(@this);
                foreach (string sheetName in lstName)
                {
                    if (HDR_YES)
                    {
                        dict.Add(sheetName, GetSheetData(@this, sheetName));
                    }
                    else
                    {
                        dict.Add(sheetName, @this.Worksheets[sheetName].Cells.ExportDataTable(0, 0,
                            @this.Worksheets[sheetName].Cells.MaxDataRow + 1, @this.Worksheets[sheetName].Cells.MaxDataColumn + 1));
                    }
                }
                return dict;
            }
        }
    }

          使用方式:                 

                string file = Path.GetFullPath(@"....ExcelBA02利润表_temp.xlsx");
    
                Workbook wk = new Aspose.Cells.Workbook(file);
    
                List<string> lstSheetName = wk.GetSheetNames();
    
                Worksheet wsh = wk.Worksheets["sheet2"];
    
                var lst = wsh.GetColumnNames();
    
                var data = wk.GetSheetData("Sheet2", "行次,级别", "行次<=10");
    
                var dict = wk.GetAllSheetData();
  • 相关阅读:
    visual studio 2012 知识笔记
    R语言初体验
    java_Thread
    LoadRunner JAVA Vuser协议手工写脚本Failed to find Classes.zip entry in Classpath问题
    如何判断某个数据表是否存在
    ftp://hxtech.com
    成本算法
    移动平均算法
    命令行解压缩文件
    互斥(mutex)
  • 原文地址:https://www.cnblogs.com/lztkdr/p/AsposeCellsExtensions.html
Copyright © 2011-2022 走看看