目前系统需要将历史的报表数据导入系统,望高手指点一二

解决方案 »

  1.   

    将Excel文件数据导入到SqlServer数据库的三种方案
      

  2.   

     /// <summary>
            /// 读取EXCEL
            /// </summary>
            /// <param name="filePath">文件路径</param>
            /// <returns></returns>
            public static DataTable LoadExcelByInterop(string filePath)
            {
                Interop.Excel.Application excel = null;
                Interop.Excel.Workbooks wbs = null;
                Interop.Excel.Workbook wb = null;
                Interop.Excel.Worksheet ws = null;
                Interop.Excel.Range range1 = null;            excel = new Interop.Excel.Application();
                excel.UserControl = true;
                excel.DisplayAlerts = false;            object Nothing = System.Reflection.Missing.Value;            excel.Application.Workbooks.Open(filePath, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing);            System.Data.DataTable table = new System.Data.DataTable();            wbs = excel.Workbooks;
                wb = wbs[1];
                ws = (Interop.Excel.Worksheet)wb.Worksheets[1];
                int columnCount = ws.UsedRange.Cells.Columns.Count;
                int rowCount = ws.UsedRange.Cells.Rows.Count;            range1 = ws.get_Range(ws.Cells[1, 1], ws.Cells[1, columnCount]);            object[,] obj = (object[,])range1.Value2;
                // 添加表头
                for (int i = 1; i < columnCount + 1; i++)
                {
                    table.Columns.Add(obj[1, i].ToString());
                }            range1.Clear();
                range1 = ws.get_Range(ws.Cells[2, 1], ws.Cells[rowCount, columnCount]);            obj = (object[,])range1.Value2;            object[] value = new object[columnCount];
                for (int row = 1; row <= obj.GetLength(0); row++)
                {
                    table.Rows.Add(GetArray(obj, row));
                }            CloseExcel(excel);
                // 关闭相关变量
                wb = null;
                excel = null;
                wbs = null;            return table;
            }
      

  3.   


    using System;   
    using System.Data;   
    using System.Windows.Forms;   
    using System.Data.OleDb;   
    namespace WindowsApplication2   
    {   
        public partial class Form1 : Form   
        {   
            public Form1()   
            {   
                InitializeComponent();   
            }   
      
            private void button1_Click(object sender, EventArgs e)   
            {   
                //测试,将excel中的sheet1导入到sqlserver中   
                string connString = "server=localhost;uid=sa;pwd=sqlgis;database=master";   
                System.Windows.Forms.OpenFileDialog fd = new OpenFileDialog();   
                if (fd.ShowDialog() == DialogResult.OK)   
                {   
                    TransferData(fd.FileName, "sheet1", connString);   
                }   
            }   
      
            public void TransferData(string excelFile, string sheetName, string connectionString)   
            {   
                DataSet ds = new DataSet();   
                try  
                {   
                    //获取全部数据   
                    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";" + "Extended Properties=Excel 8.0;";   
                    OleDbConnection conn = new OleDbConnection(strConn);   
                    conn.Open();   
                    string strExcel = "";   
                    OleDbDataAdapter myCommand = null;   
                    strExcel = string.Format("select * from [{0}$]", sheetName);   
                    myCommand = new OleDbDataAdapter(strExcel, strConn);   
                    myCommand.Fill(ds, sheetName);   
      
                    //如果目标表不存在则创建   
                    string strSql = string.Format("if object_id(&apos;{0}&apos;) is null create table {0}(", sheetName);   
                    foreach (System.Data.DataColumn c in ds.Tables[0].Columns)   
                    {   
                        strSql += string.Format("[{0}] varchar(255),", c.ColumnName);   
                    }   
                    strSql = strSql.Trim(',') + ")";   
      
                    using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(connectionString))   
                    {   
                        sqlconn.Open();   
                        System.Data.SqlClient.SqlCommand command = sqlconn.CreateCommand();   
                        command.CommandText = strSql;   
                        command.ExecuteNonQuery();   
                        sqlconn.Close();   
                    }   
                    //用bcp导入数据   
                    using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString))   
                    {   
                        bcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);   
                        bcp.BatchSize = 100;//每次传输的行数   
                        bcp.NotifyAfter = 100;//进度提示的行数   
                        bcp.DestinationTableName = sheetName;//目标表   
                        bcp.WriteToServer(ds.Tables[0]);   
                    }   
                }   
                catch (Exception ex)   
                {   
                    System.Windows.Forms.MessageBox.Show(ex.Message);   
                } 
            }   
      
            //进度显示   
            void bcp_SqlRowsCopied(object sender, System.Data.SqlClient.SqlRowsCopiedEventArgs e)   
            {   
                this.Text = e.RowsCopied.ToString();   
                this.Update();   
            }  
        }   
    }  
      

  4.   

    给你一个例子 是将现有的excel文件导入的sql2005里面的  代码如下
    /// <summary>
        /// 将excel文件导入到dataset中
        /// </summary>
        /// <param name="fileName">文件路径</param>
        private void ImportXlsToData(string fileName)
        {
            string str= "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;HDR=YES\"";
            string oledbstr = "select * from [Sheet1$]";
            OleDbConnection conn = new OleDbConnection(str);
            try
            {
                conn.Open();
                OleDbCommand com = new OleDbCommand(oledbstr, conn);
                OleDbDataAdapter adp = new OleDbDataAdapter(com);
                DataSet ds = new DataSet();
                adp.Fill(ds);
            }
            catch (Exception err)
            {
                //显示错误信息
            }
            finally
            {
                conn.Close();
            }
        }
    接下来你只需要写一个sql把dataset里的数据insert到你的数据库里就可以了
      

  5.   


    --从sql server中导入/导出 excel 的基本方法
    /*===================  导入/导出 excel 的基本方法 ===================*/从excel文件中,导入数据到sql数据库中,非常简单,直接用下面的语句:/*===================================================================*/
    --如果接受数据导入的表已存在
    insert into 表 select * from 
    openrowset(microsoft.jet.oledb.4.0
    ,excel 5.0;hdr=yes;database=c:test.xls,sheet1$)--如果导入数据并生成表
    select * into 表 from 
    openrowset(microsoft.jet.oledb.4.0
    ,excel 5.0;hdr=yes;database=c:test.xls,sheet1$)
    /*===================================================================*/
    --如果从sql数据库中,导出数据到excel,如果excel文件已存在,而且已按照要接收的数据创建好表头,就能简单的用:
    insert into openrowset(microsoft.jet.oledb.4.0
    ,excel 5.0;hdr=yes;database=c:test.xls,sheet1$)
    select * from 表
    --如果excel文件不存在,也能用bcp来导成类excel的文件,注意大小写:
    --导出表的情况
    exec master..xp_cmdshell bcp 数据库名.dbo.表名 out "c:test.xls" /c -/s"服务器名" /u"用户名" -p"密码"--导出查询的情况
    exec master..xp_cmdshell bcp "select au_fname, au_lname from pubs..authors order by au_lname" queryout "c:test.xls" /c -/s"服务器名" /u"用户名" -p"密码"
    /*--说明:
    c:test.xls  为导入/导出的excel文件名.
    sheet1$      为excel文件的工作表名,一般要加上$才能正常使用.
    --*/
    --上面已说过,用bcp导出的是类excel文件,其实质为文本文件,--要导出真正的excel文件.就用下面的方法
    /*--数据导出excel
     
     导出表中的数据到excel,包含字段名,文件为真正的excel文件
     ,如果文件不存在,将自动创建文件
     ,如果表不存在,将自动创建表
     基于通用性考虑,仅支持导出标准数据类型
    --邹建 2003.10--*//*--调用示例 p_exporttb @tbname=地区资料,@path=c:,@fname=aa.xls
    --*/
    if exists (select * from dbo.sysobjects where id = object_id(n[dbo].[p_exporttb]) and objectproperty(id, nisprocedure) = 1)
    drop procedure [dbo].[p_exporttb]
    gocreate proc p_exporttb
    @tbname sysname,    --要导出的表名
    @path nvarchar(1000),   --文件存放目录
    @fname nvarchar(250)=  --文件名,默认为表名
    as
    declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int
    declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)--参数检测
    if isnull(@fname,)= set @fname=@tbname+.xls--检查文件是否已存在
    if right(@path,1)<> set @path=@path+
    create table #tb(a bit,b bit,c bit)
    set @sql=@path+@fname
    insert into #tb exec master..xp_fileexist @sql--数据库创建语句
    set @sql=@path+@fname
    if exists(select 1 from #tb where a=1)
     set @constr=driver={microsoft excel driver (*.xls)};dsn=;readonly=false
           +;create_db="    +;database=+@sql+"
    --连接数据库
    exec @err=sp_oacreate adodb.connection,@obj out
    if @err<>0 goto lberrexec @err=sp_oamethod @obj,open,null,@constr
    if @err<>0 goto lberr/*--如果覆盖已存在的表,就加上下面的语句
    --创建之前先删除表/如果存在的话
    select @sql=drop table [+@tbname+]
    exec @err=sp_oamethod @obj,execute,@out out,@sql
    --*/--创建表的sql
    select @sql=,@fdlist=
    select @fdlist=@fdlist+,[+a.name+]
     ,@sql=@sql+,[+a.name+] 
      +case when b.name in(char,nchar,varchar,nvarchar) then
         text(+cast(case when a.length>255 then 255 else a.length end as varchar)+)
       when b.name in(tynyint,int,bigint,tinyint) then int
       when b.name in(smalldatetime,datetime) then datetime
       when b.name in(money,smallmoney) then money
       else b.name end
    from syscolumns a left join systypes b on a.xtype=b.xusertype
    where b.name not in(image,text,uniqueidentifier,sql_variant,ntext,varbinary,binary,timestamp)
     and object_id(@tbname)=id
    select @sql=create table [+@tbname
     +](+substring(@sql,2,8000)+)
     ,@fdlist=substring(@fdlist,2,8000)
    exec @err=sp_oamethod @obj,execute,@out out,@sql
    if @err<>0 goto lberrexec @err=sp_oadestroy @obj--导入数据
    set @sql=openrowset(microsoft.jet.oledb.4.0,excel 5.0;hdr=yes
       ;database=+@path+@fname+,[+@tbname+$])exec(insert into +@sql+(+@fdlist+) select +@fdlist+ from +@tbname)returnlberr:
     exec sp_oageterrorinfo 0,@src out,@desc out
    lbexit:
     select cast(@err as varbinary(4)) as 错误号
      ,@src as 错误源,@desc as 错误描述
     select @sql,@constr,@fdlist
    go
    --上面是导表的,下面是导查询语句的./*--数据导出excel
     
     导出查询中的数据到excel,包含字段名,文件为真正的excel文件
     ,如果文件不存在,将自动创建文件
     ,如果表不存在,将自动创建表
     基于通用性考虑,仅支持导出标准数据类型
    --邹建 2003.10--*//*--调用示例 p_exporttb @sqlstr=select * from 地区资料
      ,@path=c:,@fname=aa.xls,@sheetname=地区资料
    --*/
    if exists (select * from dbo.sysobjects where id = object_id(n[dbo].[p_exporttb]) and objectproperty(id, nisprocedure) = 1)
    drop procedure [dbo].[p_exporttb]
    gocreate proc p_exporttb
    @sqlstr varchar(8000),   --查询语句,如果查询语句中使用了order by ,请加上top 100 percent
    @path nvarchar(1000),   --文件存放目录
    @fname nvarchar(250),   --文件名
    @sheetname varchar(250)=  --要创建的工作表名,默认为文件名
    as 
    declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int
    declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)--参数检测
    if isnull(@fname,)= set @fname=temp.xls
    if isnull(@sheetname,)= set @sheetname=replace(@fname,.,#)--检查文件是否已存在
    if right(@path,1)<> set @path=@path+
    create table #tb(a bit,b bit,c bit)
    set @sql=@path+@fname
    insert into #tb exec master..xp_fileexist @sql--数据库创建语句
    set @sql=@path+@fname
    if exists(select 1 from #tb where a=1)
     set @constr=driver={microsoft excel driver (*.xls)};dsn=;readonly=false
           +;create_db="    +;database=+@sql+"--连接数据库
    exec @err=sp_oacreate adodb.connection,@obj out
    if @err<>0 goto lberrexec @err=sp_oamethod @obj,open,null,@constr
    if @err<>0 goto lberr--创建表的sql
    declare @tbname sysname
    set @tbname=##tmp_+convert(varchar(38),newid())
    set @sql=select * into [+@tbname+] from(+@sqlstr+) a
    exec(@sql)select @sql=,@fdlist=
    select @fdlist=@fdlist+,[+a.name+]
     ,@sql=@sql+,[+a.name+] 
      +case when b.name in(char,nchar,varchar,nvarchar) then
         text(+cast(case when a.length>255 then 255 else a.length end as varchar)+)
       when b.name in(tynyint,int,bigint,tinyint) then int
       when b.name in(smalldatetime,datetime) then datetime
       when b.name in(money,smallmoney) then money
       else b.name end
    from tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype
    where b.name not in(image,text,uniqueidentifier,sql_variant,ntext,varbinary,binary,timestamp)
     and a.id=(select id from tempdb..sysobjects where name=@tbname)
    select @sql=create table [+@sheetname
     +](+substring(@sql,2,8000)+)
     ,@fdlist=substring(@fdlist,2,8000)exec @err=sp_oamethod @obj,execute,@out out,@sql
    if @err<>0 goto lberrexec @err=sp_oadestroy @obj--导入数据
    set @sql=openrowset(microsoft.jet.oledb.4.0,excel 5.0;hdr=yes
       ;database=+@path+@fname+,[+@sheetname+$])exec(insert into +@sql+(+@fdlist+) select +@fdlist+ from [+@tbname+])set @sql=drop table [+@tbname+]
    exec(@sql)
    returnlberr:
     exec sp_oageterrorinfo 0,@src out,@desc out
    lbexit:
     select cast(@err as varbinary(4)) as 错误号
      ,@src as 错误源,@desc as 错误描述
     select @sql,@constr,@fdlist
    go
      

  6.   

    // 1、如何从Excel中获得工作单(sheetname):
        //获得Excel中的所有sheetname。
        public ArrayList ExcelSheetName ( string filepath )
        {
            ArrayList al = new ArrayList ();
            string strConn;
            strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepath + ";Extended Properties=Excel 8.0;";
            OleDbConnection conn = new OleDbConnection(strConn);
            conn.Open ();
            DataTable sheetNames = conn.GetOleDbSchemaTable
            (System.Data.OleDb.OleDbSchemaGuid.Tables,new object[]{null,null,null,"TABLE"});
            conn.Close ();
            foreach ( DataRow dr in sheetNames.Rows )
            {
                al.Add ( dr[2] );
            }
            return al;
        }//  2、Excel数据导入到数据库中:
        //该方法实现从Excel中导出数据到DataSet中,其中filepath为Excel文件的绝对路径,sheetname为表示那个Excel表;
        public DataSet ExcelDataSource(string filepath, string sheetname)
        {
      string strConn;
            strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepath + ";Extended Properties=Excel 8.0;";
            OleDbConnection conn = new OleDbConnection(strConn);
            OleDbDataAdapter oada = new OleDbDataAdapter("select * from [" + sheetname + "$]", strConn);
            DataSet ds = new DataSet();
            oada.Fill(ds);
            return ds;
        } // 导入 按钮
        protected void imgBtnInsert_Click(object sender, ImageClickEventArgs e)
        {
            //1、首先获得Excel表的绝对路径 和 Excel表格的名称
            string fullPath = FileUpload1.PostedFile.FileName;
            string fileName = FileUpload1.FileName.ToString();
            //2、获得sheetname
            ArrayList list= ExcelSheetName(fullPath);
            string names="";
            for (int i = 0; i < list.Count; i++)
            {
                names += list[i] + ",";
            }
            ExcelDataSource(fullPath,"Student");
            Dbclass mc = new Dbclass();
            string sql = "insert into Student select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0'  , 'Excel 5.0;HDR=YES;DATABASE="+fullPath+"',Student$)"; //
     //往数据库中插入数据
            mc.ReturnValue(sql);
            Response.Write("<script>alert('操作完毕,Excel表格的数据已存入数据库中!')</script>");
        }
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hongjiaoli/archive/2010/03/31/5437881.aspx
      

  7.   

    不用写这么长的程序,把用企业管理器将excel先导入数据库,再使用程序作数据表的相关操作就行了
      

  8.   

    http://code.google.com/p/excellibrary/
    //create new xls file 
    string file = "C:\\newdoc.xls"; 
    Workbook workbook = new Workbook(); 
    Worksheet worksheet = new Worksheet("First Sheet"); 
    worksheet.Cells[0, 1] = new Cell((short)1); 
    worksheet.Cells[2, 0] = new Cell(9999999); 
    worksheet.Cells[3, 3] = new Cell((decimal)3.45); 
    worksheet.Cells[2, 2] = new Cell("Text string"); 
    worksheet.Cells[2, 4] = new Cell("Second string"); 
    worksheet.Cells[4, 0] = new Cell(32764.5, "#,##0.00"); 
    worksheet.Cells[5, 1] = new Cell(DateTime.Now, @"YYYY\-MM\-DD"); 
    worksheet.Cells.ColumnWidth[0, 1] = 3000; 
    workbook.Worksheets.Add(worksheet); 
    workbook.Save(file);
      
    // open xls file 
    Workbook book = Workbook.Load(file); 
    Worksheet sheet = book.Worksheets[0];   
    // traverse cells  
    foreach (Pair<Pair<int, int>, Cell> cell in sheet.Cells)  
    {      
    dgvCells[cell.Left.Right, cell.Left.Left].Value = cell.Right.Value;  }   
    // traverse rows by Index  
    for (int rowIndex = sheet.Cells.FirstRowIndex;          rowIndex <= sheet.Cells.LastRowIndex; rowIndex++)  
    {      
    Row row = sheet.Cells.GetRow(rowIndex);      
    for (int colIndex = row.FirstColIndex;          
    colIndex <= row.LastColIndex; colIndex++)      
    {          
    Cell cell = row.GetCell(colIndex);      
    }  
    }