惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
J
Java Code Geeks
L
LangChain Blog
V
V2EX
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
博客园 - Franky
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
博客园 - 司徒正美
B
Blog
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
Engineering at Meta
Engineering at Meta
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog

博客园 - lemontree

SQL SERVER学习计划 新的开始 C#.NET禁止一个程序启动多个实例 - lemontree - 博客园 MDI窗体,子窗体在父窗体中最大化,如果子窗体已经打开则显示,不重复打开窗体 winform里c#验证用户正确后 怎么打开新窗口时关闭登陆窗口 Are You Going To Scarborough Fair中文歌词 安装VS2005 SP1失败 (转载)浅析HTTP协议 (转载)你是合格的程序员吗?—合格程序员应该具备的12种能力 夯实基础,从HTML开始 SQLserver2000〔Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server不存在或访问被拒绝 压缩数据库日志文件 RDLC报表(一) .net 2.0 Configuration Error 浅谈ASP.NET的内部机制(一) seo专题之开篇有益 引用Microsoft.Office.Interop.Excel出现的问题 OWC生成Excel的效能优化 妇女节各人的不同回复
[转载]OWC做电子表格和图表的试验
lemontree · 2009-03-16 · via 博客园 - lemontree

转载自:http://www.cnblogs.com/salonliudong/archive/2008/05/23/1206180.html 原作者:salonliudong

连续这么多天持续写SQL,晚上找资料研究一下Microsoft Office Web Components(续上一篇Excel的文章)调节一下自己,和上一篇文章的主题一样,这篇主要研究OWC做报表的方法。先看一下示例的效果:


 

   一、主要内容:

1、 OWC组件在web页面展示的几种方法。

2、 OWC数据的填充。

3、 OWC显示格式的设置。

4、 OWC中的电子表格类中填充数据的方法。

5、 OWC中显示数据格式的控制。

二、要点总结:

1、 OWC组件在web页面展示的方法。

A、将数据导出成Excel临时文件,再将临时文件呈现到Web页面,代码如下:

B、 不导出到本地临时文件,直接从内存加载到Web页面,代码如下:

       A、B效果如图


 

C、标签:

<object id="Spreadsheet1" classid="clsid:0002E559-0000-0000-C000-000000000046" name="Spreadsheet1">

       效果如图:

      2、在OWC中的电子表格类中填充数据的方法:

