web页面嵌入excel(一)

写这篇文章之前,先提几个问题,希望高手留言指点、讨论:

1、 水晶报表(Crystal Reports)的表头能不能冻结,即:记录多的时候,记录翻页而报表的头部持久显示;如果能怎么实现。

2、 水晶报表在设计的时候表头字段是拖上去的,如果要做一个报表定制工具,这个表头能用程序控制吗?(非vs2005自带的水晶报表)

3、 OWC组建在用vs2005做Web开发的时候为什么添加不到工具栏,而vs2003可以,vs2005的Winform程序也可以。

正是前面提到的问题1和问题2无法解决,现在要把整个系统中的水晶报表换成用Excel实现,Excel实现也存在一些问题,有难度,首先是报表表头的样式的控制,当然这我们可以用宏,但宏是不安全的,所有人都知道,不用宏就只能用VBA语句了,这个对我来说是比较陌生;其次是数据的统计和图表的显示;最后就是用户根据需求自行定制报表,这个灵活性太大,整个模型中数据表就近400张,组织管理细节太多。

先完成了一个小试验,分享一下吧,试验的内容包括:

1、 用简单的VBA语句给Excel中写数据。

2、 将Excel放置在Web页面上来操作。

3、 通过不同框架传值来更新Web页面上的Excel数据内容。

4、 控制输出上下标格式的数据。

5、 更新Excel内容时强制结束前一个Excel进程(同时也会结束用户进程,是本实例的一个bug)。

步骤: 
  一、新建一个asp.net网站,添加一个纯Html页面Default.htm,在页面上定义两个框架,如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>无标题页</title>
</head>
<frameset rows="30,80%">
<frame name="Input" marginwidth="0" marginheight="0" src="Input.aspx" scrolling="no"/>
<frame name="Output" src="Output.aspx" scrolling="no" />
</frameset>
<body>
</body>
</html>

二、 在添加一个输入的aspx页面:Input.aspx。在页面上放置一个DropDownList,命名为DDL_Time,和一个Button命名为BN_Query,在cs文件中写下面代码:

using System.Collections;
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.Text;
using System;
public partial class Input : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DDL_Time.Items.Add("20080415");
            DDL_Time.Items.Add("20080416");
            DDL_Time.SelectedIndex = 0;
        }
    }
    protected void BN_Query_Click(object sender, EventArgs e)
    {
        Location("Output.aspx?Time=" + DDL_Time.SelectedItem.ToString());
    }
    /**/
    /// <summary>
    /// 页面重载
    /// </summary>
    public void Location(string sPath)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("<script language=\"javascript\"> \n");
        sb.Append("parent.frames[‘Output‘].location.href=‘" + sPath + "‘;");
        sb.Append("</script>");
        System.Web.HttpContext.Current.Response.Write(sb.ToString());
    }
}

