winform程序如何将DataTable数据导入到Excel文件中,用文件流的形式可以吗?
能给个代码参考下么 谢谢了。winformExcel c#

解决方案 »

  1.   

    /// <summary>
       /// 读取Excel文档
      /// </summary>
       /// <param name="Path">文件名称</param>
       /// <returns>返回一个数据集</returns>
       public DataSet ExcelToDS(string Path)
       {
        string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;";
        OleDbConnection conn = new OleDbConnection(strConn);
        conn.Open();  
        string strExcel = "";   
        OleDbDataAdapter myCommand = null;
        DataSet ds = null;
        strExcel="select * from [sheet1$]";
        myCommand = new OleDbDataAdapter(strExcel, strConn);
        ds = new DataSet();
        myCommand.Fill(ds,"table1");   
        return ds;
       }
    /// <summary>
       /// 写入Excel文档
      /// </summary>
       /// <param name="Path">文件名称</param>
       public bool SaveFP2toExcel(string Path)
       {
        try
        {
         string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;";
         OleDbConnection conn = new OleDbConnection(strConn);
         conn.Open();  
         System.Data.OleDb.OleDbCommand cmd=new OleDbCommand ();
         cmd.Connection =conn;
         //cmd.CommandText ="UPDATE [sheet1$] SET 姓名='2005-01-01' WHERE 工号='日期'";
         //cmd.ExecuteNonQuery ();
         for(int i=0;i<fp2.Sheets [0].RowCount -1;i++)
         {
          if(fp2.Sheets [0].Cells[i,0].Text!="")
          {
           cmd.CommandText ="INSERT INTO [sheet1$] (工号,姓名,部门,职务,日期,时间) VALUES('"+fp2.Sheets [0].Cells[i,0].Text+ "','"+
            fp2.Sheets [0].Cells[i,1].Text+"','"+fp2.Sheets [0].Cells[i,2].Text+"','"+fp2.Sheets [0].Cells[i,3].Text+
            "','"+fp2.Sheets [0].Cells[i,4].Text+"','"+fp2.Sheets [0].Cells[i,5].Text+"')";
           cmd.ExecuteNonQuery ();
          }
         }
         conn.Close ();
         return true;
        }
        catch(System.Data.OleDb.OleDbException ex)
        {
         System.Diagnostics.Debug.WriteLine ("写入Excel发生错误:"+ex.Message );
        }
        return false;
       }
      

  2.   

    上面的方法不是很苟同,因为如果是大数据量的话,非常的慢,目前我也没找到针对ADO.NET用EXCEL快速输出数据的方法,求高人指点。
      

  3.   


    用流可以的
    http://blog.csdn.net/happy09li/article/details/7431967
      

  4.   


    public static bool ExportExcelWithXML(System.Data.DataTable dt, string path)
            {
                bool succeed = false;
                if (dt == null)
                {
                    // 导出为XML格式的Excel文件,需要事先准备好XML格式的Excel文件作为模版
                    try
                    {
                        XmlDocument doc = new XmlDocument();
                        doc.Load(System.Windows.Forms.Application.StartupPath + @"\XLS\ExportXML.xls");
                        XmlNode root = doc.DocumentElement;
                        XmlNodeList xnlist = root.ChildNodes;
                        XmlElement sheet = null;
                        XmlElement documentPro = null;
                        XmlElement styles = null;
                        foreach (XmlNode xn in xnlist)
                        {
                            XmlElement xe = (XmlElement)xn;
                            if (xe.Name == "DocumentProperties")
                            {
                                documentPro = xe;
                            }
                            else if (xe.Name == "Worksheet")
                            {
                                sheet = xe;
                            }
                            else if (xe.Name == "Styles")
                            {
                                styles = xe;
                            }
                        }                    if (documentPro == null || sheet == null || styles == null)
                        {
                            return false;
                        }                    // 写入Sheet名
                        sheet.SetAttribute("Name", ssNameSpace, dt.TableName);                    // 添加Style
                        XmlElement styleColumnName = doc.CreateElement("Style", ssNameSpace);
                        styleColumnName.SetAttribute("ID", ssNameSpace, "s16");
                        XmlElement fontColumnName = doc.CreateElement("Font", ssNameSpace);
                        fontColumnName.SetAttribute("FontName", ssNameSpace, "Arial");
                        fontColumnName.SetAttribute("Family", xNameSpace, "Swiss");
                        fontColumnName.SetAttribute("Color", ssNameSpace, "#000000");
                        fontColumnName.SetAttribute("Bold", ssNameSpace, "1");
                        styleColumnName.AppendChild(fontColumnName);
                        styles.AppendChild(styleColumnName);                    XmlElement styleRow = doc.CreateElement("Style", ssNameSpace);
                        styleRow.SetAttribute("ID", ssNameSpace, "s17");
                        XmlElement fontRow = doc.CreateElement("Font", ssNameSpace);
                        fontRow.SetAttribute("FontName", ssNameSpace, "Arial");
                        fontRow.SetAttribute("Family", xNameSpace, "Swiss");
                        fontRow.SetAttribute("Color", ssNameSpace, "#000000");
                        styleRow.AppendChild(fontRow);
                        styles.AppendChild(styleRow);                    // 写入表格内容
                        XmlNode table = sheet.FirstChild;                    // 写入行列个数
                        ((XmlElement)table).SetAttribute("ExpandedColumnCount", ssNameSpace, dt.Columns.Count.ToString());
                        ((XmlElement)table).SetAttribute("ExpandedRowCount", ssNameSpace, (dt.Rows.Count + 2).ToString());                    // 添加列宽
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            XmlElement column = doc.CreateElement("Column", ssNameSpace);
                            column.SetAttribute("Width", ssNameSpace, "100");
                            column.SetAttribute("AutoFitWidth", ssNameSpace, "1");
                            table.AppendChild(column);
                        }                    // 添加列名
                        XmlElement columnName = doc.CreateElement("Row", ssNameSpace);
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            XmlElement columnCell = doc.CreateElement("Cell", ssNameSpace);
                            columnCell.SetAttribute("StyleID", ssNameSpace, "s16");                        XmlElement data = doc.CreateElement("ss:Data", ssNameSpace);
                            data.SetAttribute("Type", ssNameSpace, "String");
                            data.InnerText = dt.Columns[i].ToString();                        columnCell.AppendChild(data);
                            columnName.AppendChild(columnCell);
                        }
                        table.AppendChild(columnName);                    // 添加行
                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            XmlElement row = doc.CreateElement("Row", ssNameSpace);
                            for (int j = 0; j < dt.Columns.Count; j++)
                            {
                                XmlElement cell = doc.CreateElement("Cell", ssNameSpace);
                                cell.SetAttribute("StyleID", ssNameSpace, "s17");                            XmlElement data = doc.CreateElement("Data", ssNameSpace);
                                data.SetAttribute("Type", ssNameSpace, "String");
                                data.InnerText = dt.Rows[i][j].ToString();                            cell.AppendChild(data);
                                row.AppendChild(cell);
                            }
                            table.AppendChild(row);
                        }                    DateTime now = DateTime.Now;
                        string timeString = string.Format("{0}T{1}Z", now.ToShortDateString(), now.ToLongTimeString());
                        XmlNodeList docProNodeList = documentPro.ChildNodes;
                        foreach (XmlNode xn in docProNodeList)
                        {
                            if (xn.Name == "Author" || xn.Name == "LastAuthor")
                            {
                                // 写入作者和修改者
                                xn.InnerText = Environment.UserName;
                            }
                            else if (xn.Name == "Created" || xn.Name == "LastSaved")
                            {
                                // 写入创建时间和修改时间
                                xn.InnerText = timeString;
                            }
                            else if (xn.Name == "Company")
                            {
                                // 写入公司名
                                xn.InnerText = System.Windows.Forms.Application.CompanyName;
                            }
                        }                    doc.Save(path);
                        succeed = true;
                    }
                    catch (Exception e)
                    {
                        succeed = false;
                    }
                }            return succeed;
            }
      

  5.   


    /// <summary>
            /// 把DataTable导出到EXCEL不是科学计算法
            /// </summary>
            /// <param name="dt">DataTable数据源表</param>
            /// <param name="saveFileName">EXCEL全路径文件名</param>
            /// <returns>导出是否成功</returns>
            public bool ExportExcel_NoScientificCalc(System.Data.DataTable dt, string saveFileName)
            {
                if (dt == null)
                {
                    MessageBoxHepler.ShowErrorMsgBox("要到出的数据集为空!");
                    return false;
                }
                Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
                if (xlApp == null)
                {
                    MessageBoxHepler.ShowErrorMsgBox("不能创建EXCEL文件,请检查您的机器是否正确安装过EXCEL!");
                    return false;
                }
                //xlApp.Visible = true; //打开EXCEL 可以清楚的看到导入过程,这样省掉了进度条的功能但是加长的导出时间            Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
                Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
                Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得第一个SHEET
                worksheet.Name = dt.TableName;
                worksheet.Cells.Font.Size = 10; //字体大小
                Microsoft.Office.Interop.Excel.Range range;            worksheet.get_Range("A1", "D1").Merge((worksheet.get_Range("A1", "D1").MergeCells));
                worksheet.get_Range("E1", "G1").Merge((worksheet.get_Range("E1", "G1").MergeCells));
                worksheet.Cells[1, 1] = txtConsignor.Text;
                worksheet.Cells[1, 5] = ghdtc.DtpStartDate.ToString("yyyy-MM-dd") + " - " + ghdtc.DtpEndDate.ToString("yyyy-MM-dd");
                range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, 1];
                range.HorizontalAlignment = XlHAlign.xlHAlignCenter;
                range.Interior.ColorIndex = 34;
                range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, 5];
                range.HorizontalAlignment = XlHAlign.xlHAlignCenter;
                range.Interior.ColorIndex = 34;
                ((Microsoft.Office.Interop.Excel.Range)worksheet.Rows["1:1", System.Type.Missing]).RowHeight = 22;            //写入列头字段
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    worksheet.Cells[2, i + 1] = dt.Columns[i].ColumnName;
                    range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[2, i + 1];
                    range.Interior.ColorIndex = 15;
                    range.Font.Bold = true;
                    if (i == 5)
                    {
                        range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[2, i];
                        range.NumberFormatLocal = "@";
                    }
                }            //写入数值
                for (int r = 0; r < dt.Rows.Count; r++)
                {
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        if (dt.Columns[i].ColumnName == "报关" || dt.Columns[i].ColumnName == "三检" || dt.Columns[i].ColumnName == "其他" || dt.Columns[i].ColumnName == "合计")
                        {
                            //((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[r + 3, i + 1]).NumberFormatLocal = "$#,##0.00";//更改格式为文本格式
                            worksheet.Cells[r + 3, i + 1] = dt.Rows[r][i].ToString();
                            range = worksheet.get_Range("O"+(r+3).ToString(), System.Type.Missing);
                            range.Formula = "=SUM(L"+(r+3).ToString()+":N"+(r+3).ToString()+")";
                            range.Calculate();                        range = worksheet.get_Range("L" + (dt.Rows.Count - 1 + 3).ToString(), System.Type.Missing);
                            range.Formula = "=SUM(L3:L" + (dt.Rows.Count - 2 + 3).ToString() + ")";
                            range.Calculate();                        range = worksheet.get_Range("M" + (dt.Rows.Count - 1 + 3).ToString(), System.Type.Missing);
                            range.Formula = "=SUM(M3:M" + (dt.Rows.Count - 2 + 3).ToString() + ")";
                            range.Calculate();                        range = worksheet.get_Range("N" + (dt.Rows.Count - 1 + 3).ToString(), System.Type.Missing);
                            range.Formula = "=SUM(N3:N" + (dt.Rows.Count - 2 + 3).ToString() + ")";
                            range.Calculate();
                        }
                        else
                        {
                            ((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[r + 3, i + 1]).NumberFormatLocal = "@";//更改格式为文本格式
                            worksheet.Cells[r + 3, i + 1] = dt.Rows[r][i].ToString();
                        }
                    }
                }
                
                range = worksheet.get_Range(worksheet.Cells[2, 1], worksheet.Cells[dt.Rows.Count + 2, dt.Columns.Count]);
                range.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, null);
                if (dt.Rows.Count > 0)
                {
                    range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideHorizontal].ColorIndex = Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic;
                    range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideHorizontal].LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
                    range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideHorizontal].Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;
                }
                if (dt.Columns.Count > 1)
                {
                    range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideVertical].ColorIndex = Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic;
                    range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideVertical].LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
                    range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideVertical].Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;
                }
                range.EntireColumn.AutoFit();
                try
                {
                    workbook.Saved = true;
                    workbook.SaveCopyAs(saveFileName);//保存文件
                    return true;
                }
                catch (Exception ex)
                {
                    MessageBoxHepler.ShowErrorMsgBox("保存文件时出错,要保存的文件名错误或者文件可能正被打开!\r\n" + ex.Message);
                    return false;
                }
                finally
                {
                    //释放Excel对应的对象
                    if (range != null)
                    {
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
                        range = null;
                    }
                    if (worksheet != null)
                    {
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
                        worksheet = null;
                    }
                    if (workbook != null)
                    {
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
                        workbook = null;
                    }
                    if (workbooks != null)
                    {
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
                        workbooks = null;
                    }                // System.Diagnostics.Process excel = System.Diagnostics.Process.GetCurrentProcess();                xlApp.Application.Workbooks.Close();
                    xlApp.Quit();
                    if (xlApp != null)
                    {
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
                        KillSpecialExcel(xlApp);
                        xlApp = null;
                    }                GC.Collect();
                }
            }
      

  6.   


    用流可以的
    http://blog.csdn.net/happy09li/article/details/7431967
    +1我写的代码 就是 利用 你的 
    高手
      

  7.   


    用流可以的
    http://blog.csdn.net/happy09li/article/details/7431967我想问一下“ for(int i=0;i<fp2.Sheets [0].RowCount -1;i++)  ”
    的“fp2”是在哪来的?找不到啊!
      

  8.   


    用流可以的
    http://blog.csdn.net/happy09li/article/details/7431967我想问一下“ for(int i=0;i<fp2.Sheets [0].RowCount -1;i++)  ”
    的“fp2”是在哪来的?找不到啊! Excel.Workbook book
      

  9.   

      public static void DataToExcel(System.Data.DataTable dataTable)
            {
                try
                {
                    object missingValue = System.Reflection.Missing.Value;
                    Application excel = new Application();
                    excel.Visible = false;
                    _Workbook workBook = excel.Workbooks.Add(missingValue);
                    int excelRow = 0;
                    int excelColumn = 0;
                    for (int rowIndex = 0; rowIndex < dataTable.Rows.Count; rowIndex++)
                    {
                        for (int columnIndex = 0; columnIndex < dataTable.Columns.Count; columnIndex++)
                        {
                            excelRow = rowIndex + 1;
                            excelColumn = columnIndex + 1;
                            excel.Cells[excelRow, excelColumn] = dataTable.Rows[rowIndex][columnIndex];
                        }
                    }
                    workBook.SaveAs(@"D:\test.xls", missingValue, null, null, false, false, XlSaveAsAccessMode.xlNoChange, null, null, null, null);
                    workBook.Close(false, missingValue, missingValue);
                    excel.Quit();
                  
                }
                catch (Exception exception)
                {
                  
                }
            }