首页 > 分享 > C# Excel操作记录 及 代码优化考虑

C# Excel操作记录 及 代码优化考虑

最近,因为有需求,找了很多C#操作Excel的资料来学习,完了准备在这里做个记录,以备后日不时之需。

我看到的,操作Excel的方式有四种:

com组件 OleDb npoi epplus com组件

首先,com 组件的方式指的是利用 office 的 Excel 组件对Excel文件进行操作,这种方式需要电脑上安装有Excel,项目中也要添加相关引用,项目运行时也要启动Excel进程。

据说,这种方式的功能很强大,说是Excel能实现的功能都能够通过这种方法在代码里进行设置,反正我是没有验证过,因为它实在是太慢了。其他方法1s就可以搞定的,用它稳定在8.7s...

OleDb

使用Microsoft Jet 提供程序用于连接到 Excel 工作簿,将Excel文件作为数据源来读写,这种方法读写都相当快,就是不是很灵活。

它需要使用指定的连接字符串初始化 System.Data.OleDb.OleDbConnection 类的新实例,.xls文件 和 .xlsx文件的连接字符串并不一样。

case ".xls":

strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName +

";Extended Properties='Excel 8.0;HDR=Yes;IMEX=2;'";

break;

case ".xlsx":

strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathName +

";Extended Properties='Excel 12.0;HDR=Yes;IMEX=2;'";

break;

上面的HDR用于判断是否将第一行作为数据读取(个人感觉应该只在读操作有用),IMEX用于判断是读取还是写入,这个需要自己尝试,我只能说,我在写入操作的时候将其设为0,读取的时候设为1,你也可以设为2,错了再调整...

它能返回所有的sheet的名称,以及单个sheet的所有列名,这有时是相当有用的。

#region 获取Excel文件的表名 返回list集合

public static List<string> GetExcelTableName(OleDbConnection conn, string pathName)

{

List<string> tableName = new List<string>();

if (File.Exists(pathName))

{

System.Data.DataTable dt = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);

string strSheetTableName = null;

foreach (System.Data.DataRow row in dt.Rows)

{

strSheetTableName = row["TABLE_NAME"].ToString();

if (strSheetTableName.Contains("$") && strSheetTableName.Replace("'", "").EndsWith("$"))

{

strSheetTableName = strSheetTableName.Replace("'", "");

strSheetTableName = strSheetTableName.Substring(0, strSheetTableName.Length - 1);

tableName.Add(strSheetTableName);

}

}

}

return tableName;

}

#endregion

#region 获取EXCEL工作表的列名 返回list集合

public static List<string> getExcelFileInfo(string pathName)

{

string strConn;

List<string> list_ColumnName = new List<string>();

FileInfo file = new FileInfo(pathName);

if (!file.Exists) { throw new Exception("文件不存在"); }

string extension = file.Extension;

switch (extension)

{

case ".xls":

strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=2;'";

break;

case ".xlsx":

strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=2;'";

break;

default:

strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";

break;

}

System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(strConn);

conn.Open();

System.Data.DataTable table = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, null });

string TableName = null;

string ColumnName = null;

foreach (System.Data.DataRow drow in table.Rows)

{

TableName = drow["Table_Name"].ToString();

if (TableName.Contains("$") && TableName.Replace("'", "").EndsWith("$"))

{

System.Data.DataTable tableColumns = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Columns, new object[] { null, null, TableName, null });

foreach (System.Data.DataRow drowColumns in tableColumns.Rows)

{

ColumnName = drowColumns["Column_Name"].ToString();

list_ColumnName.Add(ColumnName);

}

}

}

return list_ColumnName;

}

#endregion

读写的部分准备用copy来进行说明,虽然不会用到。

#region 读取Excel,将第一行作为标题,其他行作为数据,再将其导出到Excel,对空白行进行处理

public static bool copy(string copyPath, string pastePath, string copy_sheetName)

{

DataSet ds = new DataSet();

OleDbConnection copy_objConn = null;

OleDbConnection paste_objConn = null;

try

{

string strExtension = System.IO.Path.GetExtension(copyPath);

string strFileName = System.IO.Path.GetFileName(copyPath);

switch (strExtension)

{

case ".xls":

copy_objConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + copyPath

+ ";" + "Extended Properties="Excel 8.0;HDR=YES;IMEX=1;"");

break;

case ".xlsx":

copy_objConn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + copyPath

+ ";" + "Extended Properties="Excel 12.0;HDR=YES;IMEX=1;"");

break;

default:

copy_objConn = null;

break;

}

if (copy_objConn == null)

{

return false;

}

copy_objConn.Open();

string strSql = "select * from [" + copy_sheetName + "] where [系统物料号] is not null";

OleDbCommand objCmd = new OleDbCommand(strSql, copy_objConn);

OleDbDataAdapter myData = new OleDbDataAdapter(strSql, copy_objConn);

myData.Fill(ds, copy_sheetName);

DataTable dt = ds.Tables[0];

strExtension = System.IO.Path.GetExtension(pastePath);

strFileName = System.IO.Path.GetFileName(pastePath);

switch (strExtension)

{

case ".xls":

paste_objConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pastePath

+ ";" + "Extended Properties="Excel 8.0;HDR=YES;IMEX=0;"");

break;

case ".xlsx":

paste_objConn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pastePath

+ ";" + "Extended Properties="Excel 12.0;HDR=YES;IMEX=0;"");

break;

default:

paste_objConn = null;

break;

}

if (paste_objConn == null)

{

return false;

}

paste_objConn.Open();

StringBuilder strSQL = new StringBuilder();

System.Data.OleDb.OleDbCommand cmd;

string tableName = dt.TableName.Substring(0, dt.TableName.Length - 1);

try

{

List<string> list = GetExcelTableName(paste_objConn, pastePath);

i

相关知识

C#宠物小游戏《scw》的操作与命名教程
基于C#制作一个桌面宠物代码
C# 中的日志记录技术详细解析与示例
C#桌面宠物金鱼源代码资源
基于C#制作一个桌面宠物
【免费】C#桌面宠物(17种宠物)源代码.RAR资源
微软宠物商店代码分析
网页制作的代码
如何优雅地记录操作日志?
c#宠物领养系统毕业设计

网址: C# Excel操作记录 及 代码优化考虑 https://m.mcbbbk.com/newsview1041915.html

所属分类:萌宠日常
上一篇: 亚华配方羊奶粉:源头定制,专业宠
下一篇: 宠物监管解决方案:个性化定制,满