三、再做一个Excel报表的模板,命名为Nomalr.xls,建一个简单的数据库,结构如下:

  四、 在添加一个输出的aspx页面:Output.aspx,在页面上放置一个label,来显示input框架传递过来的参数,在cs文件中添加代码如下:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
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 Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;
using System.Data.OleDb;
using System.IO;
using System.Diagnostics;
public partial class Output : System.Web.UI.Page
{
    OleDbConnection Olecn;
    OleDbCommand OleCamm;
    DataTable DT = new DataTable();
    private string StrTime = "";
    protected void Page_Load(object sender, EventArgs e)
    {
        //接收Input框架传递的参数
        if (!IsPostBack)
        {
            StrTime = Request.QueryString["Time"];
            if (StrTime != null)
                Label1.Text = "时间:" + StrTime;
        }
        //在页面加载的时候将数据取出
        if (ConnectionDataBase())
        {
            OleCamm = new OleDbCommand();
            OleCamm.Connection = Olecn;
            Olecn.Open();
            OleCamm.CommandText = "select * from pl where date = " + "‘" + StrTime + "‘";
            OleDbDataAdapter OleDAdp = new OleDbDataAdapter(OleCamm);
            OleDAdp.Fill(DT);
            Olecn.Close();
        }
        Exceltest();
    }
    /**/
    /// <summary>
    /// 连接数据库
    /// </summary>
    /// <returns></returns>
    private bool ConnectionDataBase()
    {
        try
        {
            string DataSource = Server.MapPath("~") + "\\App_Data\\Excel.mdb";
            Olecn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DataSource);
            Olecn.Open();
        }
        catch (Exception e1)
        {
            Response.Write(e1.Message);
            return false;
        }
        finally
        {
            Olecn.Close();
        }
        return true;
    }
    /**/
    /// <summary>
    /// 对Excel的操作
    /// </summary>
    private void Exceltest()
    {
        //在创建Excel Application前先将已经打开的Excel资源释放掉
        EndExcelProcesse();
        //指定模板文件
        FileInfo mode = new FileInfo(Server.MapPath("~") + "\\Nomarl.xls");
        //打开复制后的文件X
        object missing = Missing.Value;
        Excel.Application myExcel = new Excel.Application();
        //打开模板文件
        myExcel.Application.Workbooks.Open(mode.FullName, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
        //选中有数据的Cells
        Excel.Workbook myBook = myExcel.Workbooks[1];
        Excel.Worksheet mySheet = (Excel.Worksheet)myBook.Worksheets[1];
        Excel.Range r = mySheet.get_Range(mySheet.Cells[1, 1], mySheet.Cells[DT.Rows.Count + 2, DT.Columns.Count - 3]);
        r.Select();
        //不单独显示Excel,最后在IE中显示
        myExcel.Visible = false;
        //第一行为报表的标题
        myExcel.Cells[1, 1] = "用模板导出的报表";
        //逐行写入数据,数组中第一行为报表的列标题
        for (int i = 0; i < DT.Columns.Count - 3; i++)
        {
            myExcel.Cells[2, 1 + i] = DT.Columns[i].Caption; ;
        }
        //为报表填充数据并设置显示上下标格式
        for (int i = 0; i < DT.Rows.Count; i++)
        {
            for (int j = 0; j < DT.Columns.Count - 4; j++)
            {
                myExcel.Cells[3 + i, 1 + j] = DT.Rows[i][j];
            }
            string a = DT.Rows[i][DT.Columns.Count - 4].ToString();
            string b = DT.Rows[i][DT.Columns.Count - 3].ToString();
            string c = DT.Rows[i][DT.Columns.Count - 2].ToString();
            myExcel.Cells[3 + i, DT.Columns.Count - 3] = a + b + c;
            //控制输出样式为下标
            mySheet.get_Range(mySheet.Cells[i + 3, DT.Columns.Count - 3], mySheet.Cells[i + 3, DT.Columns.Count - 3]).get_Characters(a.Length + 1, b.Length).Font.Subscript = true;
            //控制输出样式为上标
            mySheet.get_Range(mySheet.Cells[i + 3, DT.Columns.Count - 3], mySheet.Cells[i + 3, DT.Columns.Count - 3]).get_Characters(a.Length + b.Length + 1, c.Length).Font.Superscript = true;
            mySheet.Columns.AutoFit();
        }
        //在当前目录下指定一个临时文件
        string FileName = Server.MapPath("~") + "\\Temp.xls";
        if (File.Exists(FileName))
        {
            File.Delete(FileName);
        }
        myExcel.Save(FileName);
        mySheet.Cells.Clear();
        //设置不出现保存提示框
        myBook.Saved = true;
        myExcel.Application.Workbooks.Close();
        //将Excel文件嵌入在IE里面,也可以在aspx页面用
        //< iframe id="myExcelHtml" src ="E:\\练习\\excell\\WebSite2\\Temp.xls" width= "100%" height="100%" runat ="server"></iframe>
        //标签来嵌入
        Response.ClearContent();
        Response.ClearHeaders();
        Response.ContentType = "application/vnd.ms-excel";
        Response.AddHeader("Content-Disposition", "inline;filename=‘我的文件‘");
        Response.WriteFile(FileName);
        Response.Flush();
        Response.Close();
    }
    /**/
    /// <summary>
    /// 当报表数据更新时,先强制结束前一个报表的数据源
    /// 这种方法会同时杀死掉用户的excel进程
    /// </summary>
    protected void EndExcelProcesse()
    {
        try
        {
            Process[] myProcesses = Process.GetProcessesByName("excel");
            foreach (Process instance in myProcesses)
            {
                instance.Kill();   //强制终止
            }
        }
        catch { }
        //在网上查的用下面的方法结束Excel进程表较好,但一直没有效果
        //try
        //{
        //    System.Runtime.InteropServices.Marshal.ReleaseComObject(r);
        //    System.Runtime.InteropServices.Marshal.ReleaseComObject(mySheet);
        //    System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook);
        //    System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);
        //    myBook = null;
        //    mySheet = null;
        //    myExcel = null;
        //    r = null;
        //    GC.Collect();
        //}
        //catch { }
    }
}

运行后的结果:

ps:

1、这篇文章是转载的,原作者是谁我也不记得了,

2、原文排版有问题,所以重新整理下。

时间: 2024-12-14 19:26:29

web页面嵌入excel(一)的相关文章

