有一客户需求:
1、要从SQL Server数据库导出并生成Excel ;
2、用户下载对应的Excel并填写上传再导入到SQL server。
费了将近六个小时,故一定要把过程写下来,希望看到此文的朋友少走些不必要的弯路。
首先,想到的是直接导出到客户端,代码如下:
- publicstaticvoidDataSetToExcel(DataSetoDS,HttpResponseResponse,stringfileName)
- {
-
if(oDS==null||oDS.Tables[0]==null||oDS.Tables[0].Rows.Count==0){return;}
- Response.Clear();
-
-
HttpContext.Current.Response.Charset="gb2312";
-
-
-
Response.ContentType="text/csv";
-
Response.AppendHeader("Content-Disposition","attachment;filename="+fileName+".cvs");
-
System.IO.StringWriteroSW=newSystem.IO.StringWriter();
-
HtmlTextWriteroHW=newHtmlTextWriter(oSW);
-
DataGriddg=newDataGrid();
- dg.DataSource=oDS.Tables[0];
- dg.DataBind();
- dg.RenderControl(oHW);
- Response.Write(oSW.ToString());
- Response.Flush();
- Response.Close();
- }
这样生成是生成了! 客户也可以用Excel直接打开并编辑,问题来了! 上传时出错,仔细看看生成的Excel.xls,
用记事本打开,内容大致如下:
- <tablecellspacing="0"rules="all"border="1"style="border-collapse:collapse;"mce_style="border-collapse:collapse;">
- <tr>
- <td>品名</td><td>最高价格</td><td>最低价格</td><td>平均价格</td><td>计量单位</td><td>备注</td>
- </tr><tr>
- <td>青菜</td><td></td><td></td><td></td><td>元/公斤</td><td></td>
- </tr><tr>
- <td>南瓜</td><td></td><td></td><td></td><td>元/公斤</td><td></td>
- </tr><tr>
- <td>瓠子</td><td></td><td></td><td></td><td>元/公斤</td><td></td>
- </tr><tr>
- <td>冬春笋</td><td></td><td></td><td></td><td>元/公斤</td><td></td>
- </tr><tr>
- <td>雪里蕻</td><td></td><td></td><td></td><td>元/公斤</td><td></td>
- </tr><tr>
- <td>樱桃萝卜</td><td></td><td></td><td></td><td>元/公斤</td><td></td>
- </tr><tr>
- <td>佛手瓜</td><td></td><td></td><td></td><td>元/公斤</td><td></td>
- </tr><tr>
- <td>白菜鼎</td><td></td><td></td><td></td><td>元/公斤</td><td></td>
- </tr><tr>
- <td>蒜</td><td></td><td></td><td></td><td>元/公斤</td><td></td>
- </tr><tr>
- <td>食用菌</td><td></td><td></td><td></td><td>元/公斤</td><td></td>
- </tr><tr>
- <td>黄瓜</td><td></td><td></td><td></td><td>元/公斤</td><td></td>
- </tr>
- </table>
原来,就是纯粹的html格式,披了件Excel的外衣。这样用户传上来的文件当然不是标准的Excel格式了!
于是, 想到直接生成xml格式的Excel文档,方法如下 :
可惜, 生成的倒是XML格式了,但还是上传格式不正确,考虑到客户端可能是Excel2007/2003-97等等,决定放弃保存Excel到客户端的方式。
第三种尝试方案:用cvs保存,将第一种方法改为:
- Response.ContentType="text/csv";
-
Response.AppendHeader("Content-Disposition","attachment;filename="+fileName+".cvs");
生成格式大致如下:
- "品名","最高价格","最低价格","平均价格","计量单位","备注"
- "青菜","","","","元/公斤",""
- "南瓜","","","","元/公斤",""
- "瓠子","","","","元/公斤",""
- "冬春笋","","","","元/公斤",""
- "雪里蕻","","","","元/公斤",""
- "樱桃萝卜","","","","元/公斤",""
- "佛手瓜","","","","元/公斤",""
- "白菜鼎","","","","元/公斤",""
- "蒜","","","","元/公斤",""
- "食用菌","","","","元/公斤",""
- "黄瓜","","","","元/公斤",""
导入到SQL Server时有多种方法:
给出简要代码:
- publicstaticDataTableGetDataFromCSV(stringfilePath,intbeginColumn)
- {
-
intintColCount=0;
-
boolblnFlag=true;
-
DataTablemydt=newDataTable("myTableName");
- DataColumnmydc;
- DataRowmydr;
-
-
stringstrline;
-
string[]aryline;
-
System.IO.StreamReadermysr=newSystem.IO.StreamReader(filePath,System.Text.Encoding.UTF8);
-
intFlagFirst=1;
-
while((strline=mysr.ReadLine())!=null)
- {
-
-
strline=strline.Replace("/n","");
-
strline=strline.Replace("/r","");
-
strline=strline.Replace("/t","");
-
-
aryline=strline.Split(newchar[]{','});
-
if(blnFlag)
- {
-
blnFlag=false;
- intColCount=aryline.Length;
-
for(inti=0;i<aryline.Length;i++)
- {
-
mydc=newDataColumn(aryline[i]);
- mydt.Columns.Add(mydc);
- }
- }
- mydr=mydt.NewRow();
-
for(inti=0;i<intColCount;i++)
- {
- mydr[i]=aryline[i];
- }
- mydt.Rows.Add(mydr);
- FlagFirst++;
- }
-
- mysr.Close();
- mysr.Dispose();
-
returnmydt;
- }
也有人给出方案,直接从cvs中读取
- publicstaticstringPreFilePath=@"c:/Excel/";
-
publicstaticstringstrconn=@"Driver={MicrosoftTextDriver(*.txt;*.csv)};Dbq="+PreFilePath+";Extensions=asc,csv,tab,txt;";
-
publicstaticDataSetGetDataSetFromCSV(stringfilename)
- {
-
OdbcConnectionobjconn=newOdbcConnection(strconn);
-
DataSetdscsv=newDataSet();
-
try
- {
-
stringstrsql="select*from"+filename;
-
OdbcDataAdapterodbccsvdataadapter=newOdbcDataAdapter(strsql,objconn);
- odbccsvdataadapter.Fill(dscsv);
-
returndscsv;
- }
-
catch(Exceptionex)
- {
-
throwex;
- }
- }
尝试失败!!
Code Project 上有篇文章,
也可以试试。
虽然也可以凑合用, 但总觉得CVS出错的可能性更大。
到此,决定放弃客户端生成的方式,请看下篇
DataSet导出到Excel比较完整的解决方案(二)--服务器端生成文件(downmoon)
分享到:
相关推荐
将Dataset导出到Excel,本程序阐述基本功能-Dataset exported to Excel, the program described the basic functions of
C# 源码 EXCEL导入到Dataset,Dataset导出到Excel
DataSet 或 DataTable 导出到 Excel
DataSet导出到Office 2007 Excel 支持服务器端杀死excel.exe进程
解决.net DataSet导出excel问题
方便好用的类模板,传入dataset 就可以生成EXCEL。 要添加引用Microsoft.Office.Interop.Excel.dll
从dataset数据源导出到Excel,根据datatable生成对应sheet
C#DataSet导出EXCEL的方法 代码分析 可以参考,个人搜索
.net(dataset)输出流导出excel(无需生成模版excel文件,直接输出数据流导出excel表格)
导入导出EXCEL的源代码.[导出带线的Excel,导入DataSet] 只需要将该包Comm添加到项目,调用其对应的导入\导出类中的方法使用.[导入导出源代码]
从数据库中获取数据显示在Datagridview中,然后将数据导入到excel或从Dataset直接将数据导出到excel
C#导出DataSet到EXCEL,CSV
本 资源 为 dataset 生成 多张表的excel 文件 点击导出数据 会在 客户端提示用户保存或者下载. 资源里有使用说明 .
ASP.NET用DataSet导出到Excel的方法,需要的朋友可以参考一下
本文实例为大家分享了Winform实现导入导出Excel文件的具体代码,供大家参考,具体内容如下 /// /// 导出Excel文件 /// /// /// <param name=dataSet> /// 数据集 /// 导出后是否打开文件 /// <returns></...
查出数据,导出到Excel
背景:今天要把DataSet导入Excel,查询以前的贴子,一部分用Ole,速度太慢, 一部分用ADO连接到Excel文件,也很慢,一气之下把DBGrigEh的导出部分改了出来, 欢迎大家指教、改进。 功能:将数据集的数据...
功能描述: 1、选择当前路径下的所有xls文件(xls文件必须是统一格式);...3、从Dataset导出到Excel表格 注:此代码运行是需有office组建作为支持,即运行该程序的电脑上必须安装office软件;程序由VS2012开发。
c# DataTable,DataSet导出到xls,access文件 不需要有预置xls文件模板,如果没有该文件,自动创建
DataSet 导出Excel, 需要就下吧!