| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 46417 人关注过本帖, 13 人收藏
标题:[转帖]将SQL Server中的数据导入到Excel
只看楼主 加入收藏
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
结帖率:66.67%
收藏(13)
 问题点数:0 回复次数:282 
[转帖]将SQL Server中的数据导入到Excel
[hide]
SQL Server中的DTS也能将数据倒入Excel,但不如使用程序灵活,

 //此处省略了若干必要的基本using名字空间,请自行加上。
using System.Data;
using System.Data.SqlClient;

//定义方法GetData(),返回一个数据表
private System.Data.DataTable GetData()
{
SqlConnection conn= new SqlConnection(@"Server=PXGD2;Initial Catalog=pingxiang;Uid=sa;Pwd=;");
SqlDataAdapter adapter= new SqlDataAdapter("select  username 用户名,catalyst_port 占用端口,home_address 住宅地址,ip_address
ip地址,phone 电话,addtime 开通日期 from userinfo where catalyst_port=1 or catalyst_port='' order by ip_address desc",conn);
DataSet ds= new DataSet();
try
{
  adapter.Fill(ds,"Customer");
  }
catch(Exception ex)
{
  MessageBox.Show(ex.ToString());
}
return ds.Tables[0];
}
//按钮
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=GetData();
     
  //将所得到的表的列名,赋值给单元格
  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;  
}



下面是来自第 21 楼的 [bo]eastsnake[/bo] 提供的例子:

<!--StartFragment-->
using System;
using System.Drawing;
using System.Collections;
using
using System.Windows.Forms;
using System.Data;
using
using System.Reflection;

namespace MyExcel
{
     /// <summary>
     /// Form1 的摘要说明。
     /// </summary>
     public class Form1 : System.Windows.Forms.Form
     {
         private System.Windows.Forms.Button btnNormal;
         private System.Windows.Forms.Button btnAdvace;
         /// <summary>
         /// 必需的设计器变量。
         /// </summary>

         private components = null;

         public Form1()
         {
              //
              // Windows 窗体设计器支持所必需的
              //
              InitializeComponent();

              //
              // TOD 在 InitializeComponent 调用后添加任何构造函数代码
              //
         }

         /// <summary>
         /// 清理所有正在使用的资源。
         /// </summary>

         protected override void Dispose( bool disposing )
         {
              if( disposing )
              {
                   if (components != null)
                   {
                       components.Dispose();
                   }
              }

              base.Dispose( disposing );
         }

         #region Windows Form Designer generated code
         /// <summary>
         /// 设计器支持所需的方法 - 不要使用代码编辑器修改
         /// 此方法的内容。
         /// </summary>
         private void InitializeComponent()
         {
              this.btnNormal = new System.Windows.Forms.Button();
              this.btnAdvace = new System.Windows.Forms.Button();
              this.SuspendLayout();
              //
              // btnNormal
              //
              this.btnNormal.Location = new System.Drawing.Point(49, 55);
              this.btnNormal.Name = "btnNormal";
              this.btnNormal.TabIndex = 0;
              this.btnNormal.Text = "普通报表";
              this.btnNormal.Click += new System.EventHandler(this.btnNormal_Click);
              //
              // btnAdvace
              //
              this.btnAdvace.Location = new System.Drawing.Point(169, 55);
              this.btnAdvace.Name = "btnAdvace";
              this.btnAdvace.TabIndex = 1;
              this.btnAdvace.Text = "高级报表";
              this.btnAdvace.Click += new System.EventHandler(this.btnAdvace_Click);
              //
              // Form1
              //
              this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
              this.ClientSize = new System.Drawing.Size(292, 133);
              this.Controls.AddRange(new System.Windows.Forms.Control[] {
                    this.btnAdvace,this.btnNormal});
              this.Name = "Form1";
              this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
              this.Text = "Form1";
              this.ResumeLayout(false);
         }
         #endregion

         /// <summary>
         /// 应用程序的主入口点。
         /// </summary>
         [STAThread]
         static void Main()
         {
              Application.Run(new Form1());
         }

