print gridview to excel and print several tables to excel(one sheet)

            有两种方法对gridview进行Excel 输出,一种是gridview 自带的,不用对owc写任何操作,一种是针对microsoft office 的 owc 进行编程。
      
            下面先给出自带的实力,而且这种方法可以实现对gridview完全的打印,也就是说gridview 什么样(颜色,样式)就能打出什么样。

            
SaveExcel command and close view command;#region SaveExcel command and close view command;
    protected void cmdSaveExcel_Click(object sender, EventArgs e)
    {
        //当前视图保存到Excel
        Response.Clear();
        Response.Buffer = true;
        Response.Charset = "utf-8";
        Response.AppendHeader("Content-Disposition", "attachment;filename=FileName.xls");
        // 如果设置为 GetEncoding("GB2312");导出的文件将会出现乱码!!!
        Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");

        Response.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。 
        this.EnableViewState = false; 

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

        GridView1.RenderControl(oHtmlTextWriter);
        string strHtml = oStringWriter.ToString().Trim().Replace("<div>","").Replace("</div>","");
        //strHtml = strHtml.Replace("<Table>","").Replace("</Table>","");
        string strDate = ddlYear.SelectedItem.Text + ddlMonth.SelectedItem.Text + ddlDay.SelectedItem.Text;
        string ExcelFileName = strDate + TreeView1.SelectedNode.Text.Trim() + ".xls";
        string FilePhysicialPathName = Request.PhysicalApplicationPath + "/sharereport";
        //生成的Excel文件名
        string objectExcelFileName = Path.Combine(FilePhysicialPathName, ExcelFileName);
        if (File.Exists(objectExcelFileName))
        {
            File.Delete(objectExcelFileName);
        }
        strHtml = Server.HtmlDecode(strHtml.Replace("&nbsp;", ""));
        FileStream fs = new FileStream(objectExcelFileName, FileMode.Create, FileAccess.Write);
        BinaryWriter bw = new BinaryWriter(fs, System.Text.Encoding.GetEncoding("gb2312"));
        bw.Write(strHtml);
        bw.Flush();
        bw.Close();
        fs.Close();
        Page.RegisterClientScriptBlock("ExcelAlert", "<script>alert('保存成功,请在首页考核报表中查看。');</script>");
    }


            第二种方法就是打印绑定gridview的table,在这里为了节省,我就直接把打印n个表的类写在这了,道理是一样的。注意:其中的表都要有表名,和列的头名。

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using Excel = Microsoft.Office.Interop.Excel;

/// <summary>
/// SavaExcelToServer 的摘要说明
/// </summary>

public class SavaExcelToServer
{
    
private string m_strDirectory;//Excel文件夹
    private string m_strFileName;//Excel文件名
    private object[] m_ColumnHead;//表列头对象
    private DataTable[] m_dataTable;//导入Excel的表

    
/// <summary>
    
/// 构造函数
    
/// </summary>
    
/// <param name="strDirectory">存Excel的文件夹路径</param>
    
/// <param name="strFileName">存Excel文件名,Excel文件一定要放到strDirectory文件夹内</param>
    
/// <param name="strColName">列头名数组</param>

    public SavaExcelToServer(string strDirectory, string strFileName, DataTable[] dataTable)
    
{
        m_strDirectory 
= strDirectory;
        m_strFileName 
= strFileName;
        m_dataTable 
= dataTable;
        
        
if (!System.IO.Directory.Exists(m_strDirectory))
        
{
            Directory.CreateDirectory(m_strDirectory);
        }

        
if (File.Exists(Path.Combine(m_strDirectory, m_strFileName)))
        
{
            File.Delete(m_strDirectory 
+ "\\" + m_strFileName);
        }

    }


    
/// <summary>
    
/// 保存Excel
    
/// </summary>

