关于将ACCESS数据导出到EXCEL表的问题

beckham1122 2006-10-27 09:42:49
public void ToExcel(System.Web.UI.Control ctl) //将数据导出成为EXCEL
{
Response.Clear();
Response.Buffer= true;
Response.Charset="GB2312";
Response.AppendHeader("Content-Disposition","attachment;filename=info.xls");
Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");//设置输出流为简体中文
Response.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。
this.EnableViewState = false;
System.Globalization.CultureInfo myCItrad = new System.Globalization.CultureInfo("ZH-CN",true);
System.IO.StringWriter oStringWriter = new System.IO.StringWriter(myCItrad);
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);

ctl.RenderControl(oHtmlTextWriter);

Response.Write("<meta http-equiv=Content-Type content=text/html;charset=gb2312>");
Response.Write(oStringWriter.ToString());
Response.End();
}
代码如上,导出都没有问题.关键是导出后,只要是字段值由"0"开头的,都被去掉了零.比如分类号字段"060528959" 就会变成"60528959",如何解决这个问题,谢谢
...全文
394 16 打赏 收藏 举报
写回复
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
haiqin1015 2006-10-29
  • 打赏
  • 举报
回复
添加对Excel的引用在哪个命名空间啊?
请指教啊!
brbrm 2006-10-29
  • 打赏
  • 举报
回复
如果不知道数据库的架构,还可以使用Connection对象的GetSchema方法来进行分析,进而遍历其中的所有表格。

更多内容可参考《.NET Office开发指南——Excel篇》一书:
http://www.tup.tsinghua.edu.cn/book/SHOWBOOK.asp?cpbh=023623-01
brbrm 2006-10-29
  • 打赏
  • 举报
回复
可以使用ADO.NET,把ACCESS和EXCEL都作为数据源,然后在之间传递数据,就不会有这些问题了:

DataSet ds1;
//访问ACCESS数据
OleDbConnectionStringBuilder csb1 = new OleDbConnectionStringBuilder();
csb1["Provider"] = "Microsoft.Jet.OLEDB.4.0";
csb1["Data Source"] = sFileName;
conn1 = new OleDbConnection(csb1.ConnectionString);
conn1.Open();
OleDbDataAdapter da1 = new OleDbDataAdapter(conn1, "SELECT * FROM Table1");
da1.Fill(ds1);

//访问Excel数据
string sFile = this.Request.PhysicalApplicationPath + "/Products.xls";
string sConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sFile + "Extended Properties=Excel 8.0;";
System.Data.OleDb.OdbcConnection conn2 = new System.Data.OleDb.OdbcConnection (sConnection);
OleDbDataAdapter da2 = new OleDbDataAdapter(conn1, "SELECT * FROM [Sheet1$]", conn1);
da2.Update(ds1);
beckham1122 2006-10-27
  • 打赏
  • 举报
回复
我是直接一条sql语句筛出来的全部字段的内容
比如 select * from tablenam
然后直接绑定的datagrid.难道还要把几十个字段都拿出来处理吗?
myminimouse 2006-10-27
  • 打赏
  • 举报
回复
http://www.qqread.com/excel/e317681010.html

这是excel的问题哦
Eddie005 2006-10-27
  • 打赏
  • 举报
回复
楼主也可能用的不是DataGrid,总之,按上面的方法做就可以

甚至改改sql语句也可以:select ''''+[field1] field1 ,''''+[field2] field2 from table1
Eddie005 2006-10-27
  • 打赏
  • 举报
回复
假设从数据库里读出的数据是装载在DataTable中,那么对于数字型的字段(或者所有字段)作如下处理:
DataTable dt = 从Access读出的原始数据;
DataColumn col = new DataColumn();
col.ColumnName = "'field1";
col.Expression = "''''+[field1]";
dt.Columns.Add(col);
dt.Columns.Remove("field1");
然后绑定到DataGrid1,最后DataGrid1作为参数调用此方法

上面这样做只有一个目的,就是给所有数据加上单引号开头,那么导出到Excel后都作为文本
Eddie005 2006-10-27
  • 打赏
  • 举报
回复
此方法不用改,只需要在数据源上做点“手脚”即可:



erwanfan 2006-10-27
  • 打赏
  • 举报
回复
用孟子的方法
-----------------------------------------------------
孟子的例子
http://dotnet.aspx.cc/article/8A4CBF47-B888-4832-3389-ED3A3A3C8AAB/read.aspx
http://dotnet.aspx.cc/Exam/OutPutExcel.aspx
Eddie005 2006-10-27
  • 打赏
  • 举报
