关于Gridview中使用控件和图片导出到Excel的处理

来源:互联网 发布:淘宝客推广视频 编辑:程序博客网 时间:2024/05/16 10:55

首先是大家在网上能搜索一箩筐的仅导出数据的做法:view plaincopy to clipboardprint?
public static void Export(Page pg, GridView gv,bool alowPage, string FileName)  
        {  
            pg.Response.Clear();  
            pg.Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8");  
            pg.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, Encoding.UTF8).ToString());  
            pg.Response.ContentEncoding = System.Text.Encoding.UTF8;  
            pg.Response.ContentType = "application/vnd.ms-excel";//设置输出文件类型为excel文件。   
            pg.Response.Charset = "";  
 
            System.IO.StringWriter oStringWriter = new System.IO.StringWriter();  
            System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);  
            if (!alowPage)  
 
           {  
 
                  gv.AllowPaging = false;  
                  gv.DataBind();  
 
            }  
            gv.RenderControl(oHtmlTextWriter);                  
            pg.Response.Output.Write(oStringWriter.ToString());  
            pg.Response.End();  
 
            if (!alowPage)  
            {  
                gv.AllowPaging = true;  
            }  
        }  
public static void Export(Page pg, GridView gv,bool alowPage, string FileName)
        {
            pg.Response.Clear();
            pg.Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8");
            pg.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, Encoding.UTF8).ToString());
            pg.Response.ContentEncoding = System.Text.Encoding.UTF8;
            pg.Response.ContentType = "application/vnd.ms-excel";//设置输出文件类型为excel文件。
            pg.Response.Charset = "";

            System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
            System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
            if (!alowPage)

           {

                  gv.AllowPaging = false;
                  gv.DataBind();

            }
            gv.RenderControl(oHtmlTextWriter);               
            pg.Response.Output.Write(oStringWriter.ToString());
            pg.Response.End();

            if (!alowPage)
            {
                gv.AllowPaging = true;
            }
        }

 

这个可以处理导出当前页或导出所有数据。但是如果Gridview中包含图片列则就没有用了。经过网上查阅资料自己做了一个可以导出图片的方法,code如下:(以下代码仅供参考,有更好方法的共享下。)