Microsoft.Office.Interop.Excel的用法以及利用Microsoft.Office.Interop.Excel将web页面转成PDF

1.常见用法           using Microsoft.Office.Interop.Excel; 1)新建一个Excel ApplicationClass ExcelApp = New ApplicationClass();    Microsoft.Office.Interop.Excel.Workbook book = ExcelApp.Workbooks.Add(); 2) 更改 Excel 标题栏: ExcelApp.Caption := '应用程序调用 Micr

web页面导出到Excel乱码解决

引言: 前几天 在做web项目的时候 需要导出页面上的数据 到Excel里面 但有的时候出现乱码(有de时候不出现 很奇怪) 原来的代码是这样的: HttpContext.Current.Response.Clear(); HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=FileName.xls"); HttpContext.Current.Resp

php与web页面交互(二)

一.获取表单数据 1.1 使用POST()方法提交表单  ---POST()方法可以没有限制地传递数据到服务器,所提交的数据在后台传输,用户在浏览器端是看不到这一过程的,安全性高,适用于发送保密数据和大容量数据到服务器. 范例: 1 <form name="form1" method="post" action="index2.php"> 2 <table border="1" width="400

基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作

在前面介绍了很多篇相关的<Bootstrap开发框架>的系列文章,这些内容基本上覆盖到了我这个Bootstrap框架的各个主要方面的内容,总体来说基本达到了一个稳定的状态,随着时间的推移可以会引入一些更好更新的内容进行完善,本篇继续这个系列,主要介绍如何实现Web页面内容的打印预览和保存操作. 1.Web页面打印的问题 在此之前,我一般使用比较好用的LODOP来执行打印的操作,这个在我之前有很多文章都有涉及,这个控件是一个ActiveX的控件,需要下载安装后就可以在页面是进行打印的排版设计,预

将flex页面嵌入到jsp页面中

如果我们只需要用到Flex的一部分功能,例如播放器功能,我们可以单独把Flex页面嵌入到Jsp页面中.要想实现此功能,需要下载一个工程,将其覆盖在服务器根目录下即可.你可以在次下载:FlexModule_j2ee.zip. 在eclipse下新建一个web工程,将刚才下载的工程解压缩,然后将webtier文件夹下的内容覆盖服务器根目录下,如本人的: 注意要将lib文件夹和jars文件夹下的jar包添加到到类路径下,这样就算是整合完成了吧. 接着新建一个flex的mxml文件PlayVideo.m

Java与Flex学习笔记(20)---将flex页面嵌入到jsp页面中

如果我们只需要用到Flex的一部分功能,例如播放器功能,我们可以单独把Flex页面嵌入到Jsp页面中.要想实现此功能,需要下载一个工程,将其覆盖在服务器根目录下即可.你可以在次下载:FlexModule_j2ee.zip. 在eclipse下新建一个web工程,将刚才下载的工程解压缩,然后将webtier文件夹下的内容覆盖服务器根目录下,如本人的: 注意要将lib文件夹和jars文件夹下的jar包添加到到类路径下,这样就算是整合完成了吧. 接着新建一个flex的mxml文件PlayVideo.m

一个网站的诞生08-- 在Web App嵌入地图

LBS-Location Based Service,基于位置的服务.如果要在Web App嵌入地图,差不多可以做成LBS了.zuijiancanting.com的设计理念,是把Top餐厅放在地图上,那么当你到某个地方逛逛,或者有约会,拖拉一下地图就可以找到合适的餐厅. 提供地图API服务的公司很多,国外有GoogleMap,OpenStreetMap,国内有百度地图,腾讯地图,高德地图.GoogleMap由于某些原因不能正常使用,不在选择之列.我最先考虑的是OpenStreetMap,因为除了

web页面中可以包含多个对象

# encoding=utf-8 #python 2.7.10 #xiaodeng #web页面中可以包含多个对象 #HTTP权威指南 10页 #应用程序完成一项任务时通常会发布多个http事务.如:web浏览器会发布一系列http事务来获取一个包含了丰富的图片的web页面. #http事务怎么运作呢? 1.执行一个事务来获取描述页面布局的html框架 2.然后发布另外的http事务来获取嵌入的图片.图像.java小程序.这些资源可能在不同的服务器上. 因此: 一个web页面不是单个资源,通常是

base64:URL背景图片与web页面性能优化

一.base64百科 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息. 某人: 唉,我彻底废柴了,为何上面明明是中文,洒家却看不懂嘞,为什么? 好吧,我也不喜欢专业术语的解释.你只要知道,base64编码就是长得像下面这样子的代码: thunder://QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg== 上面代码大家都熟悉吧,迅雷下载链接哦(咳咳,该地址很纯洁),就