回复
楼上的代码是个winform下的方法,需要调用excel类库
fengrengui 2006-10-27
  • 打赏
  • 举报
回复
孟子的例子
http://dotnet.aspx.cc/article/8A4CBF47-B888-4832-3389-ED3A3A3C8AAB/read.aspx
http://dotnet.aspx.cc/Exam/OutPutExcel.aspx
fengrengui 2006-10-27
  • 打赏
  • 举报
回复
上面的例子是我从一个实际应用直接拷出来的,不是一个通用的函数,根据自己的情况修改一下吧.你要的应该是worksheet.Cells.EntireColumn.NumberFormat="000000000"//9个0;
fengrengui 2006-10-27
  • 打赏
  • 举报
回复
//导出Excel的方法
private void ExportExcel(DataSet ds)
{
if(ds==null) return;

string saveFileName="";
bool fileSaved=false;
SaveFileDialog saveDialog=new SaveFileDialog();
saveDialog.DefaultExt ="xls";
saveDialog.Filter="Excel文件|*.xls";
saveDialog.FileName ="Sheet1";
saveDialog.ShowDialog();
saveFileName=saveDialog.FileName;
if(saveFileName.IndexOf(":")<0) return; //被点了取消

Excel.Application xlApp=new Excel.Application();

if(xlApp==null)
{
MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");
return;
}

Excel.Workbooks workbooks=xlApp.Workbooks;
Excel.Workbook workbook=workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
Excel.Worksheet worksheet=(Excel.Worksheet)workbook.Worksheets[1];//取得sheet1
//写入字段
for(int i=0;i<ds.Tables[0].Columns.Count;i++)
{
worksheet.Cells[1,i+1]=ds.Tables[0].Columns[i].ColumnName;
}
//写入数值

for(int r=0;r<ds.Tables[0].Rows.Count;r++)
{
for(int i=0;i<ds.Tables[0].Columns.Count;i++)
{
worksheet.Cells[r+2,i+1]=ds.Tables[0].Rows[r][i];
}
System.Windows.Forms.Application.DoEvents();
}
worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。

if(cmbxType.Text!="Notification")
{
Excel.Range rg=worksheet.get_Range(worksheet.Cells[2,2],worksheet.Cells[ds.Tables[0].Rows.Count+1,2]);
rg.NumberFormat="00000000";
}
if(saveFileName!="")
{
try
{
workbook.Saved =true;
workbook.SaveCopyAs(saveFileName);
fileSaved=true;
}
catch(Exception ex)
{
fileSaved=false;
MessageBox.Show("导出文件时出错,文件可能正被打开!\n"+ex.Message);
}
}
else
{
fileSaved=false;
}
xlApp.Quit();
GC.Collect();//强行销毁
if(fileSaved && System.IO.File.Exists(saveFileName)) System.Diagnostics.Process.Start(saveFileName);
}

在合适的位置加上worksheet.Cells.EntireColumn.NumberFormat="你的format";
记得添加对Excel的引用.
Eddie005 2006-10-27
  • 打赏
  • 举报
回复
除非楼主要做的“通用”的数据导出,可以选择不同的表名称,而不知道具体有哪些字段,
那么,最后的方法是就在数据绑定到DataGrid之前,添加一个事件处理程序:
private void btnExport_Click(object sender, System.EventArgs e)
{
DataTable dt = 从数据库读取数据;
System.Web.UI.WebControls.DataGrid dg = new DataGrid();
dg.ItemDataBound+=new DataGridItemEventHandler(dg_ItemDataBound);
dg.DataSource = dt;
dg.DataBind();
ToExcel(dg);
}
private void dg_ItemDataBound(object sender, DataGridItemEventArgs e)
{
if(e.Item.ItemIndex>-1)
foreach(TableCell cell in e.Item.Cells)
cell.Text = "'"+cell.Text;
}
Eddie005 2006-10-27
  • 打赏
  • 举报
回复
select * from tablename
这样的sql语句本身就不应该用,它的执行效率要比
select field1,field2,field3.... from tablename 要低得多

---------- 这就是懒的代价
myminimouse 2006-10-27
  • 打赏
  • 举报
回复
你直接在excel里填数字它也会把开头的0去掉的,你不处理还能怎么办
发帖
.NET社区

6.1w+

社区成员

.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
帖子事件
创建了帖子
2006-10-27 09:42
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。