view plaincopy to clipboardprint?
public static Excel.Application app;  
        public static Excel.Worksheet workSheet;  
        public static Excel.Workbook workBook;  
        public static string fileName = string.Empty;  
 
        //单元格列号数组  
        private static string[] colString = new string[26] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };  
 
        /// <summary>  
        /// 将GridView数据写入Excel文件(自动分页)  
        /// </summary>  
        /// <param name="pag">Page</param>  
        /// <param name="gv">GridView</param>  
        /// <param name="rows">每个WorkSheet写入多少行数据</param>  
        /// <param name="top">表格数据起始行索引</param>  
        /// <param name="left">表格数据起始列索引</param>  
        /// <param name="coluwidth">每列数据的宽度</param>  
        public static void DataTableToExcel(Page pag, GridView gv, int rows, int top, int left,int[] coluwidth)  
        {  
            app = new Excel.Application();  
            app.Visible = false;  
            app.DisplayAlerts = false;  
            workBook = app.Workbooks.Add(Type.Missing);  
            int rowCount = gv.Rows.Count;  //DataTable行数  
            int colCount = gv.Columns.Count; //DataTable列数  
            int sheetCount = GetSheetCount(rowCount, rows); //WorkSheet个数  
 
            //复制sheetCount-1个WorkSheet对象  
            for (int i = 1; i < sheetCount; i++)  
            {  
                workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);  
                workSheet.Copy(Missing.Value, workBook.Worksheets[i]);  
            }  
 
            for (int i = 1; i <= sheetCount; i++)  
            {  
                int startRow = (i - 1) * rows;  //记录起始行索引  
                int endRow = i * rows;   //记录结束行索引  
 
                //若是最后一个WorkSheet,那么记录结束行索引为源DataTable行数  
                if (i == sheetCount)  
                    endRow = rowCount;  
 
                //获取要写入数据的WorkSheet对象,并重命名  
                workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);  
                workSheet.Name = "页-" + i.ToString();  
 
                GridViewRow headrow = gv.HeaderRow;  
                for (int h = 0; h < colCount; h++)//导出Gridview头部  
                {  
                    Excel.Range range1 = GetRang(h + 1, 0);  
                    range1.Font.Bold = 1;  
                    range1.Value2 = headrow.Cells[h].Text;  
                }  
 
                //将gv中的数据写入WorkSheet  
                for (int j = 1; j <= endRow - startRow; j++)  
                {  
                    if (rowCount < j)  
                        break;  
                    for (int k = 0; k < colCount; k++)  
                    {  
                        if (gv.Rows[startRow + j - 1].Cells[k].HasControls())  
                        {  
                            Hashtable ht = GetControlNameAndType(gv, startRow + j - 1, k);  
                            if (ht.Count > 0)  
                            {  
                                string value = string.Empty;  
                                bool isImg = false;  
                                foreach (DictionaryEntry de in ht)  
                                {   
                                    string []temp = de.Value.ToString().Split(',');  
                                    if (temp[0] == "Image")  
                                    {  
                                        isImg = true;  
                                        if (!AddImage(pag, temp[1], temp[2])) workSheet.Cells[top + j, left + k] = "未知图片";  
                                    }  
                                    else 
                                    {  
                                        isImg = false;  
                                        value += temp[1]+"  ";  
                                    }                                      
                                }  
                                if(!isImg)  
                                    workSheet.Cells[top + j, left + k] = value;  
                            }  
                        }  
                        else 
                            workSheet.Cells[top + j, left + k] = gv.Rows[startRow + j - 1].Cells[k].Text;  
                    }  
                }  
 
                if (gv.ShowFooter == true)//导出Gridview的footer  
                {  
                    GridViewRow footrow = gv.FooterRow;  
                    for (int h = 0; h < colCount; h++)  
                    {  
                        Excel.Range range1 = GetRang(h + 1, gv.Rows.Count + 1);  
                        range1.Font.Bold = 1;  
                        if (footrow.Cells[h].Text != null && footrow.Cells[h].Text != " ")  
                            range1.Value2 = footrow.Cells[h].Text;  
                    }  
                }  
                SetColumnStyle(gv.Columns.Count, gv.Rows.Count, workSheet, coluwidth);//设置样式  
            }  
 
            bool result = true;  
            string realSavePath = SaveFile(pag, out result);  
            if (realSavePath != "" && result)  
            {  
                Export(pag,realSavePath);  
            }  
            else 
                pag.Response.Write("<mce:script type="text/javascript"><!--  
alert('导出失败!//n错误原因:" + realSavePath.Replace("//", "////") + "');  
// --></mce:script>");  
        }  
 
        //为用户提供导出的Excel文件的下载  
        private static void Export(Page pg,string path)  
        {  
            FileInfo file = new FileInfo(path);  
            if (file.Exists)  
            {  
                pg.Response.Clear();  
                pg.Response.ClearHeaders();  
                pg.Response.Buffer = true;  
                pg.Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-7");  
                pg.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(path.Substring(path.LastIndexOf("//") + 1), Encoding.UTF8).ToString());  
                pg.Response.ContentEncoding = System.Text.Encoding.UTF7;  
                pg.Response.ContentType = "application/octet-stream";//设置输出文件类型为excel文件。   
                pg.Response.Charset = "";  
                pg.Response.WriteFile(file.FullName);  
                pg.Response.Flush();  
                file.Delete();//下载完成后删除文件  
                pg.Response.Write("<mce:script type="text/javascript"><!--  
window.close();  
// --></mce:script>");//自动关闭下载浏览器,防止用户手动关闭中断下载进程引起的文件没有删除  
                pg.Response.End();                  
            }  
            else 
                pg.Response.Write("<mce:script type="text/javascript"><!--  
alert('导出失败!//n错误原因:" + path.Replace("//", "////") + "');  
// --></mce:script>");  
        }  
 
        //制作缩微图并导出图片到Excel  
        public static bool AddImage(Page pag,string url,string rangeName)  
        {  
            bool findImage = false;  
            string path = pag.Server.MapPath(url);  
            System.IO.FileInfo file = new System.IO.FileInfo(path);  
            if (file.Exists)  
            {  
                string savapath = "C://WINDOWS//Temp" + path.Substring(path.LastIndexOf("//"));  
                System.IO.FileInfo file2 = new System.IO.FileInfo(savapath);  
                if (file2.Exists)  
                    file2.Delete();  
                ReturnValue val = ADOnline.Common.CommonImage.CreateAndSaveSmallImage(path, 80, 50, savapath);  
                if (val == ReturnValue.SUCCEED)  
                {  
                    InsertPicture(rangeName, savapath, 80, 50);  
                    findImage = true;  
                }  
            }  
            return findImage;  
        }  
 
        //获取Gridview每列中的所有显示控件名称、类型和值  
        public static Hashtable GetControlNameAndType(GridView gv,int row,int cell)  
        {   
            Hashtable ht = new Hashtable();  
            if (gv.Rows[row].Cells[cell].Controls.Count > 0)  
            {  
                for (int i = 0; i < gv.Rows[row].Cells[cell].Controls.Count; i++)  
                {  
                    Control temp = gv.Rows[row].Cells[cell].Controls[i];  
                    if (temp.GetType() == typeof(Label) && temp.Visible==true)  
                        ht.Add(temp.ID, "Lable," + (temp as Label).Text + "," + colString[cell] + Convert.ToString(row + 2));  
                    else if (temp.GetType() == typeof(DropDownList) && temp.Visible != false)  
                        ht.Add(temp.ID, "DropDownList," + (temp as DropDownList).SelectedItem.Text + "," + colString[cell]+Convert.ToString(row+2));  
                    else if (temp.GetType() == typeof(LinkButton) && temp.Visible != false)  
                        ht.Add(temp.ID, "LinkButton," + (temp as LinkButton).Text + "," + colString[cell] + Convert.ToString(row + 2));  
                    else if (temp.GetType() == typeof(CheckBox) && temp.Visible != false)  
                        ht.Add(temp.ID, "CheckBox," + ((temp as CheckBox).Checked==true ? "true" : "false") + "," + colString[cell] + Convert.ToString(row + 2));  
                    else if (temp.GetType() == typeof(Image) && temp.Visible != false)  
                        ht.Add(temp.ID, "Image," + (temp as Image).ImageUrl + "," + colString[cell] + Convert.ToString(row + 2));  
                }  
            }  
            return ht;  
        }  
 
        //设置格式  
        public static void SetColumnStyle(int colCount, int row, Excel.Worksheet ws, int[] coluwidth)  
        {  
            for (int i = 1; i <= colCount; i++)  
            {  
                Excel.Range ran = ws.get_Range(ws.Cells[1, i], ws.Cells[row + 2, i]);  
                //ran.Select();  
                ran.WrapText = true;  
                ran.ColumnWidth = Convert.ToString(coluwidth[i - 1]);  
                  
                ran.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;  
                ran.Borders.LineStyle = 1;  
                if (i == 3)  
                    ran.RowHeight = Convert.ToString(51);  
            }  
        }  
 
 
        //插入图片到Excel  
        public static void InsertPicture(string RangeName, string PicturePath, float PictuteWidth, float PictureHeight)  
        {  
            Excel.Range rangeTemp = workSheet.get_Range(RangeName, Missing.Value);  
            rangeTemp.Select();  
            float PicLeft, PicTop;  
            PicLeft = Convert.ToSingle(rangeTemp.Left)+2;  
            PicTop = Convert.ToSingle(rangeTemp.Top) + 1;  
            rangeTemp.ColumnWidth = Convert.ToString(15);  
            rangeTemp.RowHeight = Convert.ToString(51);  
            workSheet.Shapes.AddPicture(PicturePath, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoTrue, PicLeft, PicTop, 87, 50);  
        }  
 
        /// <summary>  
        /// 计算WorkSheet数量  
        /// </summary>  
        /// <param name="rowCount">记录总行数</param>  
        /// <param name="rows">每WorkSheet行数</param>  
        public static int GetSheetCount(int rowCount, int rows)  
        {  
            int n = rowCount % rows;  //余数  
 
            if (n == 0)  
                return rowCount / rows;  
            else 
                return Convert.ToInt32(rowCount / rows) + 1;  
        }  
 
        //获取指定单元格  
        public static Excel.Range GetRang(int curColum, int rowNum)  
        {  
            if (curColum < 0 || curColum > 255)  
                throw new Exception("列号出错!");  
            string rangName = string.Empty;  
            if (curColum <= 26)  
                rangName = colString[curColum - 1] + Convert.ToString(rowNum+1);  
            else 
            {  
                int colNum = curColum / 26;  
                int temp = curColum % 26;  
                if (temp == 0)  
                    rangName = colString[colNum - 1] + colString[25] + Convert.ToString(rowNum + 1);  
                else 
                    rangName = colString[colNum] + colString[temp - 1] + Convert.ToString(rowNum + 1);  
            }  
            return workSheet.get_Range(rangName, System.Reflection.Missing.Value);   
        }  
 
        /// <summary>  
        /// 保存文件  
        /// </summary>  
        public static string SaveFile(Page pag,out bool result)  
        {  
            string defaultPath = pag.Server.MapPath("~/Record/ExcelReportTempFolder/") + GetFileName();  
            result = true;  
 
            try 
            {  
                workBook.SaveAs(defaultPath, Missing.Value, Missing.Value,  
                  Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange,  
                  Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);  
            }  
            catch (Exception ex)  
            {  
                result = false;  
                defaultPath = ex.ToString();  
            }  
 
            Close();  
            Dispose();  
            return defaultPath;  
        }  
 
        //获取文件名称  
        private static string GetFileName()  
        {  
            if (fileName == null || fileName.Trim() == "")  
                return (DateTime.Now.ToString().Replace(':', '-') + "_report.xls");  
            else if (fileName.LastIndexOf('.') == -1)  
                return fileName + ".xls";  
            else if (fileName.Substring(fileName.LastIndexOf('.')) != ".xls")  
                return fileName.Substring(0, fileName.LastIndexOf('.')) + ".xls";  
            else 
                return fileName;  
        }  
 
        /// <summary>  
        /// 关闭应用程序  
        /// </summary>  
        private static void Close()  
        {  
            workBook.Close(false, Missing.Value, Missing.Value);  
            app.Quit();  
        }  
 
        /// <summary>  
        /// 释放所引用的COM对象。  
        /// </summary>  
        public static void Dispose()  
        {  
            ReleaseObj(workSheet);  
            ReleaseObj(workBook);  
            ReleaseObj(app);  
            app = null;  
            System.GC.Collect();  
            System.GC.WaitForPendingFinalizers();  
        }  
 
        /// <summary>  
        /// 释放对象,内部调用  
        /// </summary>  
        /// <param name="o"></param>  
        private static void ReleaseObj(object o)  
        {  
            try 
            {  
                System.Runtime.InteropServices.Marshal.ReleaseComObject(o);  
            }  
            catch { }  
            finally { o = null; }  
        } 
public static Excel.Application app;
        public static Excel.Worksheet workSheet;
        public static Excel.Workbook workBook;
        public static string fileName = string.Empty;

        //单元格列号数组
        private static string[] colString = new string[26] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };

        /// <summary>
        /// 将GridView数据写入Excel文件(自动分页)
        /// </summary>
        /// <param name="pag">Page</param>
        /// <param name="gv">GridView</param>
        /// <param name="rows">每个WorkSheet写入多少行数据</param>
        /// <param name="top">表格数据起始行索引</param>
        /// <param name="left">表格数据起始列索引</param>
        /// <param name="coluwidth">每列数据的宽度</param>
        public static void DataTableToExcel(Page pag, GridView gv, int rows, int top, int left,int[] coluwidth)
        {
            app = new Excel.Application();
            app.Visible = false;
            app.DisplayAlerts = false;
            workBook = app.Workbooks.Add(Type.Missing);
            int rowCount = gv.Rows.Count;  //DataTable行数
            int colCount = gv.Columns.Count; //DataTable列数
            int sheetCount = GetSheetCount(rowCount, rows); //WorkSheet个数

            //复制sheetCount-1个WorkSheet对象
            for (int i = 1; i < sheetCount; i++)
            {
                workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);
                workSheet.Copy(Missing.Value, workBook.Worksheets[i]);
            }

            for (int i = 1; i <= sheetCount; i++)
            {
                int startRow = (i - 1) * rows;  //记录起始行索引
                int endRow = i * rows;   //记录结束行索引

                //若是最后一个WorkSheet,那么记录结束行索引为源DataTable行数
                if (i == sheetCount)
                    endRow = rowCount;

                //获取要写入数据的WorkSheet对象,并重命名
                workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);
                workSheet.Name = "页-" + i.ToString();

                GridViewRow headrow = gv.HeaderRow;
                for (int h = 0; h < colCount; h++)//导出Gridview头部
                {
                    Excel.Range range1 = GetRang(h + 1, 0);
                    range1.Font.Bold = 1;
                    range1.Value2 = headrow.Cells[h].Text;
                }

                //将gv中的数据写入WorkSheet
                for (int j = 1; j <= endRow - startRow; j++)
                {
                    if (rowCount < j)
                        break;
                    for (int k = 0; k < colCount; k++)
                    {
                        if (gv.Rows[startRow + j - 1].Cells[k].HasControls())
                        {
                            Hashtable ht = GetControlNameAndType(gv, startRow + j - 1, k);
                            if (ht.Count > 0)
                            {
                                string value = string.Empty;
                                bool isImg = false;
                                foreach (DictionaryEntry de in ht)
                                {
                                    string []temp = de.Value.ToString().Split(',');
                                    if (temp[0] == "Image")
                                    {
                                        isImg = true;
                                        if (!AddImage(pag, temp[1], temp[2])) workSheet.Cells[top + j, left + k] = "未知图片";
                                    }
                                    else
                                    {
                                        isImg = false;
                                        value += temp[1]+"  ";
                                    }                                   
                                }
                                if(!isImg)
                                    workSheet.Cells[top + j, left + k] = value;
                            }
                        }
                        else
                            workSheet.Cells[top + j, left + k] = gv.Rows[startRow + j - 1].Cells[k].Text;
                    }
                }

                if (gv.ShowFooter == true)//导出Gridview的footer
                {
                    GridViewRow footrow = gv.FooterRow;
                    for (int h = 0; h < colCount; h++)
                    {
                        Excel.Range range1 = GetRang(h + 1, gv.Rows.Count + 1);
                        range1.Font.Bold = 1;
                        if (footrow.Cells[h].Text != null && footrow.Cells[h].Text != " ")
                            range1.Value2 = footrow.Cells[h].Text;
                    }
                }
                SetColumnStyle(gv.Columns.Count, gv.Rows.Count, workSheet, coluwidth);//设置样式
            }

            bool result = true;
            string realSavePath = SaveFile(pag, out result);
            if (realSavePath != "" && result)
            {
                Export(pag,realSavePath);
            }
            else
                pag.Response.Write("<mce:script type="text/javascript"><!--
alert('导出失败!//n错误原因:" + realSavePath.Replace("//", "////") + "');
// --></mce:script>");
        }

        //为用户提供导出的Excel文件的下载
        private static void Export(Page pg,string path)
        {
            FileInfo file = new FileInfo(path);
            if (file.Exists)
            {
                pg.Response.Clear();
                pg.Response.ClearHeaders();
                pg.Response.Buffer = true;
                pg.Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-7");
                pg.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(path.Substring(path.LastIndexOf("//") + 1), Encoding.UTF8).ToString());
                pg.Response.ContentEncoding = System.Text.Encoding.UTF7;
                pg.Response.ContentType = "application/octet-stream";//设置输出文件类型为excel文件。
                pg.Response.Charset = "";
                pg.Response.WriteFile(file.FullName);
                pg.Response.Flush();
                file.Delete();//下载完成后删除文件
                pg.Response.Write("<mce:script type="text/javascript"><!--
window.close();
// --></mce:script>");//自动关闭下载浏览器,防止用户手动关闭中断下载进程引起的文件没有删除
                pg.Response.End();               
            }
            else
                pg.Response.Write("<mce:script type="text/javascript"><!--
alert('导出失败!//n错误原因:" + path.Replace("//", "////") + "');
// --></mce:script>");
        }

        //制作缩微图并导出图片到Excel
        public static bool AddImage(Page pag,string url,string rangeName)
        {
            bool findImage = false;
            string path = pag.Server.MapPath(url);
            System.IO.FileInfo file = new System.IO.FileInfo(path);
            if (file.Exists)
            {
                string savapath = "C://WINDOWS//Temp" + path.Substring(path.LastIndexOf("//"));
                System.IO.FileInfo file2 = new System.IO.FileInfo(savapath);
                if (file2.Exists)
                    file2.Delete();
                ReturnValue val = ADOnline.Common.CommonImage.CreateAndSaveSmallImage(path, 80, 50, savapath);
                if (val == ReturnValue.SUCCEED)
                {
                    InsertPicture(rangeName, savapath, 80, 50);
                    findImage = true;
                }
            }
            return findImage;
        }

        //获取Gridview每列中的所有显示控件名称、类型和值
        public static Hashtable GetControlNameAndType(GridView gv,int row,int cell)
        {
            Hashtable ht = new Hashtable();
            if (gv.Rows[row].Cells[cell].Controls.Count > 0)
            {
                for (int i = 0; i < gv.Rows[row].Cells[cell].Controls.Count; i++)
                {
                    Control temp = gv.Rows[row].Cells[cell].Controls[i];
                    if (temp.GetType() == typeof(Label) && temp.Visible==true)
                        ht.Add(temp.ID, "Lable," + (temp as Label).Text + "," + colString[cell] + Convert.ToString(row + 2));
                    else if (temp.GetType() == typeof(DropDownList) && temp.Visible != false)
                        ht.Add(temp.ID, "DropDownList," + (temp as DropDownList).SelectedItem.Text + "," + colString[cell]+Convert.ToString(row+2));
                    else if (temp.GetType() == typeof(LinkButton) && temp.Visible != false)
                        ht.Add(temp.ID, "LinkButton," + (temp as LinkButton).Text + "," + colString[cell] + Convert.ToString(row + 2));
                    else if (temp.GetType() == typeof(CheckBox) && temp.Visible != false)
                        ht.Add(temp.ID, "CheckBox," + ((temp as CheckBox).Checked==true ? "true" : "false") + "," + colString[cell] + Convert.ToString(row + 2));
                    else if (temp.GetType() == typeof(Image) && temp.Visible != false)
                        ht.Add(temp.ID, "Image," + (temp as Image).ImageUrl + "," + colString[cell] + Convert.ToString(row + 2));
                }
            }
            return ht;
        }

        //设置格式
        public static void SetColumnStyle(int colCount, int row, Excel.Worksheet ws, int[] coluwidth)
        {
            for (int i = 1; i <= colCount; i++)
            {
                Excel.Range ran = ws.get_Range(ws.Cells[1, i], ws.Cells[row + 2, i]);
                //ran.Select();
                ran.WrapText = true;
                ran.ColumnWidth = Convert.ToString(coluwidth[i - 1]);
               
                ran.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                ran.Borders.LineStyle = 1;
                if (i == 3)
                    ran.RowHeight = Convert.ToString(51);
            }
        }


        //插入图片到Excel
        public static void InsertPicture(string RangeName, string PicturePath, float PictuteWidth, float PictureHeight)
        {
            Excel.Range rangeTemp = workSheet.get_Range(RangeName, Missing.Value);
            rangeTemp.Select();
            float PicLeft, PicTop;
            PicLeft = Convert.ToSingle(rangeTemp.Left)+2;
            PicTop = Convert.ToSingle(rangeTemp.Top) + 1;
            rangeTemp.ColumnWidth = Convert.ToString(15);
            rangeTemp.RowHeight = Convert.ToString(51);
            workSheet.Shapes.AddPicture(PicturePath, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoTrue, PicLeft, PicTop, 87, 50);
        }

        /// <summary>
        /// 计算WorkSheet数量
        /// </summary>
        /// <param name="rowCount">记录总行数</param>
        /// <param name="rows">每WorkSheet行数</param>
        public static int GetSheetCount(int rowCount, int rows)
        {
            int n = rowCount % rows;  //余数

            if (n == 0)
                return rowCount / rows;
            else
                return Convert.ToInt32(rowCount / rows) + 1;
        }

        //获取指定单元格
        public static Excel.Range GetRang(int curColum, int rowNum)
        {
            if (curColum < 0 || curColum > 255)
                throw new Exception("列号出错!");
            string rangName = string.Empty;
            if (curColum <= 26)
                rangName = colString[curColum - 1] + Convert.ToString(rowNum+1);
            else
            {
                int colNum = curColum / 26;
                int temp = curColum % 26;
                if (temp == 0)
                    rangName = colString[colNum - 1] + colString[25] + Convert.ToString(rowNum + 1);
                else
                    rangName = colString[colNum] + colString[temp - 1] + Convert.ToString(rowNum + 1);
            }
            return workSheet.get_Range(rangName, System.Reflection.Missing.Value);
        }

        /// <summary>
        /// 保存文件
        /// </summary>
        public static string SaveFile(Page pag,out bool result)
        {
            string defaultPath = pag.Server.MapPath("~/Record/ExcelReportTempFolder/") + GetFileName();
            result = true;

            try
            {
                workBook.SaveAs(defaultPath, Missing.Value, Missing.Value,
                  Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange,
                  Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
            }
            catch (Exception ex)
            {
                result = false;
                defaultPath = ex.ToString();
            }

            Close();
            Dispose();
            return defaultPath;
        }

        //获取文件名称
        private static string GetFileName()
        {
            if (fileName == null || fileName.Trim() == "")
                return (DateTime.Now.ToString().Replace(':', '-') + "_report.xls");
            else if (fileName.LastIndexOf('.') == -1)
                return fileName + ".xls";
            else if (fileName.Substring(fileName.LastIndexOf('.')) != ".xls")
                return fileName.Substring(0, fileName.LastIndexOf('.')) + ".xls";
            else
                return fileName;
        }

        /// <summary>
        /// 关闭应用程序
        /// </summary>
        private static void Close()
        {
            workBook.Close(false, Missing.Value, Missing.Value);
            app.Quit();
        }

        /// <summary>
        /// 释放所引用的COM对象。
        /// </summary>
        public static void Dispose()
        {
            ReleaseObj(workSheet);
            ReleaseObj(workBook);
            ReleaseObj(app);
            app = null;
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
        }

        /// <summary>
        /// 释放对象,内部调用
        /// </summary>
        /// <param name="o"></param>
        private static void ReleaseObj(object o)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
            }
            catch { }
            finally { o = null; }
        }

 

该方法提供了获取单元格、设置格式、判断Gridview中的数据、分页、保存零时文件并下载等功能。仅为一个测试代码。可以根据自己的需求来完善。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Rock870210/archive/2009/09/26/4598173.aspx

原创粉丝点击