`

C#如何高效读取EXCEL文件

 
阅读更多

http://zhidao.baidu.com/question/58725229.html
http://blog.csdn.net/jaguar1982/archive/2005/01/11/248246.aspx
2010-03-12 | ASP.NET读取EXCEL文件的三种经典方法 (其中,64位操作系统上使用第二种com组件方式) 标签: 64位操作系统上 读取EXCEL文件 com组件

最近研究了ASP.NET如何高效读取EXCEL文件,现总结如下:

1.方法一:采用OleDB读取EXCEL文件:
把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下:
public DataSet ExcelToDS(string Path)
{
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
string strExcel = "";
OleDbDataAdapter myCommand = null;
DataSet ds = null;
strExcel="select * from [sheet1$]";
myCommand = new OleDbDataAdapter(strExcel, strConn);
ds = new DataSet();
myCommand.Fill(ds,"table1");
return ds;
}
对于EXCEL中的表即sheet([sheet1$])如果不是固定的可以使用下面的方法得到
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables,null);
string tableName=schemaTable.Rows[0][2].ToString().Trim();

另外:也可进行写入EXCEL文件,实例如下:
public void DSToExcel(string Path,DataSet oldds)
{
//先得到汇总EXCEL的DataSet 主要目的是获得EXCEL在DataSet中的结构
string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source ="+path1+";Extended Properties=Excel 8.0" ;
OleDbConnection myConn = new OleDbConnection(strCon) ;
string strCom="select * from [Sheet1$]";
myConn.Open ( ) ;
OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom, myConn ) ;
ystem.Data.OleDb.OleDbCommandBuilder builder=new OleDbCommandBuilder(myCommand);
//QuotePrefix和QuoteSuffix主要是对builder生成InsertComment命令时使用。
builder.QuotePrefix="["; //获取insert语句中保留字符(起始位置)
builder.QuoteSuffix="]"; //获取insert语句中保留字符(结束位置)
DataSet newds=new DataSet();
myCommand.Fill(newds ,"Table1") ;
for(int i=0;i<oldds.Tables[0].Rows.Count;i++)
{
//在这里不能使用ImportRow方法将一行导入到news中,因为ImportRow将保留原来DataRow的所有设置(DataRowState状态不变)。
在使用ImportRow后newds内有值,但不能更新到Excel中因为所有导入行的DataRowState!=Added
DataRow nrow=aDataSet.Tables["Table1"].NewRow();
for(int j=0;j<newds.Tables[0].Columns.Count;j++)
{
nrow[j]=oldds.Tables[0].Rows[i][j];
}
newds.Tables["Table1"].Rows.Add(nrow);
}
myCommand.Update(newds,"Table1");
myConn.Close();
}


2.方法二:引用的com组件:Microsoft.Office.Interop.Excel.dll 读取EXCEL文件
首先是Excel.dll的获取, 再在项目中添加引用该dll文件.

//读取EXCEL的方法 (用范围区域读取数据)
private void OpenExcel(string strFileName)
{
object missing = System.Reflection.Missing.Value;
Application excel = new Application();//lauch excel application
if (excel == null)
{
Response.Write("<script>alert('Can't access excel')</script>");
}
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);

excel.Quit(); excel = null;
Process[] procs = Process.GetProcessesByName("excel");

foreach (Process pro in procs)
{
pro.Kill();//没有更好的方法,只有杀掉进程
}
GC.Collect();
}

3.方法三:将EXCEL文件转化成CSV(逗号分隔)的文件,用文件流读取(等价就是读取一个txt文本文件)。
先引用命名空间:using System.Text;和using System.IO;
FileStream fs = new FileStream("d:\\Customer.csv", FileMode.Open, FileAccess.Read, FileShare.None);
StreamReader sr = new StreamReader(fs, System.Text.Encoding.GetEncoding(936));

string str = "";
string s = Console.ReadLine();
while (str != null)
{ str = sr.ReadLine();
string[] xu = new String[2];
xu = str.Split(',');
string ser = xu[0];
string dse = xu[1]; if (ser == s)
{ Console.WriteLine(dse);break;
}
} sr.Close();

另外也可以将数据库数据导入到一个txt文件,实例如下:

//txt文件名
string fn = DateTime.Now.ToString("yyyyMMddHHmmss") + "-" + "PO014" + ".txt";

OleDbConnection con = new OleDbConnection(conStr);
con.Open();
string sql = "select ITEM,REQD_DATE,QTY,PUR_FLG,PO_NUM from TSD_PO014";
//OleDbCommand mycom = new OleDbCommand("select * from TSD_PO014", mycon);
//OleDbDataReader myreader = mycom.ExecuteReader(); //也可以用Reader读取数据
DataSet ds = new DataSet();
OleDbDataAdapter oda = new OleDbDataAdapter(sql, con);
oda.Fill(ds, "PO014");
DataTable dt = ds.Tables[0];

FileStream fs = new FileStream(Server.MapPath("download/" + fn), FileMode.Create, FileAccess.ReadWrite);
StreamWriter strmWriter = new StreamWriter(fs); //存入到文本文件中

//把标题写入.txt文件中
//for (int i = 0; i <dt.Columns.Count;i++)
//{
// strmWriter.Write(dt.Columns[i].ColumnName + " ");
//}

foreach (DataRow dr in dt.Rows)
{
string str0, str1, str2, str3;
string str = "|"; //数据用"|"分隔开
str0 = dr[0].ToString();
str1 = dr[1].ToString();
str2 = dr[2].ToString();
str3 = dr[3].ToString();
str4 = dr[4].ToString().Trim();
strmWriter.Write(str0);
strmWriter.Write(str);
strmWriter.Write(str1);
strmWriter.Write(str);
strmWriter.Write(str2);
strmWriter.Write(str);
strmWriter.Write(str3);
strmWriter.WriteLine(); //换行
}
strmWriter.Flush();
strmWriter.Close();
if (con.State == ConnectionState.Open)
{
con.Close();
}

第一种:逐个单元格导出法(此方法操作相对复杂,但是比较灵和,适合对导出表有要求的情况)

javascript代码如下
<SCRIPT LANGUAGE="javascript">
function ExcelExport(tableid)
{
var table = document.getElementById(tableid); //获取页面的table
var excel = new ActiveXObject("Excel.Application"); //实例化Excel.Application对象
var workB = excel.Workbooks.Add(); ////添加新的工作簿
var sheet = workB.ActiveSheet;
//var sheet= workB.Worksheets(1);//该句代码和上句代码同意,都是激活一个sheet
/***************常用样式设置语句***************************************/
//sheet.Rows(1).WrapText = false; //自动换行设置
//sheet.Rows(1).Font.Size=18;//设置第一行的字体大小
//sheet.Rows(1).Interior.ColorIndex=2;//设置第一行背景色
//sheet.Rows(1).Font.ColorIndex=1;//设置第一行字体色
//sheet.Range(sheet.Cells(1,1),sheet.Cells(1,7)).mergecells=true;//第一行1到7单元格合并
sheet.Columns("A").ColumnWidth =35;//设置列宽
sheet.Columns("B").ColumnWidth =35;
//sheet.Columns("A:B").ColumnWidth =35;//另一种设置列宽的方式
sheet.Rows(1).RowHeight = 35;//设置行高
//sheet.Rows(1).Font.Name="黑体";//设置字体
//sheet.Columns.AutoFit;//所有列自适应宽度
//水平对齐方式(貌似-4108为水平居中)
//sheet.Range( sheet.Cells(1,1),sheet.Cells(1,5)).HorizontalAlignment =-4108;
//垂直对齐方式
//sheet.Range( sheet.Cells(1,1),sheet.Cells(1,5)).VerticalAlignment =-4108;
//根据Borders()中参数值设置各个方向边距,1,2,3,4--->top,buttom,left,right
//sheet.Range( sheet.Cells(2,1),sheet.Cells(1,5)).Borders(1).Weight = 2;
/**将页面table写入到Excel中,具体复杂情况(合并单元格等)可在这里面具体操作**********/
var LenRow = table .rows.length; //以下为循环遍历获取页面table的cell元素
for (i = 0; i < LenRow ; i++)
{
var lenCol = table.rows(i).cells.length;
for (j = 0; j < lenCol ; j++)
{
sheet.Cells(i + 1, j + 1).value = table.rows(i).cells(j).innerText; //通过该语句将table的每个
//cell赋予Excel 当前Active的sheet下的相应的cell下
}
}
excel.Visible = true;//设置excel为可见
excel.UserControl = true; //将Excel交由用户控制
}
</SCRIPT>

第二种方法:整体拷贝法(该方法以较少代码实现Excel数据的导出,但是导出数据格式可能存在样式和页面不一致情况,甚至像背景色等会出现错位,而且如果在html页面中对需要导出的table样式做过设置的话,此处部分样式设置可能不会起作用)

<SCRIPT LANGUAGE="javascript">
function ExcelExport(tableid)
{
var table = document.getElementById(tableid);
var ax =new ActiveXObject("Excel.Application");
var workbook = oXL.Workbooks.Add();
var sheet = workbook.ActiveSheet;
var sel = document.body.createTextRange();

//把table中的数据移到sel中
sel.moveToElementText(table);

sel.select(); //选中sel中所有数据
sel.execCommand("Copy");//复制sel中的数据

sheet.Columns("A").ColumnWidth =35;//设置列宽
sheet.Columns("B").ColumnWidth =35;
sheet.Rows(1).RowHeight = 35;//设置表头高

//将sel中数据拷贝到sheet工作薄中
sheet.Paste();
ax.Visible = true;
//通过打印机直接将Excel数据打印出来
sheet.Printout;
ax.UserControl = true;
}
</SCRIPT>


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lxw503606554/archive/2010/01/14/5189782.aspx

请问worksheet.SaveAs(fname,XlFileFormat.xlExcel2,null,null,false,false,false,null,null);执行时说类型错,是为什么?


C# 调用worksheet.SaveAs时报HRESULT:0x800A03EC错误的解决方法2009-10-30 14:28 c# 代码 wb.SaveAs(savePath, excel.XlFileFormat.xlExcel9795, Type.Missing, Type.Missing, Type.Missing, Type.Missing, excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

在做execl导出时,在office2003下导出正常,而装了office2007后就报HRESULT错误,
经过在网上查资料才发现导致错误的原因是SaveAs中的参数Excel.XlFileFormat.xlExcel9795,
此参数的指示程序将文档以Excel97 和95支持的格式保存。
将此参数改成excel.XlFileFormat.xlWorkbookNormal就不再报错了。

Sub 宏1()
'
' 宏1 Macro
' cnTest 记录的宏 2004-5-12
'

'
ActiveWorkbook.SaveAs Filename:="C:\111.txt", FileFormat:=xlUnicodeText, _
CreateBackup:=False

End Sub

分享到:
评论

相关推荐

    C#读取EXCEL文件案例

    用ADO连接的方式高效快速读取EXCEL数据。

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    主要内容有C#开发环境的使用、C#语言基础应用、字符串处理技术、数组和集合的使用、面向对象编程...文件、C#与Word互操作、高效应用Excel、基本图形绘制、图像处理技术、常用图表应用、动画处理技术、音频与视频控制...

    明日科技C#开发入门及项目实战

    实例084 在c#中设计出色彩斑斓的按钮 实例085 自动删除textbox控件中的非法字符 实例086 在richtextbox控件中替换文本文字 实例087 利用richtextbox控件实现文字定位与标示 实例088 将数据表中的字段添加到combobox...

    《C#经典编程220例》.(明日科技).【带书签】-共3部分

    实例084 在c#中设计出色彩斑斓的按钮 138 实例085 自动删除textbox控件中的非法字符 139 实例086 在richtextbox控件中替换文本文字 141 实例087 利用richtextbox控件实现文字定位与标示 142 实例088 将数据表中的...

    NPOI详细实例

    用C#来操作Excel的代码,读取方式如同流操作,个人感觉比其他的操作方式都要方便,高效,且不用启动Excel进程,缺点只能操作.xls的文件,新版本不可以

    asp.net知识库

    理解C#中的委托[翻译] 利用委托机制处理.NET中的异常 与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何判断ArrayList,Hashtable,SortedList 这类对象是否相等 帮助解决...

    ASP.NET 3.5开发大全 (中文 PDF 完整书签 非扫描)

    第14章:本章详细的讲解了ASP.NET应用程序和Web Service的概念,为了能够让读者更容易的理解Web Service,本章详细的介绍了XML以及XML类成员是如何进行XML文件的读取和编写的。 第15章:介绍了如何使用ASP.NET中.NET...

    ASP.NET开发大全

    第14章:本章详细的讲解了ASP.NET应用程序和Web Service的概念,为了能够让读者更容易的理解Web Service,本章详细的介绍了XML以及XML类成员是如何进行XML文件的读取和编写的。 第15章:介绍了如何使用ASP.NET中.NET...

    NTKO文档在线编辑控件4.0.1.2

    10 支持在提交编辑文档的同时,提交表单的其它数据,包括其它的文件上传 采用我们独创的“智能提交”技术,让您在提交编辑文档的同时,提交表单的其它数据,以及表单中其它的文件上传。这可以让您更加快速的集成现有...

    ASP.NET 3.5 开发大全

    第14章:本章详细的讲解了ASP.NET应用程序和Web Service的概念,为了能够让读者更容易的理解Web Service,本章详细的介绍了XML以及XML类成员是如何进行XML文件的读取和编写的。 第15章:介绍了如何使用ASP.NET中.NET...

    ASP.NET 3.5 开发大全 (上)

    第14章:本章详细的讲解了ASP.NET应用程序和Web Service的概念,为了能够让读者更容易的理解Web Service,本章详细的介绍了XML以及XML类成员是如何进行XML文件的读取和编写的。 第15章:介绍了如何使用ASP.NET中.NET...

    ASP.NET 3.5 开发大全 压缩包2

    第14章:本章详细的讲解了ASP.NET应用程序和Web Service的概念,为了能够让读者更容易的理解Web Service,本章详细的介绍了XML以及XML类成员是如何进行XML文件的读取和编写的。 第15章:介绍了如何使用ASP.NET中.NET...

    ASP.NET 3.5 开发大全 压缩包1

    第14章:本章详细的讲解了ASP.NET应用程序和Web Service的概念,为了能够让读者更容易的理解Web Service,本章详细的介绍了XML以及XML类成员是如何进行XML文件的读取和编写的。 第15章:介绍了如何使用ASP.NET中.NET...

    锐浪报表Grid++Report5.3

    3、功能强大,稳定高效:实现表格报表、多层表头、票据套打、交叉表等各种报表非常简便;报表完全可编程定义,适合开发通用软件中的动态报表。 4、独有的报表查询显示功能:提供报表查询与输出的集成一次性实现,...

    Grid++Report5.6报表开发工具

    3、功能强大,稳定高效:实现表格报表、多层表头、票据套打、交叉表等各种报表非常简便;报表完全可编程定义,适合开发通用软件中的动态报表。 4、独有的报表查询显示功能:提供报表查询与输出的集成一次性实现,...

    Grid++Report5.5报表工具

    3、功能强大,稳定高效:实现表格报表、多层表头、票据套打、交叉表等各种报表非常简便;报表完全可编程定义,适合开发通用软件中的动态报表。 4、独有的报表查询显示功能:提供报表查询与输出的集成一次性实现,...

    Grid++Report5报表工具 版本5.5.0.8

    3、功能强大,稳定高效:实现表格报表、多层表头、票据套打、交叉表等各种报表非常简便;报表完全可编程定义,适合开发通用软件中的动态报表。 4、独有的报表查询显示功能:提供报表查询与输出的集成一次性实现,...

Global site tag (gtag.js) - Google Analytics