下面的这几个方法是我在项目中经常用到的,欢迎大家批评指正

读取Excel表中的数据

第一种:功能丰富,速度慢

     /// <summary>
/// 从Excel读取数据
/// </summary>
/// <param name="path">Excel文档的全路径</param>
/// <returns>将一行作为一个对象,所以返回的是很多行数据的对象</returns>
public Model[] ReadDataFromExcel(string path)
{
List<Model> list = new List<Model>();
Application excelApp = null;
try
{
excelApp = new Application() { Visible = false, DefaultFilePath = "", DisplayAlerts = true, SheetsInNewWorkbook = };
Workbooks books = excelApp.Workbooks;
if (File.Exists(path))
{
Workbook book = books.Open(path);
Worksheet sheet = book.Sheets.get_Item();
if (sheet != null)
{
int rowNum = sheet.UsedRange.Rows.Count;
DateTime timeLimit;
timeLimit = GetTime(((Range)sheet.Cells[, "B"]).Text.ToString()).AddSeconds(sectionNum*timeSpan*); //从第2行开始读数据
for (int i = ; i < rowNum; i++)
{
if (((Range)sheet.Cells[i, "A"]).Text != "" && ((Range)sheet.Cells[i, "B"]).Text != "")
{ if (timeLimit.CompareTo(GetTime(((Range)sheet.Cells[i, "B"]).Text.ToString())) < )
{
break;
}
else
{
Model m = new Model()
{
SN = ((Range)sheet.Cells[i, "A"]).Text.ToString(),
time = GetTime(((Range)sheet.Cells[i, "B"]).Text.ToString()),
ch1 = ((Range)sheet.Cells[i, "C"]).Text.ToString(),
ch2 = ((Range)sheet.Cells[i, "D"]).Text.ToString(),
ch3 = ((Range)sheet.Cells[i, "E"]).Text.ToString(),
ch4 = ((Range)sheet.Cells[i, "F"]).Text.ToString()
};
list.Add(m);
} }
} }
} }
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
//执行完读取Excel数据后,将关闭该进程
KillExcel(excelApp);
}
return list.ToArray();
}

第二种:速度快

  public DataTable ExcelToDS(string filePath)
{
string connStr = "";
string fileType = System.IO.Path.GetExtension(Path.GetFileName(filePath));
if (string.IsNullOrEmpty(fileType))
{
return null;
}
if (fileType == ".xls")
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filePath + ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
else
connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filePath + ";" + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\""; OleDbConnection conn = new OleDbConnection(connStr);
conn.Open();
string strExcel = "";
OleDbDataAdapter myCommand = null;
DataSet ds = null;
strExcel = "select * from [sheet1$]";
myCommand = new OleDbDataAdapter(strExcel, connStr);
ds = new DataSet();
myCommand.Fill(ds, "table1");
return ds.Tables[];
}

关闭Excel进程:

  [DllImport("user32.dll", SetLastError = true)]
static extern int GetWindowThreadProcessId(IntPtr hwnd, out int processId);
public void KillExcel(Application excelApp)
{
try
{
if(excelApp!=null)
{
int processId;
GetWindowThreadProcessId(new IntPtr(excelApp.Hwnd), out processId);
Process p = Process.GetProcessById(processId);
p.Kill();
}
}
catch (Exception ex)
{
throw ex;
}
}

读取Excel单元格数据:

  /// <summary>
/// 获取单元格数据
/// </summary>
/// <param name="sheet"></param>
/// <param name="row"></param>
/// <param name="col"></param>
/// <returns></returns>
public string GetValue(Worksheet sheet, int row, int col)
{
// 取得单元格.
var cell = (Range)sheet.Cells[row, col];
if ((bool)cell.MergeCells == true)
{
// 本单元格是 “合并单元格”
if (cell.MergeArea.Row == row
&& cell.MergeArea.Column == col)
{
// 当前单元格 就是 合并单元格的 左上角 内容.
return cell.Text.ToString();
}
else
{
// 返回 合并单元格的 左上角 内容.
return ((Range)(sheet.Cells[cell.MergeArea.Row, cell.MergeArea.Column])).Text.ToString();
}
}
else
{
// 本单元格是 “普通单元格”
// 获取文本信息.
return cell.Text.ToString();
}
}

根据文本获取该文本所在行号和所占的行数,一般主要用来读取合并单元格

/// <summary>
/// 根据文本获取行号和所占行数
/// </summary>
/// <param name="sheet">查询的表单</param>
/// <param name="text">查询的文本</param>
/// <param name="rowNumber">行号</param>
/// <param name="rowCounts">所占行数</param>
public void GetRowNumber(Worksheet sheet, string text,out int rowNumber,out int rowCounts)
{
rowNumber = -;
rowCounts = -;
foreach(Range range in sheet.UsedRange)
{
if (range.Value == null)
continue;
if (range.Value.ToString() == text)
{
rowNumber = range.Row;
if ((bool)range.MergeCells == true)
rowCounts = range.MergeArea.Rows.Count;
else
rowCounts = ;
break;
}
}
}

