.Net之路(十四)com组件、OLEDB导入EXCEL
https://blog.csdn.net/chenfanglincfl/article/details/30546777
.NET com组件
这样的方法在计算机没有安装office套件时。也是可以使用的。
所以不依赖于软件,
可是还是须要xcel.exe编译后的dll文件打包到对应的程序中来引用。
这样将dll文件“
随身携带”。就行了。还是挺不错的!
1.注冊Microsoft.Office.Interop.Excel.dll
在office安装文件夹下找到excel.exe,路径D:\Program Files(x86)\Microsoft
Office\Office15.将excel.exe文件拷贝到D:\ProgramFiles (x86)\Microsoft Visual
Studio 11.0\VC下。
用visual studio 2012命令行工具切换到D:\Program Files
(x86)\Microsoft Visual Studio11.0\VC,通常会自己主动切换。
这时候运行TlbImp /
out:Interop.Excel.dll Excel.exe。提示
2.引用interop.excel.dll
将编译好的dll文件拷贝到程序的bin文件下。
加入引用
以下是我自己做的一个小demo。
<pre name="code" class="csharp">private void OpenExcel(string strFileName)
{
object missing = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();//lauch excel application
if (excel == null)
{
}
else
{
excel.Visible = false; excel.UserControl = true;
// 以仅仅读的形式打开EXCEL文件
Workbook wb = excel.Application.Workbooks.Open(strFileName, missing, true, missing, missing, missing,
missing, missing, missing, true, missing, missing, missing, missing, missing);
//取得第一个工作薄
Worksheet ws = (Worksheet)wb.Worksheets.get_Item(1);
//取得总记录行数 (包含标题列)
int rowsint = ws.UsedRange.Cells.Rows.Count; //得到行数
//int columnsint = mySheet.UsedRange.Cells.Columns.Count;//得到列数
//取得数据范围区域 (不包含标题列)
Range rng1 = ws.Cells.get_Range("B2", "B" + rowsint); //item
Range rng2 = ws.Cells.get_Range("K2", "K" + rowsint); //Customer
object[,] arryItem= (object[,])rng1.Value2; //get range's value
object[,] arryCus = (object[,])rng2.Value2;
//将新值赋给一个数组
string[,] arry = new string[rowsint-1, 2];
for (int i = 1; i <= rowsint-1; i++)
{
//Item_Code列
arry[i - 1, 0] =arryItem[i, 1].ToString();
//Customer_Name列
arry[i - 1, 1] = arryCus[i, 1].ToString();
}
//Response.Write(arry[0, 0] + " / " + arry[0, 1] + "#" + arry[rowsint - 2, 0] + " / " + arry[rowsint - 2, 1]);
}
excel.Quit(); excel = null;
Process[] procs = Process.GetProcessesByName("excel");
foreach (Process pro in procs)
{
pro.Kill();//没有更好的方法,仅仅有杀掉进程
}
GC.Collect();
}
结果
OLEDB方式
这样的方式就像平时使用sqlserver一样。将excel文件当成一个数据源来对待。
仅仅只是
这时候的数据库是excel罢了,事实上一样简单来看sqlserver也就是复杂化的excel所以这
种方式相对还是
比較常见的。
code
<pre name="code" class="csharp">/// <summary>
/// 读取Excel数据到DS
/// </summary>
/// <param name="excelName">xls文件路径(服务器物理路径)string RootDir =Server.MapPath(System.Web.HttpContext.Current.Request.ApplicationPath.ToString());//获取程序根文件夹</param>
/// <returns></returns>
public DataSet ExcelReader(string excelName)
{
// 拼写连接字符串。打开连接
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "data source=" + excelName + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";
OleDbConnection objConn = new OleDbConnection(strConn);
objConn.Open();
// 取得Excel工作簿中全部工作表
DataTable schemaTable = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
OleDbDataAdapter sqlada = new OleDbDataAdapter();
DataSet ds = new DataSet();
// 遍历工作表取得数据并存入Dataset
foreach (DataRow dr in schemaTable.Rows)
{
string strSql = "Select * From [" + dr[2].ToString().Trim() + "]";
OleDbCommand objCmd = new OleDbCommand(strSql, objConn);
sqlada.SelectCommand = objCmd;
sqlada.Fill(ds, dr[2].ToString().Trim());
}
objConn.Close();
return ds;
}
几个关键code句:
c#的垃圾回收:
//得到excel全部的进程
Process[] procs = Process.GetProcessesByName("excel");
foreach (Process pro in procs)
{
pro.Kill();//
}
GC.Collect();
com组件创建excel操作对象
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); //以仅仅读的形式打开EXCEL文件
Workbook wb = excel.Application.Workbooks.Open(strFileName, missing, true, missing, missing, missing, missing, missing, missing, true, missing, missing, missing, missing, missing);
//取得第一个工作薄
Worksheet ws = (Worksheet)wb.Worksheets.get_Item(1);
//取得单元格的值
String cellstr = ws.Cells[i][j].Value;
oledb建立excel连接
// 拼写连接字符串,打开连接
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "data source=" + excelName + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";
OleDbConnection objConn = new OleDbConnection(strConn);
objConn.Open();
// 取得Excel工作簿中全部工作表
DataTable schemaTable = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
第一种方法是创建excel对象,另外一种方法是以excel为数据源。第一种的适用面更
广。另一种是用二进制数据流的方式来读取,须要将excel文件转成csv文件。
相关文章
- 在ASP.NET MVC环境中使用加密与解密
- ASP.NET MVC下载excel文档
- .NET实现Office Excel自定义公式 广泛应用于报表与数据分析
- asp.net分页方法
- [Asp.net]常见word,excel,ppt,pdf在线预览方案,有图有真相,总有一款适合你!
- 浅谈.NET程序集安全签名
- .NET Core(C#) EPPlus读取Excel(.xlsx)文件的方法及示例代码
- .NET Core(C#) EPPlus写入保存Excel(.xlsx)文件的方法及示例代码
- .NET Core(C#) EPPlus创建Excel(.xlsx)写入数据的方法及示例代码
- .NET(C#) MySQL conn.Open()报错:SSL Connection error的解决方法
- .NET Core(C#)使用ExcelReport(NPOI)生成Excel报表(单行重复生成)
- .NET Core(C#)使用NPOI给Excel添加设置批注(注解comment)
- .NET(C#) ExcelLibrary读写Excel(.xls,.xlsx)示例代码(不用安装Office)
- 通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(1)
- 跨域资源共享(CORS)在ASP.NET Web API中是如何实现的?
- [ASP.NET MVC]通过对HtmlHelper扩展简化“列表控件”的绑定
- 提供第三种代码生成方式——通过自定义BuildProvider为ASP.NET提供代码生成
- .Net函数Math.Round你会用吗?