         private string [,] myData=
         {
              {"车牌号","类型","品 牌","型 号","颜 色","附加费证号","车架号"},

              {"浙KA3676","危险品","货车","铁风SZG9220YY","白","1110708900","022836"},

              {"浙KA4109","危险品","货车","解放CA4110P1K2","白","223132","010898"},

              {"浙KA0001A","危险品","货车","南明LSY9190WS","白","1110205458","0474636"},

              {"浙KA0493","上普货","货车","解放LSY9190WS","白","1110255971","0094327"},

              {"浙KA1045","普货","货车","解放LSY9171WCD","蓝","1110391226","0516003"},

              {"浙KA1313","普货","货车","解放9190WCD","蓝","1110315027","0538701"},

              {"浙KA1322","普货","货车","解放LSY9190WS","蓝","24323332","0538716"},

              {"浙KA1575","普货","货车","解放LSY9181WCD","蓝","1110314149","0113018"},

              {"浙KA1925","普货","货车","解放LSY9220WCD","蓝","1110390626","00268729"},

              {"浙KA2258","普货","货车","解放LSY9220WSP","蓝","111048152","00320"}
         };

          //普通报表,即单纯的文件导出功能
         private void btnNormal_Click(object sender, System.EventArgs e)
         {
              //创建一个Excel文件
              Excel.Application myExcel = new Excel.Application ( ) ;
              myExcel.Application.Workbooks.Add ( true ) ;

              //让Excel文件可见
              myExcel.Visible=true;

              //第一行为报表名称
              myExcel.Cells[1,4]="普通报表";

              //逐行写入数据,
              for(int i=0;i<11;i++)
              {
                   for(int j=0;j<7;j++)
                   {
                       //以单引号开头,表示该单元格为纯文本
                       myExcel.Cells[2+i,1+j]="'"+myData[i,j];
                   }
              }
         }

         //高级报表,根据模板生成的报表
         private void btnAdvace_Click(object sender, System.EventArgs e)
         {
              string filename="";

              //将模板文件复制到一个新文件中
              SaveFileDialog mySave=new SaveFileDialog();
              mySave.Filter="Excel文件(*.XLS)|*.xls|所有文件(*.*)|*.*";

              if(mySave.ShowDialog()!=DialogResult.OK)
              {
                   return;
              }
              else
              {
                   filename=mySave.FileName;

                   //将模板文件copy到新位置,建议实际开发时用相对路径,如
                   //Application.StartupPath.Trim()+"\\report\\normal.xls"
                  
                   string filenameold=mySave.FileName;
                   FileInfo mode=new FileInfo("d:\\normal.xls");

                   try
                   {
                       mode.CopyTo(filename,true);
                   }
                   catch(Exception ee)
                   {
                       MessageBox.Show(ee.Message);
                       return;
                   }
              }

              //打开复制后的文件
              object missing=Missing.Value;
              Excel.Application myExcel=new Excel.Application ( );

              //打开新文件
              myExcel.Application.Workbooks.Open(filename,missing,missing,missing,missing,
                missing,missing,missing,missing,missing,missing, missing,missing);

              //将Excel显示出来
              myExcel.Visible=true;

              //逐行写入数据,数组中第一行我列标题,忽略
              for(int i=1;i<11;i++)
              {
                   for(int j=0;j<7;j++)
                   {
                       //以单引号开头,表示该单元格为纯文本
                       myExcel.Cells[4+i,1+j]="'"+myData[i,j];
                   }
              }

              //将列标题和实际内容选中
              Excel.Workbook myBook=myExcel.Workbooks[1];
              Excel.Worksheet mySheet=(Excel.Worksheet)myBook.Worksheets[1];
              Excel.Range r=mySheet.get_Range(mySheet.Cells[3,1],mySheet.Cells[14,7]);
              r.Select();

              //=====通过执行宏来格表格加边框=======//
              try
              {
                   myExcel.Run("宏1",missing,missing,

                       missing,missing,missing,missing,missing,missing,missing,

                       missing,missing,missing,missing,missing,missing,missing,

                       missing,missing,missing,missing,missing,missing,missing,

                       missing,missing,missing,missing,missing,missing,missing);
              }
              catch
              {
              }

              //保存修改
              myBook.Save();
         }
     }//end of form
}
[/hide]

以前见到很多人问,不过在下不懂,刚才偶然找到一篇,转帖过来供大家参考。

