工作中对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 > )
{
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 = ; j <= @this.Cells.MaxDataColumn; j++)
{
lstColNames.Add(@this.Cells[, 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 <= )
{
throw new ArgumentException("查询的列头不正确【" + selectColumns + "】");
}
} DataTable data = null;
if (selectColumns == "*")
{
data = wsh.Cells.ExportDataTable(, , wsh.Cells.MaxDataRow + , wsh.Cells.MaxDataColumn + );
}
else
{
#region 查到 列名 所在 位置
List<int> lstIndex = new List<int>();
for (int j = ; j <= wsh.Cells.MaxDataColumn; j++)
{
Cell cell = wsh.Cells[, j];
if (columnNames.Contains(cell.DisplayStringValue, StringComparer.OrdinalIgnoreCase))
{
lstIndex.Add(cell.Column);
}
}
#endregion
data = wsh.Cells.ExportDataTable(, , wsh.Cells.MaxDataRow + , columnNames.Length, new ExportTableOptions() { Indexes = lstIndex.ToArray() });
} #region 第一行数据的值 即是 当前的列名称
for (int j = ; j < data.Columns.Count; j++)
{
data.Columns[j].ColumnName = data.Rows[][j].ToString();
}
data.Rows.RemoveAt();
#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(, ,
@this.Worksheets[sheetName].Cells.MaxDataRow + , @this.Worksheets[sheetName].Cells.MaxDataColumn + ));
}
}
return dict;
}
}
}

      使用方式:

            string file = Path.GetFullPath(@"..\..\Excel\BA02利润表_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();

对Aspose.Cells Excel文件操作的扩展的更多相关文章

  1. ASPose导出excel简单操作

    string file = FileDialogHelper.SaveExcel(string.Format("{0}.xls", excelName)); if (!string ...

  2. aspose导出excel文件

    using Aspose.Cells; using System; using System.Collections.Generic; using System.Data; using System. ...

  3. 【个人使用.Net类库】(3)Excel文件操作类(基于NPOI)

    Web开发工作中经常要根据业务的需要生成对应的报表.经常采用的方法如下: 将DataTable导出至Excel文件; 读取模板Excel文件; 修改模板Excel文件对应的内容. 因此,便想到封装一个 ...

  4. jspsmart(保存文件)+poi(读取excel文件)操作excel文件

    写在前面: 项目环境:jdk1.4+weblogic 需求:能上传excel2003+2007 由于项目不仅需要上传excel2003,还要上传excel2007,故我们抛弃了jxl(只能上传exce ...

  5. Aspose.cells异步读写操作

    public class AsyncExcel : Excel { static readonly object _objForlock = new object(); //public List&l ...

  6. 依赖Aspose.Cells Excel 导出

    public static void SaveExcel() { //新建工作簿 Workbook workbook = new Workbook(); //工作簿 Worksheet sheet = ...

  7. Python excel文件操作,编程练习题实例七十五

    纯文本文件 student.txt为学生信息, 里面的内容(包括花括号)如下所示: { "1":["张三",150,120,100], "2" ...

  8. Java文件操作系列[2]——使用JXL操作Excel文件

    由于java流无法实现对Excel文件的读写操作,因此在项目中经常利用第三方开源的组件来实现.支持Excel文件操作的第三方开源组件主要有Apache的POI和开源社区的JXL. 总体来说,二者的区别 ...

  9. C#项目中操作Excel文件——使用NPOI库

    转载自:http://blog.csdn.net/dcrmg/article/details/52356236# 感谢-牧野- 实际C#项目中经常会涉及到需要对本地Excel文件进行操作,特别是一些包 ...

随机推荐

  1. mysql如何优化插入记录速度

    插入记录时,影响插入速度的主要是索引.唯一性校验.一次插入记录条数等.根据这些情况,可以分别进行优化,本节将介绍优化插入记录速度的几种方法. 一.对于MyISAM引擎表常见的优化方法如下:     1 ...

  2. JSP求和计算

    已知两个数的值,如何求和并输出? <%@ page language="java" import="java.util.*,java.text.*" co ...

  3. ajax传JSON时设置的contenttype导致JAVA中request.getParameter("")怎么也接收不到数据

    ajax传JSON时设置的contenttype默认值是application/x-www-form-urlencoded, 当ajax传JSON时设置的contenttype 如果是applicat ...

  4. 【scala】 scala 基础(一)

    至于什么是scala,摘录一段 维基百科的解释: scala 下载 安装 省略 1.环境变量配置完成后 命令行报错,因为scala 的安装路径里边包含空格 修改后即可.由于我的本地包含空格,此处CLI ...

  5. 如何将数组中的后面m个数移动为前面m个数

    思路分析: 可以通过递归的方法实现调整: (1)将前n-m个元素的顺序颠倒. (2)将后面m个元素的顺序颠倒. (3)将n个元素的顺序全部颠倒. 通过以上3个步骤的执行,就可以把数组的元素颠倒. 代码 ...

  6. HttpClient 通信工具类

    package com.taotao.web.service; import java.util.ArrayList; import java.util.List; import java.util. ...

  7. Linux下getsockopt/setsockopt 函数说明

    [ getsockopt/setsockopt系统调用 功能描述:  获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和 ...

  8. ajax劫持?

    <html<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=ut ...

  9. HttpClient详细解释

    Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且 ...

  10. 使用kendynet构建异步redis访问服务

    使用kendynet构建异步redis访问服务 最近开始在kendynet上开发手游服务端,游戏类型是生存挑战类的,要存储的数据结构和类型都比较简单,于是选择了用redis做存储,数据类型使用stri ...