OWC11.SpreadsheetClass Sheet = new OWC11.SpreadsheetClass();
//第一行为报表的标题
        Sheet.ActiveCell[11= "报表的标题";

        
//逐行写入数据,数组中第一行为报表的列标题
        for (int i = 0; i < DT.Columns.Count - 3; i++)
        
{
            Sheet.Cells[
21 + i] = DT.Columns[i].Caption; ;
        }

        
        
//为报表填充数据并设置显示上下标格式
        for (int i = 0; i < DT.Rows.Count; i++)
        
{
            
for (int j = 0; j < DT.Columns.Count - 4; j++)
            
{
                Sheet.ActiveCell[
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();
            Sheet.ActiveCell[
3 + i,DT.Columns.Count - 3= a + b + c;
            Sheet.Columns.AutoFit();
    }

3、    OWC中数据显示格式的控制(没找到控制上下标格式数据的方法):
以下是对输出Excel的格式控制 以下是对输出Excel的格式控制
        
//标题行合并单元格
        Sheet.get_Range(Sheet.Cells[11], Sheet.Cells[1, DT.Columns.Count - 3]).set_MergeCells(true);
        
//标题行水平居中
        Sheet.get_Range(Sheet.Cells[11], Sheet.Cells[11]).set_HorizontalAlignment(OWC11.XlHAlign.xlHAlignCenter);
        
//标题行加粗字体
        Sheet.get_Range(Sheet.Cells[11], Sheet.Cells[11]).Font.set_Bold(true);
        
//设置字体大小   
        Sheet.get_Range(Sheet.Cells[11], Sheet.Cells[11]).Font.set_Size(14);
        
//画边线
        Sheet.get_Range(Sheet.Cells[11], Sheet.Cells[DT.Rows.Count + 2, DT.Columns.Count - 3]).Borders.set_LineStyle(OWC11.XlLineStyle.xlContinuous);
#endregion

     运行效果如下:

   3、图表ChartSpace类的例子,网上比较多,直接看综合示例,就不另作说明了。

三、综合示例:

  注释很全,就不加说明了。

         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 System.Reflection;
using System.Data.OleDb;
using System.IO;
using System.Diagnostics;
//using OWC11 = Microsoft.Office.Interop.Owc11;

public partial class Output : System.Web.UI.Page
{
    
//取数据的全局变量
    OleDbConnection Olecn;
    OleDbCommand OleCamm;
    DataTable DT 
= new DataTable();

    
//实例化OWC11
    OWC11.SpreadsheetClass Sheet = new OWC11.SpreadsheetClass();

    
//跨框架传参用
    private String StrTime = "";

    
//导出电子表格的全路径
    public String FileName;

    
//导出图片的全路径
    public String PicPath;

    
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();
        ChartsTest();
    }

    
    
/// <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>
    
/// OWC中SpreadsheetClass类的操作 
    
/// </summary>

    private void Exceltest()

    
{
        
//将已经打开的Excel资源释放掉
        EndExcelProcesse();

        
//第一行为报表的标题
        Sheet.ActiveCell[11= "报表的标题栏";

        
//逐行写入数据,报表的列标题
        for (int i = 0; i < DT.Columns.Count - 3; i++)
        
{
            Sheet.Cells[
21 + i] = DT.Columns[i].Caption; ;
        }

        
        
//为报表填充数据
        for (int i = 0; i < DT.Rows.Count; i++)
        
{
            
for (int j = 0; j < DT.Columns.Count - 4; j++)
            
{
                Sheet.ActiveCell[
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();
            Sheet.ActiveCell[
3 + i,DT.Columns.Count - 3= a + b + c;
            Sheet.Columns.AutoFit();
        }


以下是对输出Excel的格式控制 以下是对输出Excel的格式控制
        
//标题行合并单元格
        Sheet.get_Range(Sheet.Cells[11], Sheet.Cells[1, DT.Columns.Count - 3]).set_MergeCells(true);
        
//标题行水平居中
        Sheet.get_Range(Sheet.Cells[11], Sheet.Cells[11]).set_HorizontalAlignment(OWC11.XlHAlign.xlHAlignCenter);
        
//标题行加粗字体
        Sheet.get_Range(Sheet.Cells[11], Sheet.Cells[11]).Font.set_Bold(true);
        
//设置字体大小   
        Sheet.get_Range(Sheet.Cells[11], Sheet.Cells[11]).Font.set_Size(14);
        
//画边线
        Sheet.get_Range(Sheet.Cells[11], Sheet.Cells[DT.Rows.Count + 2, DT.Columns.Count - 3]).Borders.set_LineStyle(OWC11.XlLineStyle.xlContinuous);
        
#endregion


        FileName 
= Server.MapPath("~"+ """Temp.html";
        
if (File.Exists(FileName))
        
{
            File.Delete(FileName);
        }

        
//将Sheet导出成html格式的数据,在前台页面显示用
        Sheet.Export(FileName, OWC11.SheetExportActionEnum.ssExportActionNone, OWC11.SheetExportFormat.ssExportHTML);
        
/*
         * 可以直接用下面两种方法在页面上显示,用下面的方式显示时,导出的文件格式为:.xls
        Response.ClearContent();
        Response.ClearHeaders();
        Response.ContentType = "application/vnd.ms-excel";
        Response.AddHeader("Content-Disposition", "inline;filename='我的文件'");
        Response.WriteFile(FileName);
        Response.Flush();
        Response.Close();

        Response.Clear();
        Response.Buffer = true;
        Response.ContentEncoding = System.Text.Encoding.Default;
        //Response.Charset = "utf-8";
        Response.ContentType = "application/vnd.ms-excel";
        Response.Write(Sheet.HTMLData);
        this.EnableViewState = false; 
        Response.End();
        
*/


    }


    
/// <summary>
    
/// 绘制图表
    
/// </summary>

    private void ChartsTest()
    
{
        
//创建ChartSpace对象来放置图表
        OWC11.ChartSpace objCSpace = new OWC11.ChartSpaceClass();

        
//在ChartSpace对象中添加图表,Add方法返回chart对象
        OWC11.ChChart objChart = objCSpace.Charts.Add(0);

        
//指定图表的类型。类型由OWC11.ChartChartTypeEnum枚举值得到
        objChart.Type = OWC11.ChartChartTypeEnum.chChartTypeColumnClustered;

        
//指定图表是否需要图例
        objChart.HasLegend = true;

        
//给定标题
        objChart.HasTitle = true;
        objChart.Title.Caption 
= "柱状图";

        
//给定x,y轴的图示说明
        objChart.Axes[0].HasTitle = true;
        objChart.Axes[
0].Title.Caption = "X: 数量";
        objChart.Axes[
1].HasTitle = true;
        objChart.Axes[
1].Title.Caption = "Y: 月份";

        
//计算数据
        /*categories 和 values 可以用tab分割的字符串来表示*/
        
string strSeriesName = "图例 1";
        
string strCategory = "1" + '"t' + "2" + '"t' + "3" + '"t' + "4" + '"t' + "5" + '"t' + "6" + '"t';
        
string strValue = "9" + '"t' + "8" + '"t' + "4" + '"t' + "10" + '"t' + "12" + '"t' + "6" + '"t';

        
//添加一个series
        objChart.SeriesCollection.Add(0);

        
//图例
        objChart.SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimSeriesNames, (int)OWC11.ChartSpecialDataSourcesEnum.chDataLiteral, strSeriesName);

        
//X轴
        objChart.SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimCategories, (int)OWC11.ChartSpecialDataSourcesEnum.chDataLiteral, strCategory);

        
//柱面
        objChart.SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimValues, (int)OWC11.ChartSpecialDataSourcesEnum.chDataLiteral, strValue);
        
//输出成图片文件.
        PicPath = Server.MapPath("~"+ """test.htm";
        objCSpace.ExportPicture(PicPath, 
"jpg"600350);

        
//FileStream fs = new FileStream(PicPath, FileMode.Open, FileAccess.Read);
        
//byte[] bytes = new byte[fs.Length];
        
//fs.Read(bytes, 0, bytes.Length);
        
//fs.Close();
        
//MemoryStream ms = new MemoryStream(bytes);

        
//System.Drawing.Image img = System.Drawing.Image.FromStream(ms);

        
//Response.ContentType = "image/jpg";
        
//Response.Write(img);
        
//Response.Write("<img src="+PicPath +"/>");
    }



    
/// <summary>
    
/// 当报表数据更新时,先强制结束前一个报表的数据源
    
/// 这种方法会同时杀死掉用户的excel进程
    
/// </summary>

    protected void EndExcelProcesse()
    
{
        
try
        
{
            Process[] myProcesses 
= Process.GetProcessesByName("excel");
            
foreach (Process instance in myProcesses)
            
{
                instance.Kill(); 
//强制终止    
            }

        }

        
catch { }
    }

    
/*
     * 用Response.Write在页面显示时,页面卸载时删除.xls文件
    protected void Page_UnLoad(object sender, EventArgs e)
    {
        EndExcelProcesse();
        string FileName = Server.MapPath("~") + """Temp.xls";
        if (File.Exists(FileName))
        {
            File.Delete(FileName);
        }
    }
    
*/

}

    ASPX文件:

    四、缺点:

      客户端必须安装 Microsoft Office Web Components,它可随 Office 2003 一起安装,如果用户的公司具有 Office 2003 站点许可证,则可以通过公司的 Intranet   下载 Office Web 组件,用户还必须使用 Microsoft Internet Explorer 5.01 (Service Pack 2) 或更高版本。

      如需示例源代码,请留言索取!