最新加入了来自第 21 楼的 [bo]eastsnake[/bo] 提供的例子,感谢[bo]eastsnake[/bo] 提供。

PS:请大家耐心看完回帖内容,[bo]eastsnake[/bo] 朋友的回帖也异常精彩!


[此贴子已经被作者于2005-5-12 10:41:09编辑过]

搜索更多相关主题的帖子: SQL Excel Server 转帖 数据 
2005-03-08 23:44
eastsnake
Rank: 1
等 级:新手上路
帖 子:127
专家分:0
注 册:2005-3-8
收藏
得分:0 

Visual Studio.Net 自2001年2月问世以来,受到越来越多人的喜爱,C#做为主力军,集VB、Delphi的简单和VC的简炼与强大于一体,更是让许多人爱不释手,纷纷倒向它的怀抱。通常的软件都要用到数据库,数据库中必然要用到报表,在Visual Studio.Net中自带了一个水晶报表,虽然功能十分强大,但市面上相关资料非常缺乏,网上全面介绍其使用的文章也屈指可数。Excel是微软公司办公自动化套件中的一个软件,主要是用来处理电子表格。Excel以其功能强大,界面友好等受到了许多用户的欢迎,几乎每一台机器都安装了它,因此,我们可以将数据导入Excel进行排版。

由于Excel的格式是封闭的,无法直接创建一个Excel文件然后来排版,只有借助Com组件来完成,同样,介绍用C#操作Excel的文章也就那么几篇,基本上都是告诉你如何新建一个Excel文件,然后,将数据写入某单元格,最多再零星告诉你如何合并单元格,真正使用起来根本无法用C#做出漂亮报表。本文巧妙利用Excel的宏来自动排版,大大减少了工作量,而且可以随时修改模板而无须修改程序,非常实用。

本人使用的是Office 2000,操作系统为windows 2000 professinal,为使问题简单化,这里不介绍数据库的知识,我一个二维数组来代表一个数据库中的表,我们的目的是将该数组放到Excel中,并排版成需要的格式,数组如下:


程序员是男孩,语言是女孩; 每个男孩都希望能交往更多的女孩; 但是却没有一个男孩真正了解一个女孩; 男孩总是不能专心一个女孩,而女孩却总是在变~
2005-04-12 10:38
eastsnake
Rank: 1
等 级:新手上路
帖 子:127
专家分:0
注 册:2005-3-8
收藏
得分:0 
车牌号类 型品 牌型 号颜 色附加费证号车架号
浙KA3676危险品货车铁风SZG9220YY1110708900022836
浙KA4109危险品货车解放CA4110P1K2223132010898
浙KA0001A危险品货车南明LSY9190WS11102054580474636
浙KA0493上普货货车解放LSY9190WS11102559710094327
浙KA1045普货货车解放LSY9171WCD11103912260516003
浙KA1313普货货车解放9190WCD11103150270538701
浙KA1322普货货车解放LSY9190WS243233320538716
浙KA1575普货货车解放LSY9181WCD11103141490113018
浙KA1925普货货车解放LSY9220WCD111039062600268729
浙KA2258普货货车解放LSY9220WSP111048154200320

程序员是男孩,语言是女孩; 每个男孩都希望能交往更多的女孩; 但是却没有一个男孩真正了解一个女孩; 男孩总是不能专心一个女孩,而女孩却总是在变~
2005-04-12 10:38
eastsnake
Rank: 1
等 级:新手上路
帖 子:127
专家分:0
注 册:2005-3-8
收藏
得分:0 

为了在C#中使用Excel,我们要先做一点准备工作,通过查找(前提是你安装Visual Studio.Net和Excel 2000),在你的计算机中找到TlbImp和Excel9.olb,将他们复制到一个文件夹中,在DOS窗口中执行 TlbImp Excel9.olb,这时会产生以下三个文件:Excel.dll、Office.dll和VBIDE.dll。

我们来完成两项任务,一是按网上文章介绍的方法,增加将数据写入一个Excel文件,也就是做一个简单报表,二是用Excel创建一个文件,然后以此文件为模板生成高级报表。

打开Visual Studio.Net,新建一个C#的windows应用程序,取名为MyExcel。根据个人爱好,对窗口做一些美化工作,然后放两个按钮:btnNormal和btnAdvance,Caption分别为“普通报表”和“高级报表”。

