.net excel 导入 导出
2024-08-23 06:26:10
哎,好好的代码今天说来个实验,结果用的是office15 气死人了,网上最高office14.dll 文章转自2012年 QQ群:13615607 MR.Young
protected void BtnLoad_Click(object sender, EventArgs e)
{
//dataDR datadr = new dataDR();
//datadr.delete("delete from dbo.yuepingjueyuerbiao");
string fileName = DateTime.Now.ToString("yyMMddhhmmss") + ".xls";
string path = Server.MapPath("~/upload/excel/") + fileName; FileUpload1.SaveAs(path);
if (path != null)
{
DataSet ds=loadSouce(path);
}
else
{
Response.Write("<script>alert('没有上传文件')</script>");
}
} protected void Button1_Click(object sender, EventArgs e)
{
CreateExcel(helps.GetDataTable("select * from tb_teacher"), "Test.xls");
}
<div> <asp:FileUpload ID="FileUpload1" runat="server" /><asp:Button ID="BtnLoad" runat="server" Text="上传" OnClick="BtnLoad_Click" /> </div> <asp:Button ID="Button1" runat="server" Text="下载" style="height: 21px" OnClick="Button1_Click" />
经过第二天想了以后,其实连接字符串什么都没有问题,最后得出来的结论是因为导出并非标准格式的excel,不行的粘贴一下即可
导入方法
private DataSet loadSouce(string path)
{ //连接EXCEL数据源
//string strPath = this.getPath();
//string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=" + "\"" + "Excel 8.0;HDR=Yes;IMEX=1" + "\""; // string strConn = "Provider = Microsoft.ACE.OLEDB.12.0;Data Source =" + path + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'";
string strConn = "Provider = Microsoft.ACE.OLEDB.15.0;Data Source =" + path + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'";
//此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串)
//备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数据,"HDR=No;"正好与前面的相反。
// "IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。 OleDbConnection conn = new OleDbConnection(strConn); conn.Open(); /*
如果用户把sheet表名改了就是报下面的错:
'sheet1$' 不是一个有效名称。请确认它不包含无效的字符或标点,且名称不太长。
如果可以动态获得Excel中各个sheet的名称能动态的选中返回哪个sheet的数据,
即使用户更改了名称也不怕,完全可以把所有sheet的名称列出来供用户选择:
下面就把解决问题的代码列出来,主要用到了OleDbConnection.GetOleDbSchemaTable()方法
*/ //返回Excel的架构,包括各个sheet表的名称,类型,创建时间和修改时间等
System.Data.DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //包含excel中表名的字符串数组
string[] strTableNames = new string[dtSheetName.Rows.Count];
for (int k = ; k < dtSheetName.Rows.Count; k++)
{
strTableNames[k] = dtSheetName.Rows[k]["TABLE_NAME"].ToString();
} //OleDbDataAdapter myCommand = null;
System.Data.DataTable dt = new System.Data.DataTable(); //从指定的表明查询数据,可先把所有表明列出来供用户选择
string strExcel = "select * from [" + strTableNames[] + "]"; OleDbDataAdapter myCommand = new OleDbDataAdapter(strExcel, strConn); DataSet myDataSet = new DataSet(); myCommand.Fill(myDataSet); return myDataSet;
}
导出方法
private void CreateExcel(System.Data.DataTable dt, string fileName)
{
HttpResponse resp;
resp = Page.Response; resp.Buffer = true;
resp.ClearContent();
resp.ClearHeaders();
resp.Charset = "GB2312"; // resp.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
resp.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);
resp.ContentEncoding = System.Text.Encoding.Default;//设置输出流为简体中文
resp.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。 string colHeaders = "", ls_item = ""; ////定义表对象与行对象,同时用DataSet对其值进行初始化
//DataTable dt = ds.Tables[0];
DataRow[] myRow = dt.Select();//可以类似dt.Select("id>10")之形式达到数据筛选目的 int i = ;
int cl = dt.Columns.Count; // colHeaders += "tttttttt" + "\n";
//取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符
for (i = ; i < cl; i++)
{
if (i == (cl - ))//最后一列,加n
{
colHeaders += dt.Columns[i].Caption.ToString().Trim() + "\n";
}
else
{
colHeaders += dt.Columns[i].Caption.ToString().Trim() + "\t";
} }
resp.Write(colHeaders); //向HTTP输出流中写入取得的数据信息 //逐行处理数据
foreach (DataRow row in myRow)
{
//当前行数据写入HTTP输出流,并且置空ls_item以便下行数据
for (i = ; i < cl; i++)
{
if (i == (cl - ))//最后一列,加n
{
ls_item += row[i].ToString().Trim() + "\n";
}
else
{
ls_item += row[i].ToString().Trim() + "\t";
} }
resp.Write(ls_item);
ls_item = ""; }
resp.End(); }
记得引用Micorosoft.office.Interop.Excel
最新文章
- 冒泡,setinterval,背景图的div绑定事件,匿名函数问题
- JAVA/Android Map与String的转换方法
- Python框架之Tornado(四)源码之褪去模板外衣
- Dev C++支持c++11标准的编译方法
- js 未结束的字符串常量错误解决方法
- 用Eclipse 开发Dynamic Web Project应用程序 【转】
- HDU 2187 A sequence of numbers
- mysql 分区表详解
- DataReader、Table、DataSet和Entity相互转化
- 状态压缩DP------学习小记
- 快速构建Windows 8风格应用20-MediaElement
- 用Bottle开发web程序(二)
- HDU 2544 最短路(初涉SPFA算法)
- TP5使用phpmailer实现邮件发送
- 前台序列化传过来的值,后台获取之后封装到map当中,让后在转化成json格式,最后在把json里面的参数里面的某一个值进行分割,最后在存到json格式的数据中去。
- android开发过程中遇到的坑
- 深入css布局篇(2) — 定位与浮动
- Oracle数据库表解锁语句
- Logstash 基础入门
- 7 Serial Configuration 理解 (一)
热门文章
- POJ2155 Matrix 二维线段树
- httpd2.4.27rpm包制作
- p1199八数码问题
- 学习html5 中的canvas(一)
- ap和路由器有什么区别 ap和路由器的区别介绍【图文】
- ASP.NET统计图表控件
- codeforces 673B B. Problems for Round(模拟)
- 洛谷P4316绿豆蛙的归宿——期望
- mac下载模块时报错OSError: [Errno 13] Permission denied: &#39;/Library/Python/2.7/site-packages/chardet&#39;
- pair运用