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

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. 现代互联网的TCP拥塞控制(CC)算法评谈

    动机 写这篇文章本质上的动机是因为前天发了一个朋友圈,见最后的写在最后,但实际上,我早就想总结总结TCP拥塞控制算法点点滴滴了,上周总结了一张图,这周接着那些,写点文字. 前些天,Linux中国微信公 ...

  2. Codeforces Beta Round #95 (Div. 2) C 组合数学

    C. The World is a Theatre time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  3. system权限无法访问外挂SD卡

    总结Android应用system权限无法访问SD卡问题 包括android1.6 解决方案http://hi.baidu.com/yunlongchn/item/7d6636d8547317ffca ...

  4. svg动画 之 我的自制太阳系

    SVG意为可缩放矢量图形,svg的图片与普通的jpg,png等图片相比,其优势在于不失真.一般普通的图片放大后,会呈现出锯齿的形状,但是svg图片则不会这样,它可以被高质量地打印. 现在就用dream ...

  5. PE第n弹

    PE201 -- F[i][j][k] 和为i前j个选了k个方案数.因为值域很小. PE202 -- 那个反射其实挺酷炫的,你考虑把它的镜面反射去掉,把它扩展成一个无限大的正三角网格.. PE410 ...

  6. 洛谷 [P1608] 最短路计数

    最短路计数模版 本题要注意重边的处理 #include <iostream> #include <cstdio> #include <algorithm> #inc ...

  7. POJ 1236 Network of Schools Tarjan缩点

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22729   Accepted: 89 ...

  8. EasyUI-Accordion

    EasyUI-Accordion Accordion英文翻译就是 手风琴活 或者 可折叠的 参考效果图: 从图中我们其实也可以将这种组件理解为手风琴式的组件. 该组件方便对数据进行分类管理,在有限空间 ...

  9. SQL优化 ASP.NET ADO.NET

    原文发布时间为:2009-08-26 -- 来源于本人的百度文章 [由搬家工具导入] 总的考虑方向 1)        根据数据使用的方式来设计数据访问层 2)        缓存数据,避免不必要的操 ...

  10. DNS解析过程详解【转】

    转自:http://blog.chinaunix.net/uid-28216282-id-3757849.html 先说一下DNS的几个基本概念: 一. 根域 就是所谓的“.”,其实我们的网址www. ...