在导入之前都需要将上传的文件保存到服务器,所以避免重复的写这些代码,先贴出上传文件并保存到服务器指定路径的代码。

protected void btnImport_Click(object sender, EventArgs e)
{
Random random = new Random();
ImportClass Import = new ImportClass(); //保存文件的虚拟路径
string path = "Import/"; //获取选择的文件名
string fileName = FileUpload1.FileName; //获取文件扩展名称
string fileExt = Path.GetExtension(fileName); //生成新文件名
string newName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + random.Next(, ).ToString(); //获取指定虚机路径的物理路径
string fullPath = HttpContext.Current.Server.MapPath(path); //上传文件保存路径
string savePath = fullPath + newName + fileExt; //保存文件到服务器
FileUpload1.SaveAs(savePath); try
{
//获取导入的数据
DataSet ds = Import.ImportExcel(savePath);
if (ds != null && ds.Tables.Count > )
{
//这里可以写插入数据库的方法
}
}
catch (Exception ex)
{ throw;
}
}

第一种:OleDB

public DataSet ImportExcel(string filePath)
{
DataSet ds = null;
OleDbConnection conn; string strConn = string.Empty;
string sheetName = string.Empty; try
{
// Excel 2003 版本连接字符串
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1;'";
conn = new OleDbConnection(strConn);
conn.Open();
}
catch
{
// Excel 2007 以上版本连接字符串
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'";
conn = new OleDbConnection(strConn);
conn.Open();
} //获取所有的 sheet 表
DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); ds = new DataSet(); for (int i = ; i < dtSheetName.Rows.Count; i++)
{
DataTable dt = new DataTable();
dt.TableName = "table" + i.ToString(); //获取表名
sheetName = dtSheetName.Rows[i]["TABLE_NAME"].ToString(); OleDbDataAdapter oleda = new OleDbDataAdapter("select * from [" + sheetName + "]", conn); oleda.Fill(dt); ds.Tables.Add(dt);
} //关闭连接,释放资源
conn.Close();
conn.Dispose(); return ds;
}

除了读取过程不太灵活之外,这种读取方式还有个弊端就是,当 Excel 数据量很大时。会非常占用内存,当内存不够时会抛出内存溢出的异常,不过一般都能适用了。

第二种:Microsoft.Office.Interop.Excel.dll

public DataSet ImportExcel(string filePath)
{
DataSet ds = null;
DataTable dt = null; Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook workbook = null;
Microsoft.Office.Interop.Excel.Worksheet worksheet = null;
Microsoft.Office.Interop.Excel.Sheets sheets = null;
Microsoft.Office.Interop.Excel.Range range = null;
object missing = System.Reflection.Missing.Value; try
{
if (excel == null)
{
return null;
} //打开 Excel 文件
workbook = excel.Workbooks.Open(filePath, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing); //获取所有的 sheet 表
sheets = workbook.Worksheets; ds = new DataSet(); for (int i = ; i <= sheets.Count; i++)
{
//获取第一个表
worksheet = (Microsoft.Office.Interop.Excel.Worksheet)sheets.get_Item(i); int rowCount = worksheet.UsedRange.Rows.Count;
int colCount = worksheet.UsedRange.Columns.Count; int rowIndex = ; //起始行为 1
int colIndex = ; //起始列为 1 DataColumn dc;
dt = new DataTable();
dt.TableName = "table" + i.ToString(); //读取列名
for (int j = ; j < colCount; j++)
{
range = worksheet.Cells[rowIndex, colIndex + j]; dc = new DataColumn();
dc.DataType = Type.GetType("System.String");
dc.ColumnName = range.Text.ToString().Trim(); //添加列
dt.Columns.Add(dc);
} //读取行数据
for (int k = ; k < rowCount; k++)
{
DataRow dr = dt.NewRow();
for (int l = ; l < colCount; l++)
{
range = worksheet.Cells[rowIndex + k, colIndex + l]; //使用 range.Value.ToString(); 或 range.Value2.ToString(); 或 range.Text.ToString(); 都可以获取单元格的值
dr[l] = range.Text.ToString();
}
dt.Rows.Add(dr.ItemArray);
} ds.Tables.Add(dt);
}
}
catch (Exception ex)
{
throw;
}
finally
{
workbook.Close(); //关闭退出
excel.Quit(); //释放 COM 对象
Marshal.ReleaseComObject(worksheet);
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(excel); worksheet = null;
workbook = null;
excel = null; GC.Collect();
} return ds;
}

这种方法首先需要安装有 office Excel,并且是一个单元格一个单元格的读取,所以性能会比较差。

第三种:NPOI