    public bool SaveExcel()
    
{
        
int nCount = 0;     //所有表列的记数 
        int nRowCount = 0;  //行数量
        int m_ColCount = 0//列数量
        int nSeries = 0;    //数组维数
        string[] strColName;//表头名数组

        
object objValue = System.Type.Missing;
        
object A1;//Excel的列头对象
        object H1;//Excel的列头对象
        object A2;//Excel的行对象
        object H2;//Excel的行对象
        Excel.Application EApp;

        nSeries 
= m_dataTable.Length;
        
for (int i = 0; i < nSeries; i++)
        
{
            m_ColCount 
+= m_dataTable[i].Columns.Count;
        }

        m_ColumnHead 
= new object[m_ColCount];
        strColName 
= new string[m_ColCount];
        nRowCount 
= m_dataTable[0].Rows.Count;

        
for (int j = 0; j < nSeries; j++)
        
{
            
for (int k = 0; k < m_dataTable[j].Columns.Count; k++)
            
{
                
                    
try { strColName[nCount] = m_dataTable[j].Columns[k].Caption; }
                    
catch { strColName[nCount] = string.Empty; }
                    nCount
++;
                
            }

        }

        EApp 
= new Excel.ApplicationClass();

        
if (EApp == null)
        
{
            Console.WriteLine(
"不能打开Excel。");
            
return false;
        }

        
else
        
{
            Excel.Workbooks xlWookBooks 
= EApp.Workbooks;
            Excel.Workbook xlWorkBook 
= xlWookBooks.Add(true);//或者根据绝对路径打开工作簿文件a.xls     
            Excel.Worksheet xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets[1];

            
//对象变量初始化
            A1 = xlWorkSheet.Cells[11];
            H1 
= xlWorkSheet.Cells[1, m_ColCount];
            A2 
= xlWorkSheet.Cells[21];
            H2 
= xlWorkSheet.Cells[2, m_ColCount];

            Excel.Range Range 
= xlWorkSheet.get_Range(A1, H1);
            Range.Columns.HorizontalAlignment 
= 3;//value 水平居中

            
//设置Excle的表头

            
for (int k = 0; k < m_ColCount; k++)
            
{
                
try { m_ColumnHead[k] = (object)strColName[k]; }
                
catch { m_ColumnHead[k] = (object)string.Empty; }
            }

            Range.Value2 
= m_ColumnHead;

            
//向Excel中写入数据
            Range = xlWorkSheet.get_Range(A2, H2);
            
object[,] ColumnData = new object[nRowCount, m_ColCount];

            
for (int n = 0; n < nRowCount; n++)
            
{
                
int nCountTemp = 0;
                
for (int i = 0; i < nSeries; i++)
                
{
                    
for (int j = 0; j < m_dataTable[i].Columns.Count; j++)
                    
{
                        

                        

                            
try { ColumnData[n, nCountTemp] = m_dataTable[i].Rows[n][j]; }
                            
catch { ColumnData[n, nCountTemp] = string.Empty; }
                            nCountTemp
++;
                        

                    }

                }

            }

            Range 
= Range.get_Resize(nRowCount, m_ColCount);
            Range.Value2 
= ColumnData;
            
//设置Excel的属性
            Range.Interior.ColorIndex = 0//设置其Excel的背景颜色
            Range.Columns.HorizontalAlignment = 3//value 水平居中
            Range.Cells.EntireColumn.AutoFit();//.ColumnWidth = 20; //Excel的表格宽度

            
//保存Excel文件
            EApp.Visible = false;
            EApp.UserControl 
= false;
            EApp.DisplayAlerts 
= false;
            xlWorkBook.Saved 
= true;
            
//EApp.ActiveWorkbook.SaveCopyAs(a);
            xlWorkBook.SaveCopyAs(m_strDirectory + "\\" + m_strFileName);
            
            
//释放资源
            xlWorkBook.Close(false, Type.Missing, Type.Missing);
            EApp.Quit();
            
return true;
        }

    }

}





posted on 2007-04-26 18:45  执法长老  阅读(556)  评论(0编辑  收藏  举报

导航