asp.net數據導出到excel表格,並設置表格樣式


1.首先在項目中添加引用

2.添加該COM組件后會再文件夾中出現一個Interop.Excel.dll的文件,將之前的Microsoft Excel 11.0 Object Library組件刪除,添加新的Interop.Excel.dll的引用。

然后添加excel的.net組件

3.現在開始貼代碼:

導出excel文件的樣式設計、保存、釋放資源都存放在一個Share.cs的類文件中

using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Excel;

#region 設置excel樣式並保存到PC
        /// <summary>
        /// 設置excel表格格式
        /// </summary>
        /// <param name="ksCell">開始列索引</param>
        /// <param name="jsCell">結束列索引</param>
        /// <param name="ksRow">開始行索引</param>
        /// <param name="jsRow">結束行索引</param>
        /// <param name="xls">Excel.Application對象</param>
        /// <param name="filepath">文件保存完整路徑</param>
        public static Excel.Application TableCss(int ksCell, int jsCell, int ksRow, int jsRow, Excel.Application xls)
        {
            //設置報表表格為最適應寬度
            //
            xls.Range[xls.Cells[ksRow, ksCell], xls.Cells[jsRow, jsCell]].Select();
            xls.Range[xls.Cells[ksRow, ksCell], xls.Cells[jsRow, jsCell]].Columns.AutoFit();
            //xls.Range[xls.Cells[ksRow, ksCell], xls.Cells[jsRow, jsCell]].Columns.Attributes.Add("style", "vnd.ms-excel.numberformat:@");
            
            //
            //設置整個報表的標題為跨列居中
            //
            xls.Range[xls.Cells[ksRow, ksCell], xls.Cells[jsRow, jsCell]].Select();
            xls.Range[xls.Cells[ksRow, ksCell], xls.Cells[jsRow, jsCell]].HorizontalAlignment = XlHAlign.xlHAlignCenter;
            //
            //繪制邊框
            //xSt.Range[xls.Cells[rowIndex, 1], xls.Cells[1, rowIndex]].Borders.LineStyle = 1;
            xls.Range[xls.Cells[jsRow, ksCell], xls.Cells[ksRow, ksCell]].Borders[XlBordersIndex.xlEdgeLeft].Weight = XlBorderWeight.xlThick;//設置左邊線加粗
            xls.Range[xls.Cells[ksRow, ksCell], xls.Cells[ksRow, jsCell]].Borders[XlBordersIndex.xlEdgeTop].Weight = XlBorderWeight.xlThick;//設置上邊線加粗
            xls.Range[xls.Cells[ksRow, jsCell], xls.Cells[jsRow, jsCell]].Borders[XlBordersIndex.xlEdgeRight].Weight = XlBorderWeight.xlThick;//設置右邊線加粗
            xls.Range[xls.Cells[jsRow, ksCell], xls.Cells[jsRow, jsCell]].Borders[XlBordersIndex.xlEdgeBottom].Weight = XlBorderWeight.xlThick;//設置下邊線加粗

            xls.Visible = false;
            return xls;
        }
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int/// <summary>
        /// 保存excel文件並結束當前EXCEL進程
        /// </summary>
        /// <param name="xls"></param>
        /// <param name="filepath"></param>
        public static void SaveExcel(Excel.Application xls, string filepath)
        {
            xls.ActiveWorkbook.SaveAs(filepath, Excel.XlFileFormat.xlExcel7, null, null, false, false, Excel.XlSaveAsAccessMode.xlNoChange, null, null, null, null, null);
            xls.Workbooks.Close();
            xls.Quit();
            IntPtr t = new IntPtr(xls.Hwnd); //得到這個句柄,具體作用是得到這塊內存入口
            int k = 0;
            GetWindowThreadProcessId(t, out k); //得到本進程唯一標志k
            System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k); //得到對進程k的引用
            p.Kill(); //關閉進程k 
            GC.Collect();
        }

#endregion

4.頁面導出代碼:

        #region 導出excel文件      /// <summary>
        /// 導出數據
        /// </summary>
        protected void btnPagedata_Click(object sender, EventArgs e)
        {
            try
            {
                string ddidlist = " 0,1,2,3,4 ";
                System.Data.DataTable ds = new BLL().GetList(" id in (" + ddidlist + ")").Tables[0];
                DoExport(ds, @"D:\" + DateTime.Now.ToString("yy-MM-dd") + "Excel.xls");
                ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript", "<script>alert('數據導出成功!');</script>");
            }
            catch
            {
                ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript", "<script>alert('數據導出失敗!');</script>");
            }
        }
        /// <summary>
        /// 導出excel文件
        /// </summary>
        /// <param name="ds"></param>
        /// <param name="FilePath"></param>
        private void DoExport(DataTable ds, string FilePath)
        {
            Excel.Application xls = new Excel.Application();
            int rowIndex = 1;
            //int ceelindex = 4;
            xls.Application.Workbooks.Add(true);
            if (ds.Rows.Count > 0)
            {
                xls.Cells[1] = "ID";
                xls.Cells[2] = "價格";
                xls.Cells[3] = "產品";
                xls.Cells[4] = "簡稱";
                xls.Cells[5] = "時間";
                xls.Cells.NumberFormat = "@";//防止存在超過11位的全數字的列在導入后會被用科學計數法顯示
                foreach (DataRow row in ds.Rows)
                {
                    rowIndex++;
                    xls.Cells[rowIndex, 1] = row["id"].ToString();
                    xls.Cells[rowIndex, 2] = row["ji"].ToString() + "RMB";
                    xls.Cells[rowIndex, 3] = row["cm"].ToString();
                    xls.Cells[rowIndex, 4] = row["ss"].ToString();
                    xls.Cells[rowIndex, 5] = row["time"].ToString();
                }
                Share.TableCss(1, 5, 1, rowIndex, xls);//設置excel邊框格式
                Share.SaveExcel(xls, FilePath);//保存excel文件,並且結束當前excel的進程
            }
        }
#endregion

 

使用該方法導出Excel文件必須要求服務器上安裝有最低office 2003的組件才能正常運行,不過也存在不需要引用的方式的方式輸出,比如直接編輯成html格式,還有種一個國外牛人寫的dll,可以達到與上面相同的效果導出excel不需要安裝office工具。

解決方案:首先下載MyXls.dll下載地址:http://sourceforge.net/projects/myxls/files/  。然后引用 dll。

不過這種方法自己還沒有使用過,所以暫時不能為大家貼出代碼。

如果大家對我代碼有什么不同的意見還希望能在下面留言

 

 


免責聲明!

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



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