打开Visual Studio.Net,新建一个C#的windows应用程序,取名为MyExcel。根据个人爱好,对窗口做一些美化工作,然后放两个按钮:btnNormal和btnAdvance,Caption分别为“普通报表”和“高级报表”。


程序员是男孩,语言是女孩; 每个男孩都希望能交往更多的女孩; 但是却没有一个男孩真正了解一个女孩; 男孩总是不能专心一个女孩,而女孩却总是在变~
2005-04-12 10:38
eastsnake
Rank: 1
等 级:新手上路
帖 子:127
专家分:0
注 册:2005-3-8
收藏
得分:0 

点“打开”按钮,再点“确定”按钮。

切换到代码窗口中,在文件头添加下面两个引用:

using System.IO;using System.Reflection;

再添加一个二维数组来表示数据表:

private string [,] myData= { {"车牌号","类型","品 牌","型 号","颜 色","附加费证号","车架号"}, {"浙KA3676","危险品","货车","铁风SZG9220YY","白","1110708900","022836"}, {"浙KA4109","危险品","货车","解放CA4110P1K2","白","223132","010898"}, {"浙KA0001A","危险品","货车","南明LSY9190WS","白","1110205458","0474636"}, {"浙KA0493","上普货","货车","解放LSY9190WS","白","1110255971","0094327"}, {"浙KA1045","普货","货车","解放LSY9171WCD","蓝","1110391226","0516003"}, {"浙KA1313","普货","货车","解放9190WCD","蓝","1110315027","0538701"}, {"浙KA1322","普货","货车","解放LSY9190WS","蓝","24323332","0538716"}, {"浙KA1575","普货","货车","解放LSY9181WCD","蓝","1110314149","0113018"}, {"浙KA1925","普货","货车","解放LSY9220WCD","蓝","1110390626","00268729"}, {"浙KA2258","普货","货车","解放LSY9220WSP","蓝","111048152","00320"} };

程序员是男孩,语言是女孩; 每个男孩都希望能交往更多的女孩; 但是却没有一个男孩真正了解一个女孩; 男孩总是不能专心一个女孩,而女孩却总是在变~
2005-04-12 10:38
eastsnake
Rank: 1
等 级:新手上路
帖 子:127
专家分:0
注 册:2005-3-8
收藏
得分:0 
private string [,] myData=

         {

              {"车牌号","类型","品 牌","型 号","颜 色","附加费证号","车架号"},

              {"浙KA3676","危险品","货车","铁风SZG9220YY","白","1110708900","022836"},

              {"浙KA4109","危险品","货车","解放CA4110P1K2","白","223132","010898"},

              {"浙KA0001A","危险品","货车","南明LSY9190WS","白","1110205458","0474636"},

              {"浙KA0493","上普货","货车","解放LSY9190WS","白","1110255971","0094327"},

              {"浙KA1045","普货","货车","解放LSY9171WCD","蓝","1110391226","0516003"},

              {"浙KA1313","普货","货车","解放9190WCD","蓝","1110315027","0538701"},

              {"浙KA1322","普货","货车","解放LSY9190WS","蓝","24323332","0538716"},

              {"浙KA1575","普货","货车","解放LSY9181WCD","蓝","1110314149","0113018"},

              {"浙KA1925","普货","货车","解放LSY9220WCD","蓝","1110390626","00268729"},

              {"浙KA2258","普货","货车","解放LSY9220WSP","蓝","111048152","00320"}

      };

程序员是男孩,语言是女孩; 每个男孩都希望能交往更多的女孩; 但是却没有一个男孩真正了解一个女孩; 男孩总是不能专心一个女孩,而女孩却总是在变~
2005-04-12 10:39
eastsnake
Rank: 1
等 级:新手上路
帖 子:127
专家分:0
注 册:2005-3-8
收藏
得分:0 
切换回设计窗口,双击“普通报表”按钮,设计普通报表,代码如下:
&lt;!--StartFragment--&gt;private void btnNormal_Click(object sender, System.EventArgs e)
         {
              //创建一个Excel文件

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

              myExcel.Application.Workbooks.Add ( true ) ;

              //让Excel文件可见

              myExcel.Visible=true;

              //第一行为报表名称

              myExcel.Cells[1,4]="普通报表";

              //逐行写入数据,

              for(int i=0;i&lt;11;i++)
              {
                   for(int j=0;j&lt;7;j++)
                   {
                       //以单引号开头,表示该单元格为纯文本
                       myExcel.Cells[2+i,1+j]="'"+myData[i,j];
                   }
              }
         }

