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

protected void btnImport_Click(object sender,EventArgs e)

{

Random random=new Random();

ImportClass Import=new ImportClass();

//保存文件的虚拟路径

string path="Import/";

//获取选择的文件名

string fileName=FileUpload.FileName;

//获取文件扩展名称

string fileExt=Path.GetExtension(fileName);

//生成新文件名

string newName=DateTime.Now.ToString("yyyyMMddHHmmssfff")+random.Next(0,9999).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>0)

{

//这里可以写插入数据库的方法

}

}

catch(Exception ex)

{

throw;

}

}

第一种:

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 = 0; 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=1;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=0;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=1;k<rowCount;k++)
{
DataRow dr=dt.NewRow();
for(int l=0;l<colCount;l++)
{
range=worksheet.Cells[rowIndex+k,colIndex+l];
dr[l]=range.Text.ToString();
}
dt.Tables.Add(dt);
}
}
catch(Exception ex)
{
throw;
}
finally
{
workbook.Close();
excel.Quit();
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=0;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格式的,也就是Excel2007及以上版本,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 cell=null;
ds=new DataSet();
DataTable dt=null;
int rowIndex=0;
int colIndex=0;
for(int i=0;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+1,cells.MaxDataColumn+1,true);
ds.Tables.Add(dt);
}
worksheets.Clear();
worksheet=null;
worksheets=null;
workbokk=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=1;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.Dimenson.Start.Row;
//起始列为1
int colIndex=worksheet.Dimension.Start.Colimn;
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-1]=worksheet.GetValue(k,l).ToString();
}
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 sende ...

  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. 思维导图工具 & 原型设计工具

    最近需要画出系统流程架构什么的,就用到了几个思维导图工具 1. XMind -- 思维导图工具 2. MindManager -- 思维导图工具 3. AXURE RP --原型设计工具

  2. Java EE 学习(9):IDEA + maven + spring 搭建 web(5)- 博客文章管理

    转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) . 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) Jav ...

  3. Java EE 学习(5):IDEA + maven + spring 搭建 web(1)

    参考:http://www.cnblogs.com/lonelyxmas/p/5397422.html http://www.ctolib.com/docs-IntelliJ-IDEA-c--1590 ...

  4. 2017-2018-2 20179204 PYTHON黑帽子 黑客与渗透测试编程之道

    python代码见码云:20179204_gege 参考博客Python黑帽子--黑客与渗透测试编程之道.关于<Python黑帽子:黑客与渗透测试编程之道>的学习笔记 第2章 网络基础 t ...

  5. 微信公众平台开发(71)OAuth2.0网页授权-摘抄

      微信公众平台开发 OAuth2.0网页授权认证 网页授权获取用户基本信息 作者:方倍工作室 微信公众平台最近新推出微信认证,认证后可以获得高级接口权限,其中一个是OAuth2.0网页授权,很多朋友 ...

  6. 【Linux】可重入函数和线程安全的区别与联系【转】

    转自:http://blog.csdn.net/scenlyf/article/details/52074444 版权声明:本文为博主原创文章,未经博主允许不得转载. *****可重入函数 函数被不同 ...

  7. yoga安装kali备忘(连接wifi)

    kali 2.0 iso win8 下安装 用 WinSetupFromUSB-1-6-beta2 写入u盘,正常安装系统 启动连接wifi 搜索信号,获取ssid iw wlan0 scan 查看是 ...

  8. Logger用法

    logger的输出有两种方式:①log.log(Level.INFO,"message")②log.info("mesage")其他级别的输出与此类似. 获得c ...

  9. HDU5006 Resistance(高斯消元)

    给你一个复杂的网路图,然后告诉你s,t,求s,t的等效电阻.方法是设s的电势为1,t的电势为0.然后对于其它的每个点x,满足的是sigma(ux-uy)/R(x,y)(即对每个与x相连的节点y,电势差 ...

  10. Win7下VS2010、IIS7配置常见问题收集

    一 在Win7下应按什么次序安装vs2010和iis7 win7推荐先安装iis7,再安装vs2010:如果次序反了,必须注册iis才可以用. IIS中ASP.NET的版本号此时可选的有1.1.2.0 ...