我的导入EXCEL方法 从SQL Server中导入/导出 Excel 的基本方法 从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句: /*===================================================================*/ --如果导入数据并生成表 --导出查询的情况 --要导出真正的Excel文件.就用下面的方法 /*--调用示例 p_exporttb @tbname='地区资料',@path='c:',@fname='aa.xls' create proc p_exporttb --参数检测 --检查文件是否已经存在 --数据库创建语句 exec @err=sp_oamethod @obj,'open',null,@constr /*--如果覆盖已经存在的表,就加上下面的语句 --创建表的SQL exec @err=sp_oadestroy @obj --导入数据 exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from '+@tbname) return lberr: /*--数据导出EXCEL /*--调用示例 p_exporttb @sqlstr='select * from 地区资料' create proc p_exporttb --参数检测 --检查文件是否已经存在 --数据库创建语句 --连接数据库 exec @err=sp_oamethod @obj,'open',null,@constr --创建表的SQL select @sql='',@fdlist='' exec @err=sp_oamethod @obj,'execute',@out out,@sql exec @err=sp_oadestroy @obj --导入数据 exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']') set @sql='drop table ['+@tbname+']' lberr: |
private void button1_Click(object sender, System.EventArgs e)
{
Excel.Application excel= new Excel.Application();
int rowIndex=1;
int colIndex=0;
excel.Application.Workbooks.Add(true);
DataTable table=DataSet.tables[0];数据源
//将所得到的表的列名,赋值给单元格
foreach(DataColumn col in table.Columns)
{
colIndex++;
excel.Cells[1,colIndex]=col.ColumnName;
}
//同样方法处理数据
foreach(DataRow row in table.Rows)
{
rowIndex++;
colIndex=0;
foreach(DataColumn col in table.Columns)
{
colIndex++;
excel.Cells[rowIndex,colIndex]=row[col.ColumnName].ToString();
}
}
//不可见,即后台处理
excel.Visible=true;
}
2.Sql Server本身就有把数据导入到Excel中的功能,这个很简单,不多说了。
如果要用代码实现,我想重点应该在于如何向Excel表中写数据的问题,我正好写了一个把数据引入到Excel中的程序,给你点代码参考:
try
{
int colHead = 1;
Excel.Application exc = new Excel.Application() ;
Excel.Workbooks workbooks = exc.Workbooks;
Excel._Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
Excel.Sheets sheets = workbook.Worksheets;
Excel._Worksheet worksheet = (Excel._Worksheet) sheets.get_Item(1);
Excel.Range range = null;
//输出表头
int col_index = Convert.ToInt32(Convert.ToChar("A"));//列号
string key = String.Empty;//行号字母
string cell = String.Empty;//表格号
foreach( DataGridColumnStyle style in grid.TableStyles[0].GridColumnStyles )
{
key = Convert.ToChar( col_index ).ToString();
cell = key + colHead.ToString() ;
range = worksheet.get_Range( cell , cell );
col_index++;
range.Value = style.HeaderText;
//range.ColumnWidth = style.Width;
}
//输出表数据
DataTable table = (DataTable)grid.DataSource ;
colHead = 2;
foreach( DataRow row in table.Rows )
{
col_index = Convert.ToInt32(Convert.ToChar("A"));
foreach( DataGridColumnStyle style in grid.TableStyles[0].GridColumnStyles )
{
key = Convert.ToChar( col_index ).ToString();
cell = key + colHead.ToString() ;
range = worksheet.get_Range( cell , cell );
if ( table.Columns.Contains( style.MappingName ) == true )
{
range.Value = row[style.MappingName].ToString();
}
col_index ++;
}
colHead++;
}
//合计行
exc.Visible = true;
}
catch( Exception Ex )
{
ExceptionManager.DealWithException( Ex );
MessageBox.Show( "输出报表错误!","错误" , MessageBoxButtons.OK,MessageBoxIcon.Error );
}
在实际的开发应用中,数据库导入导出是经常遇到的问题,尤其是数据库与Excel文件之间的导入导出,还存在数据类型不一致的问题。例如:数据库的数字超长时会在Excel里格式化成科学计数法的格式,或者记录内容是数字和字符的混合内容会丢失内容等等。将Access数据库的内容直接导入到Excel则可以避免这些问题。
下面例子就是实现这个功能,例子中的数据库使用《ASP.NET 2.0应用开发技术》一书中自带的数据库为例子。
另外,需要注意:Excel文件有诸多限制,在如果数据库记录内容很多,还要计算每次导出的数量和Sheet数目,另外,对Sheet名字相同的监测也省略了,需要的读者请根据情况自行添加上去。 结合存储过程的分页功能实现起来比较好。
方法二:
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< script runat ="server" >
protected void Button1_Click(object sender, EventArgs e)
{
string sql;
string connstr = @ " Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|ASPNET20Book.mdb;Persist Security Info=True " ;
System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection(connstr);
System.Data.OleDb.OleDbCommand cmd;
cn.Open();
// 先得到记录数目:
sql = " select Count(*) From Paging " ;
cmd = new System.Data.OleDb.OleDbCommand(sql, cn);
int RecordCount = ( int )cmd.ExecuteScalar();
// TODO:计算Sheet数目,进行记录分段,将不同的数据段导入到不同的Sheet(Sheet数目不知道有没有限制:()
// TODO:文件名,Sheet名字的存在检测略
// 每个Sheet只能最多保存65536条记录。
sql = @ " select top 65535 * into [Excel 8.0;database= " + Server.MapPath( " . " ) + @ " ASPNET20Book.xls].[Sheet1] from Paging " ;
cmd = new System.Data.OleDb.OleDbCommand(sql, cn);
cmd.ExecuteNonQuery();
cn.Close();
cn.Dispose();
cn = null ;
}
</ script >
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head runat ="server" >
< title > 直接将Access数据库导入到Excel文件 </ title >
</ head >
< body >
< form id ="form1" runat ="server" >
< asp:Button ID ="Button1" runat ="server" OnClick ="Button1_Click" Text ="到处数据" />
</ form >
</ body >
</ html >
方法三:
1.在服务器端设置Excel应用程序访问权限。
(1)运行dcomcnfg.exe。
(2)组件服务→计算机→我的电脑→DCOM配置。
(3)右击Microsoft Excel应用程序→属性→安全→启动和激活权限→自定义→编辑。
(4)添加ASPNET用户。
2.在ASP.NET Web应用程序添加引用。
(1)右击创建的应用程序→添加引用→COM选项卡。
(2)依次添加Microsoft Office 11.0 Object Library、Microsoft Excel 11.0 Object Library。(这里用的是Microsoft Office 2003)
3.实现代码。
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using Excel;
using System.Runtime.InteropServices;
namespace MyWeb
{
/// <summary>
/// 导出Excel实例。
/// </summary>
public class OutToExcel : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button btnOutToExcel;
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowThreadProcessId(IntPtr hwnd,out int ID);
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.btnOutToExcel.Click += new System.EventHandler(this.btnOutToExcel_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void btnOutToExcel_Click(object sender, System.EventArgs e)
{
//生成数据集
SqlConnection conn = new SqlConnection("Persist Security Info=false;Data Source=.;Initial Catalog=Northwind;User ID=sa;Password=");
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Customers",conn);
DataSet ds = new DataSet();
da.Fill(ds);
conn.Close();
Excel.Application ExcelApp = new ApplicationClass();
//获取Excel进程
IntPtr t = new IntPtr(ExcelApp.Hwnd);
int k = 0;
GetWindowThreadProcessId(t,out k);
System.Diagnostics.Process P = System.Diagnostics.Process.GetProcessById(k);
_Workbook ExcelxBk = ExcelApp.Workbooks.Add(Type.Missing);
_Worksheet ExcelxSt = (_Worksheet)ExcelxBk.ActiveSheet;
//导出字段名称
for(int col = 1;col < ds.Tables[0].Columns.Count;col = col + 1)
{
ExcelxSt.Cells[1,col] = ds.Tables[0].Columns[col - 1].ColumnName;
}
//导出数据
for(int row = 1;row < ds.Tables[0].Rows.Count;row = row + 1)
{
for(int col = 1;col < ds.Tables[0].Columns.Count;col = col + 1)
{
ExcelxSt.Cells[row + 1,col] = ds.Tables[0].Rows[row - 1][col - 1].ToString();
}
}
ExcelxSt.Columns.AutoFit(); //设置列宽度
string ExcelFileName = DateTime.Now.ToShortDateString().Replace("-","") + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString() + ".xls"; //导出Excel的文件名
string ExcelFullName = Server.MapPath(".") + "/" + ExcelFileName; //导出Excel的物理路径
ExcelxBk.SaveCopyAs(ExcelFullName); //保存Excel文件
//关闭、释放资源,并推毁Excel进程
ExcelxBk.Close(false,null,null);
ExcelApp.Quit();
GC.Collect();
P.Kill();
//下载Excel文件到客户端
Response.WriteFile(ExcelFullName);
string HttpHeader = "attachment;filename=" + ExcelFileName;
Response.AppendHeader("Content-Disposition",HttpHeader);
Response.Flush();
Response.Clear();
System.IO.File.Delete(ExcelFullName); //在服务器端删除导出的Excel文件
}
}
}
3.给你提供一个把Excel文件中的数据读入到DataGrid中的例子:
转到数据库是一样的。修改一下就可以了。
Html 页面代码:
<%@ Page language="c#" Codebehind="ExcelToDataGrid.aspx.cs" AutoEventWireup="false" Inherits="StudyDotNet.DataGrid.Excel.ExcelToDataGrid" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>风云冰雨工作室</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<!--************************问题描述区************************-->
<table width="100%" border="0">
<tr>
<td align="center" style="COLOR: red"><b>把Excel文件中的数据读入到DataGrid中</b></td>
</tr>
<tr>
<td><b>出处:</b><A href="http://dotnet.aspx.cc/ShowDetail.aspx?id=C673E2CD-3F1E-4919-8CE0-D69B894A0599">http://dotnet.aspx.cc/ShowDetail.aspx?id=C673E2CD-3F1E-4919-8CE0-D69B894A0599</A></td>
</tr>
<tr>
<td><b>描述:</b>用OLE DB Provider 来访问Excel文件,然后返回DataSet</td>
</tr>
</table>
<!--************************问题描述区(完)************************-->
<hr>
<form id="Form1" method="post" runat="server">
<asp:datagrid id="mygrid" runat="server" AutoGenerateColumns="false" width="100%">
<Columns>
<asp:BoundColumn HeaderText="姓名" ReadOnly="true" DataField="姓名" />
<asp:BoundColumn HeaderText="性别" ReadOnly="true" DataField="性别" />
<asp:BoundColumn HeaderText="Email" ReadOnly="true" DataField="地址" />
</Columns>
</asp:datagrid>
</form>
</body>
</HTML>
后置代码:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;
namespace StudyDotNet.DataGrid.Excel
{
/// <summary>
/// ExcelToDataGrid 的摘要说明。
/// </summary>
public class ExcelToDataGrid : System.Web.UI.Page
{
#region 控件申明
protected System.Web.UI.WebControls.DataGrid mygrid;
#endregion
#region Page_Load
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if (!IsPostBack)
{
DataGridBind();
}
}
#endregion
#region 数据绑定
private void DataGridBind()
{
mygrid.DataSource = CreateDataSource();
mygrid.DataBind();
}
private DataSet CreateDataSource()
{
string strConn;
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + MapPathSecure(TemplateSourceDirectory) + "//xls//contacts.xls;"+
"Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM [ContactList$]", strConn);
DataSet myDataSet = new DataSet();
myCommand.Fill(myDataSet);
return myDataSet;
}
#endregion
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}