程序员是男孩,语言是女孩; 每个男孩都希望能交往更多的女孩; 但是却没有一个男孩真正了解一个女孩; 男孩总是不能专心一个女孩,而女孩却总是在变~
2005-04-12 10:40
eastsnake
Rank: 1
等 级:新手上路
帖 子:127
专家分:0
注 册:2005-3-8
收藏
得分:0 
说明一下,Cells[2,1]指第2行第1个单元格,是以1为基准的,而在C#中的数组是以0为基准的,另外,我们还发现,对于编号之类的数据,实际是文本,而Excel将它认成了数字,由于太长,自动换成了科学计数,这不是我们要求的,在Excel中,如果某单元格以单引号“’”开头,表示该单元格为纯文本,因此,我们在每个单元格前面加单引号。

程序员是男孩,语言是女孩; 每个男孩都希望能交往更多的女孩; 但是却没有一个男孩真正了解一个女孩; 男孩总是不能专心一个女孩,而女孩却总是在变~
2005-04-12 10:40
eastsnake
Rank: 1
等 级:新手上路
帖 子:127
专家分:0
注 册:2005-3-8
收藏
得分:0 

可以看出,该报表非常简陋,标题行没有合并局,字体大小也不合适,连表格线都没有。当然,我们可以写代码来设置单元格字体、大小等等工作,这类技巧网上很多,但如果真要用C#来完成,是一件非常难的事情,还有个办法就是将想要的操作录制成宏,研究一下宏代码,但宏是用VBA写的,要转换成果C#可不是件容易的事情。

第一种办法不是本文的重点,就到此为止

下面进行高级报表设计,该方法的原理为:首先打开Excel,按照要求排好版,保存为一个文件做为模板,然后在C#中将该文件复制为一个新文件,在指定位置填入数据就可以了,为了添加表格线,我们录制了一个宏,在C#中执行该宏即可。


程序员是男孩,语言是女孩; 每个男孩都希望能交往更多的女孩; 但是却没有一个男孩真正了解一个女孩; 男孩总是不能专心一个女孩,而女孩却总是在变~
2005-04-12 10:40
eastsnake
Rank: 1
等 级:新手上路
帖 子:127
专家分:0
注 册:2005-3-8
收藏
得分:0 

当然,你还可以排得更漂亮,因为是单纯的Excel操作,不需要特殊说明。如果记录很多,往往一页无法打印完成,我们要求在每一页都显示报表标题和小标题,也就是上图中的第1、2行,这里有一个技巧:选择Excel的菜单“文件”→“页面设置”,选择“工作表”,在“顶端标题行”后的框中输入“$1:$2”,也就是1~2行,当然,你也点右边的红箭头,然后用鼠标选择。当你的记录超过一页时,会自动在下一页加入标题,非常方便。

表格中目前还没有表格线,因为我们不知道到底有多少数据,因此,也无法知道为多少单元格设置边框,我们借助宏来完成。

按下面步骤录制一个宏:

1、随便选择几个单元格;2、选择菜单“工具”→“宏”→“录制新宏”,输入宏的名称,就用默认的“宏1”吧,点确定;3、选择菜单“格式”→“单元格”,在对话框中选择“边框”,将内边框和外边框均选中,按确定;4、此时,刚才选择的单元格就有了边框,再点工具栏中的“停止录制宏”按钮 来结束宏录制。

刚才的操作目的是录制宏而不是加边框,因此,我们按“Ctrl+Z”来撤消刚才的操作,通过按Alt+F8来调出宏,选择“宏1”,选择编辑,看到的代码应该如下:


程序员是男孩,语言是女孩; 每个男孩都希望能交往更多的女孩; 但是却没有一个男孩真正了解一个女孩; 男孩总是不能专心一个女孩,而女孩却总是在变~
2005-04-12 10:40
快速回复:[转帖]将SQL Server中的数据导入到Excel
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035898 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved