连续这么多天持续写SQL,晚上找资料研究一下Microsoft Office Web Components(续上一篇Excel的文章)调节一下自己,和上一篇文章的主题一样,这篇主要研究OWC做报表的方法。先看一下示例的效果:
一、主要内容:
1、 OWC组件在web页面展示的几种方法。
2、 OWC数据的填充。
3、 OWC显示格式的设置。
4、 在OWC中的电子表格类中填充数据的方法。
5、 OWC中显示数据格式的控制。
二、要点总结:
1、 OWC组件在web页面展示的方法。
A、将数据导出成Excel临时文件,再将临时文件呈现到Web页面,代码如下:
Sheet.Export(FileName, OWC11.SheetExportActionEnum.ssExportActionNone, OWC11.SheetExportFormat.ssExportHTML);//Sheet为OWC11中SpreadsheetClass类的对象
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", "inline;filename='我的文件'");
Response.WriteFile(FileName);
Response.Flush();
Response.Close();

B、 不导出到本地临时文件,直接从内存加载到Web页面,代码如下:
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();

C、标签:
<object id="Spreadsheet1" classid="clsid:0002E559-0000-0000-C000-000000000046" name="Spreadsheet1">
效果如图:
2、在OWC中的电子表格类中填充数据的方法:
OWC11.SpreadsheetClass Sheet = new OWC11.SpreadsheetClass();
//第一行为报表的标题
Sheet.ActiveCell[1, 1] = "报表的标题";

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

{
Sheet.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++)

{
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的格式控制#region 以下是对输出Excel的格式控制
//标题行合并单元格
Sheet.get_Range(Sheet.Cells[1, 1], Sheet.Cells[1, DT.Columns.Count - 3]).set_MergeCells(true);
//标题行水平居中
Sheet.get_Range(Sheet.Cells[1, 1], Sheet.Cells[1, 1]).set_HorizontalAlignment(OWC11.XlHAlign.xlHAlignCenter);
//标题行加粗字体
Sheet.get_Range(Sheet.Cells[1, 1], Sheet.Cells[1, 1]).Font.set_Bold(true);
//设置字体大小
Sheet.get_Range(Sheet.Cells[1, 1], Sheet.Cells[1, 1]).Font.set_Size(14);
//画边线
Sheet.get_Range(Sheet.Cells[1, 1], 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[1, 1] = "报表的标题栏";

//逐行写入数据,报表的列标题
for (int i = 0; i < DT.Columns.Count - 3; i++)

{
Sheet.Cells[2, 1 + i] = DT.Columns[i].Caption; ;
}
//为报表填充数据
for (int i =