public DataSet ImportExcel(string filePath)
{
DataSet ds = null; try
{
//打开文件
FileStream fileStream = new FileStream(filePath, FileMode.Open); XSSFWorkbook workbook = new XSSFWorkbook(fileStream); ISheet sheet = null;
IRow row = null; ds = new DataSet();
DataTable dt = null; for (int i = ; i < workbook.Count; i++)
{
dt = new DataTable();
dt.TableName = "table" + i.ToString(); //获取 sheet 表
sheet = workbook.GetSheetAt(i); //起始行索引
int rowIndex = sheet.FirstRowNum; //获取行数
int rowCount = sheet.LastRowNum; //获取第一行
IRow firstRow = sheet.GetRow(rowIndex); //起始列索引
int colIndex = firstRow.FirstCellNum; //获取列数
int colCount = firstRow.LastCellNum; DataColumn dc = null; //获取列名
for (int j = colIndex; j < colCount; j++)
{
dc = new DataColumn(firstRow.GetCell(j).StringCellValue);
dt.Columns.Add(dc);
} //跳过第一行列名
rowIndex++; for (int k = rowIndex; k <= rowCount; k++)
{
DataRow dr = dt.NewRow();
row = sheet.GetRow(k); for (int l = colIndex; l < colCount; l++)
{
if (row.GetCell(l) == null)
{
continue;
}
dr[l] = row.GetCell(l).StringCellValue;
} dt.Rows.Add(dr);
} ds.Tables.Add(dt);
} sheet = null;
workbook = null; fileStream.Close();
fileStream.Dispose();
}
catch (Exception ex)
{
throw;
} return ds;
}

我这里用的是 .xlsx 格式的,也就是 Excel 2007 及以上版本,2003 版本的话方法类似,只是打开文件的操作类不一样。

// 2007 及以上版本
XSSFWorkbook xWorkbook = new XSSFWorkbook(fileStream); // 2003 版本
HSSFWorkbook hWorkbook = new HSSFWorkbook(fileStream);

第四种:Aspose.Cells.dll

public DataSet ImportExcel(string filePath)
{
DataSet ds = null; try
{
Aspose.Cells.Workbook workbook = new Aspose.Cells.Workbook(); //打开文件,参数可以是文件的路径,也可以直接传入一个文件流
workbook.Open(filePath); //获取 sheet 表
Aspose.Cells.Worksheets worksheets = workbook.Worksheets; Aspose.Cells.Worksheet worksheet = null; Aspose.Cells.Cells cells = null; ds = new DataSet();
DataTable dt = null; int rowIndex = ; //起始行
int colIndex = ; //起始列 for (int i = ; i < worksheets.Count; i++)
{
dt = new DataTable();
dt.TableName = "table" + i.ToString(); worksheet = worksheets[i]; //获取每个 sheet 表的所有单元格
cells = worksheet.Cells; dt = cells.ExportDataTableAsString(rowIndex, colIndex, cells.MaxDataRow + , cells.MaxDataColumn + , true); ds.Tables.Add(dt);
} worksheets.Clear(); worksheet = null;
worksheets = null;
workbook = null;
}
catch (Exception ex)
{
throw;
} return ds;
}

这种方法操作比较方便,跟 OleDB 一样直接获取一个 sheet 表的数据,不用一个单元格一个单元格的获取。而且操作也比较灵活,你可以一行一行的获取数据,甚至一个单元格一个单元格的获取数据。

第五种:EPPlus

public DataSet ImportExcel(string filePath)
{
DataSet ds = null; try
{
//打开文件
FileStream fileStream = new FileStream(filePath, FileMode.Open); //读取文件流
ExcelPackage package = new ExcelPackage(fileStream); //获取 sheet 表
ExcelWorksheets worksheets = package.Workbook.Worksheets; ExcelWorksheet worksheet = null; ds = new DataSet();
DataTable dt = null; for (int i = ; i <= worksheets.Count; i++)
{
dt = new DataTable();
dt.TableName = "table" + i.ToString(); worksheet = worksheets[i]; //获取行数
int rowCount = worksheet.Dimension.End.Row; //获取列数
int colCount = worksheet.Dimension.End.Column; //起始行为 1
int rowIndex = worksheet.Dimension.Start.Row; //起始列为 1
int colIndex = worksheet.Dimension.Start.Column; DataColumn dc = null; for (int j = colIndex; j <= colCount; j++)
{
dc = new DataColumn(worksheet.Cells[rowIndex, j].Value.ToString());
dt.Columns.Add(dc);
} rowIndex++; for (int k = rowIndex; k <= rowCount; k++)
{
DataRow dr = dt.NewRow(); for (int l = colIndex; l <= colCount; l++)
{
if (worksheet.GetValue(k, l) == null)
{
continue;
} dr[l - ] = worksheet.GetValue(k, l).ToString();
} dt.Rows.Add(dr);
} ds.Tables.Add(dt);
} package.Dispose(); worksheet = null;
worksheets = null;
package = null; fileStream.Close();
fileStream.Dispose();
}
catch (Exception ex)
{
throw;
} return ds;
}

