(无须引用EXCEL组件)不吃素的牛
------------------------------------------------------------------------------
最近小牛由于工作需要,需要制作可导入导出数据的方案。
基于WEB,环境是虚拟主机+SQL数据库
在网上一搜,漫天遍地的资料,看了好几个,感觉都差不多,基本上是针对WINFORM框架的
基于WEB的很少提及,不管,先写代码测试下再说。
引用EXCEL.DLL文件,真的很方便,象操作数据库一样操作。本以为解决了,在本地测试已成功。
后来关注到EXCEL.DLL文件,需引用此类库,而且目标电脑上须有安装OFFICE(即服务器需要注册excel的com)
这下有问题了,我的是虚拟主机啊。没这么大的权限要人家装什么就装什么,这样的话被动性就太大了,考虑到
稳定性,只能继续研究了/
当然,没有解决不了的问题,只有想不想解决的问题。
网上很多牛人都有提及过,我也只是针对于我的WEB环境(虚拟空间),对与我相同环境设置的菜菜一起分享,我想我的
环境是比较经典的,大部份人都是使用虚拟主机的,没有ADMIN管理权,当然如果你有独立服务器,想必也不用研究怎么
样导入导出了.
如有不正确的,请大牛多多PP。。
下面综合我的测试总结如下,希望对基于WEB开发的用户有帮助。(无组件,基于WEB,EXCEL导入导出)
先讲Excel导出:
关键引用
我这里做一个简单的建立xls文件操作,然后建立表插入一些数据操作,抛砖引玉。
1.测试能否建立xls
先在你的网站下建立一个xlsfile文件夹,以后生成的文件就放在里面。
新建一个toexcel.aspx页面,建立一个按钮(Button),双击进入后台页面
在toexcel.aspx.cs添加引用 using System.Data.OleDb;
protected void Button3_Click(object sender, EventArgs e)
{
string testPath = Server.MapPath("~/xlsfile/test.xls");
string sql = "Create table Sheet1(aa varchar,bb varchar)";
string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + testPath + "';Extended Properties='Excel 8.0'";
OleDbConnection oleConn = new OleDbConnection(connectionString);
OleDbCommand oleCmd=new OleDbCommand(sql,oleConn);
try
{
oleConn.Open();
oleCmd.ExecuteNonQuery();
}
catch (System.Exception ex)
{
throw;
}
finally
{
oleConn.Dispose();
oleConn.Close();
}
}如果正常的话,会在xlsfile文件夹下面新建一个test.xls文件,打开文件里面的内容是aa bb两个字段。
如果没有文件,请先确定是否有手动新动xlsfile文件夹.
注意toexcel.aspx文件与xlsfile文件是同一级的,别把toexcel.aspx 文件放在xlsfile文件夹里面。
下面是方法,直接调用就行了。传递参数为一个表DataTable dt,一个存放路径string excelPath
代码均验证过,直接从VS2005里面复制过来的
public string OutExcel(DataTable dt, string excelPath)
{
if (dt == null)
{
return "DataTable不能为空";
}
int rows = dt.Rows.Count;
int cols = dt.Columns.Count;
StringBuilder sql = new StringBuilder();
string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + excelPath + "';Extended Properties='Excel 8.0'";
if (rows == 0) //判断是否有内容
{
return "没有数据";
}
sql.Append("create table Sheet1 ( ");
for (int i = 0; i < cols; i++) //循环查找dt列(字段)
{
if (i < cols - 1)
sql.Append(string.Format("{0} varchar ,", dt.Columns[i].ColumnName)); //(字段)
else
sql.Append(string.Format("{0} varchar)", dt.Columns[i].ColumnName));
}
using (OleDbConnection oleConn = new OleDbConnection(connectionString))
{
OleDbCommand oleCmd = new OleDbCommand(sql.ToString(),oleConn);
try
{
oleConn.Open();
oleCmd.ExecuteNonQuery(); //执行sql
}
catch (Exception e)
{
return "在Excel中创建表失败,错误信息:" + e.Message;
}
//生成插入数据脚本 生成插入数据脚本
sql.Remove(0, sql.Length);
sql.Append("INSERT INTO ");
sql.Append("Sheet1 ( ");
for (int i = 0; i < cols; i++)
{
if (i < cols - 1)
sql.Append(dt.Columns[i].ColumnName + ",");
else
sql.Append(dt.Columns[i].ColumnName + ") values (");
}
for (int i = 0; i < cols; i++)
{
if (i < cols - 1)
sql.Append("@" + dt.Columns[i].ColumnName + ",");
else
sql.Append("@" + dt.Columns[i].ColumnName + ")");
}
//建立插入动作的Command
oleCmd.CommandText = sql.ToString();
OleDbParameterCollection param = oleCmd.Parameters;
for (int i = 0; i < cols; i++)
{
param.Add(new OleDbParameter("@" + dt.Columns[i].ColumnName, OleDbType.VarChar));
}
//遍历DataTable将数据插入新建的Excel文件中
foreach (DataRow row in dt.Rows)
{
for (int i = 0; i < param.Count; i++)
{
param[i].Value = row[i];
}
oleCmd.ExecuteNonQuery();
}
return "数据已成功导入Excel";
}//end using
}