C#之Excel操作的更多相关文章

  1. Npoi导入导出Excel操作

    之前公司的一个物流商系统需要实现对订单的批量导入和导出,翻阅了一些资料,最后考虑使用NPOI实现这个需求. 在winform上面实现excel操作:http://www.cnblogs.com/Cal ...

  2. Delphi Excel 操作大全

    Delphi Excel 操作大全 (一) 使用动态创建的方法首先创建 Excel 对象,使用ComObj:var ExcelApp: Variant;ExcelApp := CreateOleObj ...

  3. C#EXCEL 操作类--C#ExcelHelper操作类

    主要功能如下1.导出Excel文件,自动返回可下载的文件流 2.导出Excel文件,转换为可读模式3.导出Excel文件,并自定义文件名4.将数据导出至Excel文件5.将指定的集合数据导出至Exce ...

  4. Excel 操作类

    转载:http://www.cnblogs.com/fellowcheng/archive/2010/08/21/1805158.html ExcelHelper(Excel2007) Code hi ...

  5. C# excel操作

    开源的Excel操作项目: http://www.cnblogs.com/lwme/archive/2011/11/27/2265323.html 添加引用:Microsoft Excel 11.0 ...

  6. [Excel操作]Microsoft Office Excel 不能访问文件

    最近,客户服务器迁移,因操作系统环境变化而引起的的环境问题一堆,遇到的问题并解决方法在“[Excel]操作”类别会体现. Microsoft Office Excel 不能访问文件“C:\\LMSEx ...

  7. C#常用工具类——Excel操作类

    /// 常用工具类——Excel操作类 /// <para> ------------------------------------------------</para> / ...

  8. 报表中的Excel操作之Aspose.Cells(Excel模板)

    原文:报表中的Excel操作之Aspose.Cells(Excel模板) 本篇中将简单记录下Aspose.Cells这个强大的Excel操作组件.这个组件的强大之处,就不多说,对于我们的报表总是会有导 ...

  9. C# Excel操作类

    /// 常用工具类——Excel操作类 /// <para> ------------------------------------------------</para> / ...

  10. Excel操作 Microsoft.Office.Interop.Excel.dll的使用

    ----转载: http://www.cnblogs.com/lanjun/archive/2012/06/17/2552920.html 先说说题外话,前段时间近一个月,我一直在做单据导入功能,其中 ...

随机推荐

  1. Redis分布式锁---完美实现

    这几天在做项目缓存时候,因为是分布式的所以需要加锁,就用到了Redis锁,正好从网上发现两篇非常棒的文章,来和大家分享一下. 第一篇是简单完美的实现,第二篇是用到的Redisson. Redis分布式 ...

  2. node初始

    ### 一.什么是node.js > Node是一个基于 Chrome V8 引擎的 JavaScript 运行环境 > > Node使用了一个事件驱动.非阻塞式 I/O 的模型,使 ...

  3. JavaScript(第十七天)【浏览器检测】

    由于每个浏览器都具有自己独到的扩展,所以在开发阶段来判断浏览器是一个非常重要的步骤.虽然浏览器开发商在公共接口方面投入了很多精力,努力的去支持最常用的公共功能:但在现实中,浏览器之间的差异,以及不同浏 ...

  4. JavaScript(第六天)【函数】

    函数是定义一次但却可以调用或执行任意多次的一段JS代码.函数有时会有参数,即函数被调用时指定了值的局部变量.函数常常使用这些参数来计算一个返回值,这个值也成为函数调用表达式的值. 一.函数声明   函 ...

  5. 2017-2018-1 20155215 第九周 加分项 PWD命令的实现

    1 学习pwd命令 Linux中用 pwd 命令来查看"当前工作目录"的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pw ...

  6. 20145237《Java程序设计》实验报告一

    实验一 Java开发环境的熟悉(Windows + Eclipse) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1 ...

  7. cpp常用函数总结

    //sprintf sprintf(temp_str_result, "%lf", temp_double); result = temp_str_result; (*begin) ...

  8. android使用sharesdk的小感

    1.sharesdk快捷方式,快捷方式集成了所有需要分享到的手机app,但是具有缺陷,举个例子(想要微信分享图片url,但是短信并不想带有图片,否则短信成彩信,这里集成的就有麻烦了,为了解决这种问题, ...

  9. python利用twilio模块给自己发短信

    1.访问http://twilio.com/并填写注册表单.注册了新账户后,你需要验证一个手机号码,短信将发给该号码. 2.Twilio 提供的试用账户包括一个电话号码,它将作为短信的发送者.你将需要 ...

  10. js 点击 返回顶部 动画

    附上效果图 触发前 触发后 HTML代码: CSS代码 JS代码 由于复制文本太丑了 所以直接放的图片  但是我在评论区把js代码又复制了一边 以便你们使用