这种方法读取 Excel 数据性能还不错,但是要注意的是,sheet、row、col 的起始值都是从 1 开始的。

C# 各种导入 Excel 文件的数据的方法总结的更多相关文章

  1. C#各种导入Excel文件的数据的方法总结

    在导入前都需要将上传的文件保存到服务器,所以避免重复的写这些代码,先贴出上传文件并保存到服务器指定路径的代码 protected void btnImport_Click(object sender, ...

  2. java 读取Excel文件并数据持久化方法Demo

    import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util ...

  3. java后端导入excel模板和导入excel文件去读数据

    模板转载地址:https://www.cnblogs.com/zhangyangtao/p/9802948.html 直接上代码(我是基于ssm写的demo,导入文件目前只能读取.xls后缀的exce ...

  4. phpexcel导入excel文件报the filename xxx is not recognised as an OLE file错误。

    工作中频繁会用phpexcel类导入excel文件的数据到数据库,目前常用的excel文件格式有:xls.csv.xlsx. 刚开始,针对xls文件,使用如下程序,能正常运行: $objReader ...

  5. R语言读取excel文件的3种方法

    R读取excel文件中数据的方法: 电脑有一个excel文件,原始的文件路径是:E:\R workshop\mydata\biom excel数据为5乘2阶矩阵,元素为                ...

  6. springMVC(5)---导入excel文件数据到数据库

    springMVC(5)---导入excel文件数据到数据库 上一篇文章写了从数据库导出数据到excel文件,这篇文章悄悄相反,写的是导入excel文件数据到数据库.上一篇链接:springMVC(4 ...

  7. excel数据 入库mysql 和 mysql数据 导入excel文件

    1.excel数据入库mysql 首先准备excel文件, 标红的地方需要留意,一个是字段名所在行,一个表名对应页: 然后私用mysql工具 navicat, 选择数据库,然后导入文件, 选中相应ex ...

  8. PLSQL导入Excel文件预览不到数据行问题

    今天,从Excel导入Oracle一些数据,在导入的过程中,遇到一个问题,Excel里面有好几万条数据,但是通过PLSQL导入向导导入Excel文件之后,在PLSQL里却预览不到数据行,只能看见标题行 ...

  9. 基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能

    思路: 1.首先,页面前端,上传附件,提交给后台,并带一个随机性的参数(可以用时间戳): 2.后端接收附件,做一系列的逻辑处理,无误后,将对应的文件存储在上传的目录下: 3.然后前端,上传附件成功后, ...

随机推荐

  1. 微软ASP.NET网站部署指南(8):部署Code-Only更新

    1.  综述 初始化部署以后,你须要继续维护和更新你的网站.本章节将向你展示一个不包含数据库改变的部署升级流程.(下一章节将展示数据库改变的部署升级流程.) 提醒:假设依据本章节所做的操作出现错误信息 ...

  2. [转]Shell脚本中发送html邮件的方法

    <span "="">作为运维人员,免不了要编写一些监控脚本,并将监控结果及时的发送出来.那么通过邮件发送是比较常用的一种通知方式了.通常的,如果需要发送的内 ...

  3. Boost库初见

    Boost库是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++库,有C++"准"标准库的美称! Boost有着与其它程序库(如MFC等)无法比拟的优点. Boost库采用了 ...

  4. Java Print 打印

    Java 原生的API中有Print,使用Print可以操作打印机进行打印操作,获取打印机属性,下面是代码 打印程序(静默打印) package com.boci.PrintPDF; import j ...

  5. Oracle中select使用别名

    1 .将字段用as转换成别名. 2 .直接在字段的名字后面跟别名. 3 .在字段后面用双引号引起的别名.   我的朋友 大鬼不动 最近访客 fhwlj kochiyas 大極星 Alz__ deser ...

  6. dubbo项目实战代码展示

    最近公司项目使用dubbo服务,于是就去网上搜索关于dubbo的相关资料,真的很多,但是对于很多人并不是很了解框架或者 不是太适合新手的片段代码,于是我就根据项目的相关内容把dubbo部分单独切出来, ...

  7. jqGrid排序的两种实现方式

    实现方案一客户端实现排序: jqGrid属性 loadonce:true时,所有数据加载在客户端,点击列标题由jqGrid在客户端自动排序,不再从服务器取值. 参考文件:ccMxCxTjCc.js j ...

  8. fopen与读写的标识r,r+,rb+,rt+,w+.....

    FILE * fopen(const char * path,const char * mode); 参数mode字符串则代表着流形态. mode有下列几种形态字符串: r 打开只读文件,该文件必须存 ...

  9. 【BZOJ4518】[Sdoi2016]征途 斜率优化

    [BZOJ4518][Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除 ...

  10. Struts2 取消 下载时异常

    Struts2环境下,通过Struts2提供的下载方式进行下载时出现的java.lang.IllegalStateException异常 2011-1-820:34:20 org.apache.cat ...