讓多個DataTable中的數據導入到一個excel中sheet中


一、需求

    遇到這樣一個需求,主管要對多個客服的工作質量審核,要求審核完成后,對應的客服的好中差評的審核結果對應到一個表格的不同sheet單元表中。

二、思路

    先聲明一個DataSet,把每個客服的DataTable通過DataSet的Add方法來添加進來,並且把每個表的名字命名為客服的名字(通過TableName方法實現),然后通過遍歷DataSet的每個表以及每個表的行列來添加到Excel里面,在把數據保存到服務器上,然后把Exce文件下載下來,最后刪除Excel文件。

三、准備

    運用到一個dll,在設計導出類之前,先引入dll(我會把dll 共享一下,注意其版本,我用的是10.0),下載地址:

    http://files.cnblogs.com/lzhp/microsoft.office.interop.excel%E5%90%84%E4%B8%AA%E7%89%88%E6%9C%AC.7z

    ,以及命名空間:                        

using System.IO;
using Microsoft.Office.Interop.Excel;
using System.Reflection;

 

四、主要代碼

    只要列出導出Excel的方法

    #region Excel導出多個客服,不同的客服在不同的sheet里

    public static void ToManySheetExcel(DataSet ds, string strExcelFileName, System.Web.UI.Page page)
    {
        Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
        string path = "";
        if (excel == null)
        {
            MessageBox.Show("無法創建Excel對象,可能您的機子未安裝Excel");
            return;
        }
        try
        {
          excel.Visible = false;
            //設置禁止彈出保存和覆蓋的詢問提示框
            excel.DisplayAlerts = false;
          excel.AlertBeforeOverwriting = true;
            //增加一個工作簿
            Workbook book = excel.Workbooks.Add(true);
            //添加工作表         其中ds.Tables.Count.ToString()為要創建的sheet的個數
            Worksheet sheets = (Microsoft.Office.Interop.Excel.Worksheet)
                book.Worksheets.Add(Missing.Value, Missing.Value, Convert.ToInt32(ds.Tables.Count.ToString()), Microsoft.Office.Interop.Excel.XlSheetType.xlWorksheet);
            //開始遍歷ds中的各個dataTable
            for (int i = 0; i < ds.Tables.Count; i++)
            {
                System.Data.DataTable table = ds.Tables[i];
                //HttpContext.Current.Response.Write(ds.Tables[0].Rows[0][0].ToString() + "<p/>");
                //獲取一個工作表
                Worksheet sheet = book.Worksheets[i + 1] as Worksheet;
                int rowIndex = 1;
                int colIndex = 0;
                //為各個sheet添加列名
                foreach (DataColumn col in table.Columns)
                {
                    colIndex++;
                    sheet.Cells[1, colIndex] = col.ColumnName;
                }
                //開始添加數據
                foreach (DataRow row in table.Rows)
                {
                    rowIndex++;
                    colIndex = 0;
                    foreach (DataColumn col in table.Columns)
                    {
                        colIndex++;
                        //控制excel格式
                        String typeName = row[col.ColumnName].GetType().ToString();
                        sheet.Cells[rowIndex, colIndex] = typeCheckAdd(row[col.ColumnName].ToString(), typeName);
                    }
                }
                //將各個sheet的名字改為datatable.TableName
                sheet.Name =ds.Tables[i].TableName.ToString();
            }

            //刪除多余Sheet
            for (int g = 1; g <= book.Worksheets.Count; g++)
            {
                Worksheet sheet = book.Worksheets[g] as Worksheet;
                if (Convert.ToInt32(sheet.Name.Length.ToString())>5&&sheet.Name.Substring(0, 5) == "Sheet")
                {
                    sheet.Delete();
                    g--;
                }
            }
            path = page.Server.MapPath("../") + @"9_Tool/" + strExcelFileName + ".xls";

            //book.Save();
            book.SaveAs(path, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
            book.Close();// 注意關閉,如果不關閉,執行的時間會出現 另一個進程在使用此文件
            excel.Quit();
            excel = null;
            GC.Collect();

           //准備把文件轉化成二進制文件下載下來並刪除服務器上的那個Excel文件              
            FileStream fs = new FileStream(path, FileMode.Open);
            byte[] bytes = new byte[(int)fs.Length];
            fs.Read(bytes, 0, bytes.Length);
            fs.Close();
            File.Delete(path);
            page.Response.ContentType = "application/octet-stream";
            //通知瀏覽器下載文件而不是打開
            page.Response.AddHeader("Content-Disposition", "attachment;  filename=" + HttpUtility.UrlEncode(DateTime.Now.ToString("yyyyMMddHHmmssffff") + "客服審評表.xls"));
            page.Response.BinaryWrite(bytes);
            page.Response.Flush();
            page.Response.End();


        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }
    }
    #region 用來處理excel的異常顯示,有必要的話可以可以添加
    public static String typeCheckAdd(String cellContent, String strType)
    {
        String cellContentAdd;
        
        switch (strType)
        {
            case "System.Int64":
                cellContentAdd = "'" + cellContent;
                break;
            case "System.DateTime":
                cellContentAdd = (Convert.ToDateTime(cellContent)).ToString("MM-dd"); 
                break;
            default:
                cellContentAdd = cellContent;
                break;
        }
        return cellContentAdd;
    }


    #endregion

五、總結

    對於導出Excel,本方法還是比較慢的,還有下載時間,只能對於比較小的文件來使用,還有一種方法是操作Xml,具體實現方法可以先在網上搜索一下,有時間補上。

    希望本文能給你帶來幫助,謝謝閱讀,歡迎大家指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM